117 lines
2.1 KiB
Go
117 lines
2.1 KiB
Go
package document
|
|
|
|
import (
|
|
"context"
|
|
"gotemplate/internal/database"
|
|
"gotemplate/internal/database/repository"
|
|
"log"
|
|
|
|
"github.com/google/uuid"
|
|
)
|
|
|
|
type Service struct {
|
|
db *repository.Queries
|
|
}
|
|
|
|
type Document struct {
|
|
ID uuid.UUID `json:"id"`
|
|
JobID uuid.UUID `json:"jobId"`
|
|
Name string `json:"name"`
|
|
}
|
|
|
|
type QueryType int
|
|
|
|
const (
|
|
QueryTypeJsonExtractor = iota
|
|
)
|
|
|
|
type query struct {
|
|
ID uuid.UUID
|
|
Type QueryType
|
|
RequiredQueryID uuid.UUID
|
|
Version int
|
|
}
|
|
|
|
func New(ctx context.Context, db *repository.Queries) *Service {
|
|
return &Service{
|
|
db: db,
|
|
}
|
|
}
|
|
|
|
func (s *Service) Sync(ctx context.Context, doc Document) error {
|
|
queries, err := s.getUnsyncedOrderedQueries(ctx, doc)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
err = s.executeQueries(queries)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
return nil
|
|
}
|
|
|
|
func (s *Service) getUnsyncedOrderedQueries(ctx context.Context, doc Document) ([]query, error) {
|
|
jobID, err := database.ToDBUUID(doc.JobID)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
collector, err := s.db.GetCollectorFromJobID(ctx, jobID)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
queries, err := s.db.GetCollectorQueries(ctx, collector.ID)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
docID, err := database.ToDBUUID(doc.ID)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
results, err := s.db.ListResultsByDocumentID(ctx, repository.ListResultsByDocumentIDParams{
|
|
Documentid: docID,
|
|
Textversion: collector.Mintextversion,
|
|
Cleanversion: collector.Mincleanversion,
|
|
})
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
queue := []query{}
|
|
|
|
for _, query := range queries {
|
|
isSynced := false
|
|
for _, result := range results {
|
|
if result.Queryid != query.Queryid || int(result.Queryversion) != int(query.Queryversion.Int32) {
|
|
continue
|
|
}
|
|
isSynced = true
|
|
break
|
|
}
|
|
if isSynced {
|
|
continue
|
|
}
|
|
// TODO add query to beginning, add all dependents until one that is already in the queue
|
|
}
|
|
|
|
return queue, nil
|
|
}
|
|
|
|
func (s *Service) executeQueries(queries []query) error {
|
|
// TODO - get all results?
|
|
|
|
for _, query := range queries {
|
|
log.Print(query)
|
|
// TODO - get required field
|
|
// execute query
|
|
// store result fully
|
|
}
|
|
|
|
return nil
|
|
}
|