| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374 | 
							- // Package handling provides the use-case for registering incidents. Used by
 
- // views facing the people handling the cargo along its route.
 
- package handling
 
- import (
 
- 	"errors"
 
- 	"time"
 
- 	"github.com/longjoy/micro-go-course/section19/cargo/inspection"
 
- 	shipping "github.com/longjoy/micro-go-course/section19/cargo/model"
 
- )
 
- // ErrInvalidArgument is returned when one or more arguments are invalid.
 
- var ErrInvalidArgument = errors.New("invalid argument")
 
- // EventHandler provides a means of subscribing to registered handling events.
 
- type EventHandler interface {
 
- 	CargoWasHandled(shipping.HandlingEvent)
 
- }
 
- // Service provides handling operations.
 
- type Service interface {
 
- 	// RegisterHandlingEvent registers a handling event in the system, and
 
- 	// notifies interested parties that a cargo has been handled.
 
- 	RegisterHandlingEvent(completed time.Time, id shipping.TrackingID, voyageNumber shipping.VoyageNumber,
 
- 		unLocode shipping.UNLocode, eventType shipping.HandlingEventType) (bool, error)
 
- }
 
- type service struct {
 
- 	handlingEventRepository shipping.HandlingEventRepository
 
- 	handlingEventFactory    shipping.HandlingEventFactory
 
- 	handlingEventHandler    EventHandler
 
- }
 
- func (s *service) RegisterHandlingEvent(completed time.Time, id shipping.TrackingID, voyageNumber shipping.VoyageNumber,
 
- 	loc shipping.UNLocode, eventType shipping.HandlingEventType) (bool, error) {
 
- 	if completed.IsZero() || id == "" || loc == "" || eventType == shipping.NotHandled {
 
- 		return false, ErrInvalidArgument
 
- 	}
 
- 	e, err := s.handlingEventFactory.CreateHandlingEvent(time.Now(), completed, id, voyageNumber, loc, eventType)
 
- 	if err != nil {
 
- 		return false, err
 
- 	}
 
- 	s.handlingEventRepository.Store(e)
 
- 	s.handlingEventHandler.CargoWasHandled(e)
 
- 	return true, nil
 
- }
 
- // NewService creates a handling event service with necessary dependencies.
 
- func NewService(r shipping.HandlingEventRepository, f shipping.HandlingEventFactory, h EventHandler) Service {
 
- 	return &service{
 
- 		handlingEventRepository: r,
 
- 		handlingEventFactory:    f,
 
- 		handlingEventHandler:    h,
 
- 	}
 
- }
 
- type handlingEventHandler struct {
 
- 	InspectionService inspection.Service
 
- }
 
- func (h *handlingEventHandler) CargoWasHandled(event shipping.HandlingEvent) {
 
- 	h.InspectionService.InspectCargo(event.TrackingID)
 
- }
 
- // NewEventHandler returns a new instance of a EventHandler.
 
- func NewEventHandler(s inspection.Service) EventHandler {
 
- 	return &handlingEventHandler{
 
- 		InspectionService: s,
 
- 	}
 
- }
 
 
  |