Files
query-orchestration/api/docInitRunner/runner.go
T
Michael McGuinness 90353d8161 Merged in feature/docclean (pull request #55)
Doc Clean Structure

* outline

* isdocclean

* placeholder for clean log

* versionplustesting

* versionplustesting

* testspassed
2025-02-07 12:12:51 +00:00

115 lines
2.3 KiB
Go

package docinitrunner
import (
"context"
"encoding/json"
"errors"
"fmt"
"log/slog"
"queryorchestration/internal/document"
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 S3Bucket struct {
Name string `json:"name"`
Arn string `json:"arn"`
}
type S3Object struct {
Key string `json:"key"`
Size int64 `json:"size"`
ETag string `json:"eTag"`
VersionId string `json:"versionId"`
}
type S3EventRecordDetails struct {
Bucket S3Bucket `json:"bucket"`
Object S3Object `json:"object"`
}
type S3EventRecord struct {
EventVersion string `json:"eventVersion"`
EventSource string `json:"eventSource"`
AwsRegion string `json:"awsRegion"`
EventTime string `json:"eventTime"`
EventName string `json:"eventName"`
S3 S3EventRecordDetails `json:"s3"`
}
type S3EventNotification struct {
Records []S3EventRecord `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: document.Location{
Bucket: record.S3.Bucket.Name,
Key: record.S3.Object.Key,
},
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
}