dukcapil/internal/processor/letter_validation_processor.go
2025-09-20 16:31:22 +07:00

71 lines
2.1 KiB
Go

package processor
import (
"context"
"errors"
"eslogad-be/internal/entities"
"github.com/google/uuid"
)
type LetterValidationProcessor interface {
ValidateCreateOutgoingLetter(ctx context.Context, letter *entities.LetterOutgoing) error
ValidateUpdateOutgoingLetter(ctx context.Context, letter *entities.LetterOutgoing, existingLetter *entities.LetterOutgoing) error
ValidateDeleteOutgoingLetter(ctx context.Context, letter *entities.LetterOutgoing) error
ValidateApprovalSubmission(ctx context.Context, letter *entities.LetterOutgoing) error
}
type LetterValidationProcessorImpl struct{}
func NewLetterValidationProcessor() *LetterValidationProcessorImpl {
return &LetterValidationProcessorImpl{}
}
func (p *LetterValidationProcessorImpl) ValidateCreateOutgoingLetter(ctx context.Context, letter *entities.LetterOutgoing) error {
if letter.Subject == "" {
return errors.New("letter subject is required")
}
if letter.CreatedBy == uuid.Nil {
return errors.New("letter creator is required")
}
if letter.IssueDate.IsZero() {
return errors.New("letter issue date is required")
}
return nil
}
func (p *LetterValidationProcessorImpl) ValidateUpdateOutgoingLetter(ctx context.Context, letter *entities.LetterOutgoing, existingLetter *entities.LetterOutgoing) error {
if existingLetter.Status != entities.LetterOutgoingStatusDraft {
return errors.New("only draft letters can be updated")
}
if letter.Subject == "" {
return errors.New("letter subject cannot be empty")
}
return nil
}
func (p *LetterValidationProcessorImpl) ValidateDeleteOutgoingLetter(ctx context.Context, letter *entities.LetterOutgoing) error {
if letter.Status != entities.LetterOutgoingStatusDraft {
return errors.New("only draft letters can be deleted")
}
return nil
}
func (p *LetterValidationProcessorImpl) ValidateApprovalSubmission(ctx context.Context, letter *entities.LetterOutgoing) error {
if letter.Status != entities.LetterOutgoingStatusDraft {
return errors.New("only draft letters can be submitted for approval")
}
if letter.ApprovalFlowID == nil {
return errors.New("approval flow is required for submission")
}
return nil
}