package docinitrunner import ( "context" "database/sql" "errors" "log/slog" "queryorchestration/internal/database/repository" documentinit "queryorchestration/internal/document/init" "queryorchestration/internal/serviceconfig/objectstore" ) const Name = "docInitRunner" type Services struct { Document *documentinit.Service Queries *repository.Queries } type Runner struct { svc *Services } func New(svc *Services) Runner { return Runner{ svc: svc, } } type Body struct { Bucket string `json:"bucket" validate:"required"` Key string `json:"key" validate:"required"` Hash string `json:"hash" validate:"required"` } func (s Runner) Process(ctx context.Context, body Body) bool { key, err := objectstore.ParseBucketKey(body.Key) if err != nil { slog.Error("unable to parse key", "key", body.Key) return false } // Get filename from documentUploads table var filename *string upload, err := s.svc.Queries.GetDocumentUploadByKey(ctx, &repository.GetDocumentUploadByKeyParams{ Bucket: body.Bucket, Key: body.Key, }) if err != nil && !errors.Is(err, sql.ErrNoRows) { slog.Error("unable to get document upload", "bucket", body.Bucket, "key", body.Key, "error", err) return false } if err == nil && upload.Filename != nil { filename = upload.Filename } id, err := s.svc.Document.Create(ctx, &documentinit.Create{ Key: key, Bucket: body.Bucket, Hash: body.Hash, Filename: filename, }) if err != nil { return false } slog.Debug("created document", "id", id, "filename", filename) return true }