Files
query-orchestration/internal/document/text/triggerExtract.go
T
Michael McGuinness 81e7223560 Merged in feature/textextraction (pull request #110)
Text Extraction

* bases

* go

* splitting

* structure

* movetoasync

* movetoasync

* settinguptrigger

* reorder

* storevent

* standardisepollingvalidation

* unittests

* fixlint

* fixlint

* awscfg

* generatesample

* followthrough

* tests

* clena

* store

* externalidcleanup

* clientid

* local

* baseunittests

* putobjecttests

* tests
2025-04-02 18:50:03 +00:00

93 lines
2.4 KiB
Go

package documenttext
import (
"context"
"errors"
"fmt"
"regexp"
"queryorchestration/internal/client"
"queryorchestration/internal/database/repository"
"queryorchestration/internal/serviceconfig/build"
"github.com/aws/aws-sdk-go-v2/service/textract"
"github.com/aws/aws-sdk-go-v2/service/textract/types"
"github.com/google/uuid"
)
func (s *Service) triggerExtract(ctx context.Context, clean *repository.Currentcleanentry) error {
version := build.GetVersionUnixTimestamp()
return s.cfg.ExecuteDBTransaction(ctx, func(ctx context.Context, q *repository.Queries) error {
triggerId, err := s.cfg.GetDBQueries().AddDocumentTextTrigger(ctx, &repository.AddDocumentTextTriggerParams{
Cleanid: clean.ID,
Version: version,
})
if err != nil {
return err
}
jobTag := triggerId.String()
key, err := s.getOutputLocation(clean.Clientid, triggerId)
if err != nil {
return err
}
res, err := s.cfg.GetTextractClient().StartDocumentTextDetection(ctx, &textract.StartDocumentTextDetectionInput{
DocumentLocation: &types.DocumentLocation{
S3Object: &types.S3Object{
Bucket: clean.Bucket,
Name: clean.Key,
},
},
JobTag: &jobTag,
OutputConfig: &types.OutputConfig{
S3Bucket: clean.Bucket,
S3Prefix: &key,
},
})
if err != nil {
return err
} else if res.JobId == nil {
return errors.New("No job id returned from textract")
}
err = s.cfg.GetDBQueries().AddDocumentTextTriggerJobId(ctx, &repository.AddDocumentTextTriggerJobIdParams{
ID: triggerId,
Textractjobid: res.JobId,
})
if err != nil {
return err
}
return nil
})
}
func (s *Service) getOutputLocation(clientId string, triggerId uuid.UUID) (string, error) {
if clientId == "" {
return "", errors.New("client id required")
} else if triggerId == uuid.Nil {
return "", errors.New("trigger id required")
}
return fmt.Sprintf("%s/text/textract/%s", clientId, triggerId), nil
}
func (s *Service) getTriggerIdFromKey(key string) (uuid.UUID, error) {
regexPattern := fmt.Sprintf(`^%s/text/textract/([0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12})$`, client.CLIENT_ID_REGEX)
re := regexp.MustCompile(regexPattern)
match := re.FindStringSubmatch(key)
if len(match) < 2 {
return uuid.Nil, errors.New("Trigger Id not found")
}
triggerId, err := uuid.Parse(match[1])
if err != nil {
return uuid.Nil, err
}
return triggerId, nil
}