package docinitrunner import ( "context" "encoding/json" "errors" "fmt" "log/slog" documentinit "queryorchestration/internal/document/init" "github.com/go-playground/validator/v10" "github.com/aws/aws-sdk-go-v2/service/sqs/types" ) const Name = "docInitRunner" type Services struct { Document *documentinit.Service } type Runner struct { validator *validator.Validate svc *Services } func New(validator *validator.Validate, svc *Services) Runner { return Runner{ validator: validator, svc: svc, } } type S3EventNotification struct { Records []struct { EventVersion string `json:"eventVersion"` EventSource string `json:"eventSource"` AwsRegion string `json:"awsRegion"` EventTime string `json:"eventTime"` EventName string `json:"eventName"` S3 struct { Bucket struct { Name string `json:"name"` Arn string `json:"arn"` } `json:"bucket"` Object struct { Key string `json:"key"` Size int64 `json:"size"` ETag string `json:"eTag"` VersionId string `json:"versionId"` } `json:"object"` } `json:"s3"` } `json:"Records"` } func (s Runner) Process(ctx context.Context, req *types.Message) error { var body S3EventNotification err := json.Unmarshal([]byte(*req.Body), &body) if err != nil { return err } err = s.validator.Struct(body) if err != nil { return err } hasErr := false for _, record := range body.Records { err := func() error { if record.EventName != "ObjectCreated:Put" { return fmt.Errorf("invalid event name: %s", record.EventName) } jobID, err := s.svc.Document.GetJobIDFromKey(record.S3.Object.Key) if err != nil { return err } _, err = s.svc.Document.Create(ctx, &documentinit.Create{ JobID: jobID, Location: record.S3.Object.Key, Bucket: record.S3.Bucket.Name, Hash: record.S3.Object.ETag, }) if err != nil { return err } return nil }() if err != nil { hasErr = true slog.Error("Error processing record", "err", err) } } if hasErr { return errors.New("error processing records") } return nil }