Files
Jay Brown c45e1dd427 Merged in feature/textExtractionsPart1 (pull request #192)
all schema and rest apis for text extraction support

* in progress

* stage 8 complete

* phase 9 completed

* phase 9 complete

* ongoing - s3 path fix

* working

* optimize ci build

* e2e tests

* missing test
2025-11-26 19:23:42 +00:00

150 lines
4.5 KiB
Go

package label
import (
"context"
"fmt"
"queryorchestration/internal/database/repository"
"queryorchestration/internal/serviceconfig"
"github.com/google/uuid"
)
// Service provides label management operations
type Service struct {
cfg serviceconfig.ConfigProvider
}
// New creates a new label service instance
func New(cfg serviceconfig.ConfigProvider) *Service {
return &Service{
cfg: cfg,
}
}
// ApplyLabel applies a label to a document with timestamp tracking
// Can be called multiple times for the same document/label to track re-application history
func (s *Service) ApplyLabel(ctx context.Context, documentID uuid.UUID, label string, appliedBy string) (*repository.Documentlabel, error) {
if label == "" {
return nil, fmt.Errorf("label cannot be empty")
}
if appliedBy == "" {
return nil, fmt.Errorf("appliedBy cannot be empty")
}
result, err := s.cfg.GetDBQueries().ApplyLabel(ctx, &repository.ApplyLabelParams{
Documentid: documentID,
Label: label,
Appliedby: appliedBy,
})
if err != nil {
return nil, fmt.Errorf("failed to apply label: %w", err)
}
return result, nil
}
// GetDocumentLabels retrieves all label applications for a document
// Returns labels ordered by most recent application first
func (s *Service) GetDocumentLabels(ctx context.Context, documentID uuid.UUID) ([]*repository.Documentlabel, error) {
labels, err := s.cfg.GetDBQueries().GetDocumentLabels(ctx, documentID)
if err != nil {
return nil, fmt.Errorf("failed to get document labels: %w", err)
}
return labels, nil
}
// GetMostRecentLabel retrieves the most recent application of a specific label for a document
func (s *Service) GetMostRecentLabel(ctx context.Context, documentID uuid.UUID, label string) (*repository.Documentlabel, error) {
result, err := s.cfg.GetDBQueries().GetMostRecentLabel(ctx, &repository.GetMostRecentLabelParams{
Documentid: documentID,
Label: label,
})
if err != nil {
return nil, fmt.Errorf("label not found: %w", err)
}
return result, nil
}
// GetDocumentsByLabel retrieves all documents with a specific label for a client
func (s *Service) GetDocumentsByLabel(ctx context.Context, clientID string, label string) ([]*repository.Document, error) {
documents, err := s.cfg.GetDBQueries().GetDocumentsByLabel(ctx, &repository.GetDocumentsByLabelParams{
Clientid: clientID,
Label: label,
})
if err != nil {
return nil, fmt.Errorf("failed to get documents by label: %w", err)
}
return documents, nil
}
// GetDocumentsByLabelAndFolder retrieves all documents with a specific label in a specific folder
func (s *Service) GetDocumentsByLabelAndFolder(ctx context.Context, folderID uuid.UUID, label string) ([]*repository.Document, error) {
documents, err := s.cfg.GetDBQueries().GetDocumentsByLabelAndFolder(ctx, &repository.GetDocumentsByLabelAndFolderParams{
Folderid: &folderID,
Label: label,
})
if err != nil {
return nil, fmt.Errorf("failed to get documents by label and folder: %w", err)
}
return documents, nil
}
// GetAllLabels retrieves all available labels from the lookup table
func (s *Service) GetAllLabels(ctx context.Context) ([]*repository.Label, error) {
labels, err := s.cfg.GetDBQueries().GetAllLabels(ctx)
if err != nil {
return nil, fmt.Errorf("failed to get all labels: %w", err)
}
return labels, nil
}
// CreateLabel creates a new label in the lookup table
func (s *Service) CreateLabel(ctx context.Context, label string, description string) (*repository.Label, error) {
if label == "" {
return nil, fmt.Errorf("label cannot be empty")
}
if description == "" {
return nil, fmt.Errorf("description cannot be empty")
}
result, err := s.cfg.GetDBQueries().CreateLabel(ctx, &repository.CreateLabelParams{
Label: label,
Description: description,
})
if err != nil {
return nil, fmt.Errorf("failed to create label: %w", err)
}
return result, nil
}
// GetDocumentLabelHistory retrieves label application history for a client with pagination
func (s *Service) GetDocumentLabelHistory(ctx context.Context, clientID string, limit int32, offset int32) ([]*repository.GetDocumentLabelHistoryRow, error) {
if limit <= 0 {
return nil, fmt.Errorf("limit must be greater than 0")
}
if offset < 0 {
return nil, fmt.Errorf("offset cannot be negative")
}
history, err := s.cfg.GetDBQueries().GetDocumentLabelHistory(ctx, &repository.GetDocumentLabelHistoryParams{
Clientid: clientID,
Limit: int64(limit),
Offset: int64(offset),
})
if err != nil {
return nil, fmt.Errorf("failed to get label history: %w", err)
}
return history, nil
}