package order import "errors" var ( ErrDependencyUnavailable = errors.New("dependency unavailable") ErrInvalidRentHours = errors.New("invalid rent hours") ErrListingUnavailable = errors.New("listing unavailable") ErrCannotRentOwnListing = errors.New("cannot rent own listing") ErrOrderCannotCancel = errors.New("order cannot cancel") ErrOrderCannotHandoff = errors.New("order cannot handoff") ErrOrderCannotReceive = errors.New("order cannot receive") ErrOrderCannotComplete = errors.New("order cannot complete") ErrCheckoutCannotSubmit = errors.New("checkout cannot submit") ErrCheckoutCannotConfirm = errors.New("checkout cannot confirm") ErrCheckoutCannotCounter = errors.New("checkout cannot counter") ErrInvalidCheckoutAmount = errors.New("invalid checkout amount") ErrPermissionDenied = errors.New("permission denied") ) const internalOrderHours = 24 type Service struct { repo *Repository } func NewService(repo *Repository) *Service { return &Service{repo: repo} } func (s *Service) Create(userID uint64, req CreateRequest) (*OrderDTO, error) { if s.repo == nil { return nil, ErrDependencyUnavailable } if req.ListingID == 0 { return nil, ErrInvalidRentHours } return s.repo.Create(userID, req) } func (s *Service) Cancel(userID uint64, orderID uint64) error { if s.repo == nil { return ErrDependencyUnavailable } return s.repo.Cancel(userID, orderID) } func (s *Service) SubmitHandoff(userID uint64, orderID uint64, req SubmitHandoffRequest) (*HandoffRecordDTO, error) { if s.repo == nil { return nil, ErrDependencyUnavailable } if orderID == 0 || req.Content == "" { return nil, ErrOrderCannotHandoff } return s.repo.SubmitHandoff(userID, orderID, req) } func (s *Service) ConfirmReceive(userID uint64, orderID uint64) error { if s.repo == nil { return ErrDependencyUnavailable } return s.repo.ConfirmReceive(userID, orderID) } func (s *Service) HandoffRecords(userID uint64, orderID uint64) ([]HandoffRecordDTO, error) { if s.repo == nil { return nil, ErrDependencyUnavailable } return s.repo.HandoffRecords(userID, orderID) } func (s *Service) SubmitCheckout(userID uint64, orderID uint64, req SubmitCheckoutRequest) (*HandoffRecordDTO, error) { if s.repo == nil { return nil, ErrDependencyUnavailable } if orderID == 0 || req.Content == "" { return nil, ErrCheckoutCannotSubmit } return s.repo.SubmitCheckout(userID, orderID, req) } func (s *Service) ConfirmCheckout(userID uint64, orderID uint64) error { if s.repo == nil { return ErrDependencyUnavailable } return s.repo.ConfirmCheckout(userID, orderID) } func (s *Service) CounterCheckout(userID uint64, orderID uint64, req CounterCheckoutRequest) (*CheckoutDTO, error) { if s.repo == nil { return nil, ErrDependencyUnavailable } if orderID == 0 || req.Reason == "" { return nil, ErrCheckoutCannotCounter } return s.repo.CounterCheckout(userID, orderID, req) } func (s *Service) AcceptCheckout(userID uint64, orderID uint64) error { if s.repo == nil { return ErrDependencyUnavailable } return s.repo.AcceptCheckout(userID, orderID) } func (s *Service) ListForUser(userID uint64, page int, pageSize int) (*PaginatedOrders, error) { if s.repo == nil { return nil, ErrDependencyUnavailable } return s.repo.ListForUser(userID, page, pageSize) } func (s *Service) ListAdmin(page int, pageSize int) (*PaginatedOrders, error) { if s.repo == nil { return nil, ErrDependencyUnavailable } return s.repo.ListAdmin(page, pageSize) } func (s *Service) FindAdmin(orderID uint64) (*OrderDTO, error) { if s.repo == nil { return nil, ErrDependencyUnavailable } return s.repo.FindAdmin(orderID) } func (s *Service) HandoffRecordsAdmin(orderID uint64) ([]HandoffRecordDTO, error) { if s.repo == nil { return nil, ErrDependencyUnavailable } return s.repo.HandoffRecordsAdmin(orderID) } func (s *Service) AdminClose(adminID uint64, orderID uint64, req AdminActionRequest, meta AuditMeta) error { if s.repo == nil { return ErrDependencyUnavailable } if orderID == 0 || req.Reason == "" { return ErrOrderCannotComplete } return s.repo.AdminClose(adminID, orderID, req, meta) } func (s *Service) AdminMarkAbnormal(adminID uint64, orderID uint64, req AdminActionRequest, meta AuditMeta) error { if s.repo == nil { return ErrDependencyUnavailable } if orderID == 0 || req.Reason == "" { return ErrOrderCannotComplete } return s.repo.AdminMarkAbnormal(adminID, orderID, req, meta) } func (s *Service) FindForUser(userID uint64, orderID uint64) (*OrderDTO, error) { if s.repo == nil { return nil, ErrDependencyUnavailable } return s.repo.FindForUser(userID, orderID) }