110 lines
3.9 KiB
Go
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
|
|
}
|