Files
fm_be/internal/service/easa_release_service.go
2026-07-16 22:16:45 +07:00

110 lines
3.9 KiB
Go

package service
import (
"context"
"time"
easarelease "wucher/internal/domain/easa_release"
)
type EASAReleaseService struct{ repo easarelease.Repository }
func NewEASAReleaseService(repo easarelease.Repository) *EASAReleaseService {
return &EASAReleaseService{repo: repo}
}
func (s *EASAReleaseService) Create(ctx context.Context, row *easarelease.EASARelease) error {
return s.repo.Create(ctx, row)
}
func (s *EASAReleaseService) Update(ctx context.Context, row *easarelease.EASARelease) error {
return s.repo.Update(ctx, row)
}
func (s *EASAReleaseService) Delete(ctx context.Context, id []byte, deletedBy []byte) error {
return s.repo.Delete(ctx, id, deletedBy)
}
func (s *EASAReleaseService) GetByID(ctx context.Context, id []byte) (*easarelease.EASARelease, error) {
return s.repo.GetByID(ctx, id)
}
// GetByFlightID returns the current (newest non-voided) release for a flight.
func (s *EASAReleaseService) GetByFlightID(ctx context.Context, flightID []byte) (*easarelease.EASARelease, error) {
return s.repo.GetByFlightID(ctx, flightID)
}
// GetByComplaintID returns the current (newest non-voided) release for a complaint.
func (s *EASAReleaseService) GetByComplaintID(ctx context.Context, complaintID []byte) (*easarelease.EASARelease, error) {
return s.repo.GetByComplaintID(ctx, complaintID)
}
func (s *EASAReleaseService) ListByHelicopter(ctx context.Context, helicopterID []byte) ([]easarelease.EASARelease, error) {
return s.repo.ListByHelicopter(ctx, helicopterID)
}
func (s *EASAReleaseService) GetLatestByHelicopter(ctx context.Context, helicopterID []byte) (*easarelease.EASARelease, error) {
return s.repo.GetLatestByHelicopter(ctx, helicopterID)
}
func (s *EASAReleaseService) GetActiveByHelicopter(ctx context.Context, helicopterID []byte) (*easarelease.EASARelease, error) {
return s.repo.GetActiveByHelicopter(ctx, helicopterID)
}
// Sign stamps the maintenance release as signed (active). A signed release closes
// the defects of its flight inspection. Re-signing an already-signed release fails.
func (s *EASAReleaseService) Sign(ctx context.Context, id []byte, signerID []byte) error {
row, err := s.repo.GetByID(ctx, id)
if err != nil {
return err
}
if row == nil {
return easarelease.ErrNotFound
}
if row.SignedAt != nil {
return easarelease.ErrAlreadySigned
}
if len(row.MissingSignFields()) > 0 {
return easarelease.ErrIncompleteForSign
}
now := time.Now().UTC()
row.SignedAt = &now
row.SignedBy = append([]byte(nil), signerID...)
row.UpdatedBy = append([]byte(nil), signerID...)
return s.repo.Update(ctx, row)
}
// Amend supersedes the current release: it voids (soft-deletes) the current one and
// creates a fresh unsigned copy for the same flight inspection, returning the new id.
func (s *EASAReleaseService) Amend(ctx context.Context, currentID []byte, reason string, actor []byte) ([]byte, error) {
cur, err := s.repo.GetByID(ctx, currentID)
if err != nil {
return nil, err
}
if cur == nil {
return nil, easarelease.ErrNotFound
}
if err := s.repo.VoidByID(ctx, currentID, reason, actor); err != nil {
return nil, err
}
next := &easarelease.EASARelease{
HelicopterID: append([]byte(nil), cur.HelicopterID...),
FlightID: append([]byte(nil), cur.FlightID...),
ComplaintID: append([]byte(nil), cur.ComplaintID...),
EASADate: cur.EASADate,
EASAACHours: cur.EASAACHours,
EASALocation: cur.EASALocation,
EASAWONo: cur.EASAWONo,
EASAMaintManualRevAirframe: cur.EASAMaintManualRevAirframe,
EASAMaintManualRevEngine: cur.EASAMaintManualRevEngine,
EASASignerID: cur.EASASignerID,
EASAPermitNo: cur.EASAPermitNo,
CreatedBy: append([]byte(nil), actor...),
UpdatedBy: append([]byte(nil), actor...),
}
if err := s.repo.Create(ctx, next); err != nil {
return nil, err
}
return next.ID, nil
}