package documentupload import ( "context" "io" "time" "queryorchestration/internal/database/repository" "queryorchestration/internal/serviceconfig/objectstore" "github.com/aws/aws-sdk-go-v2/service/s3" "github.com/google/uuid" "github.com/jackc/pgx/v5/pgtype" ) type File struct { ClientID string Content io.Reader } func (s *Service) Upload(ctx context.Context, file File) error { return s.cfg.ExecuteDBTransaction(ctx, func(ctx context.Context, q *repository.Queries) error { now := time.Now().UTC() part, err := s.cfg.GetDBQueries().GetDocumentUploadCurrentPart(ctx, &repository.GetDocumentUploadCurrentPartParams{ Clientid: &file.ClientID, Querydate: pgtype.Timestamptz{ Valid: true, Time: now, }, }) if err != nil { return err } uploadId := uuid.New() newPart := s.cfg.GetDirectoryPart(part.Part, part.Count) key := objectstore.BucketKey{ ClientID: file.ClientID, Location: objectstore.Import, CreatedAt: now, EntityID: uploadId, Part: &newPart, } keyStr := key.String() bucket := s.cfg.GetBucket() err = q.AddDocumentUpload(ctx, &repository.AddDocumentUploadParams{ ID: uploadId, Clientid: file.ClientID, Bucket: bucket, Key: keyStr, Part: newPart, Createdat: pgtype.Timestamp{ Valid: true, Time: now, }, }) if err != nil { return err } _, err = s.cfg.GetStoreClient().PutObject(ctx, &s3.PutObjectInput{ Bucket: &bucket, Key: &keyStr, Body: file.Content, }) if err != nil { return err } return nil }) }