| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140 | // Package inmem provides in-memory implementations of all the domain repositories.package inmemimport (	"sync"	shipping "github.com/longjoy/micro-go-course/section19/cargo/model")type cargoRepository struct {	mtx    sync.RWMutex	cargos map[shipping.TrackingID]*shipping.Cargo}func (r *cargoRepository) Store(c *shipping.Cargo) (bool, error) {	r.mtx.Lock()	defer r.mtx.Unlock()	r.cargos[c.TrackingID] = c	return true, nil}func (r *cargoRepository) Find(id shipping.TrackingID) (*shipping.Cargo, error) {	r.mtx.RLock()	defer r.mtx.RUnlock()	if val, ok := r.cargos[id]; ok {		return val, nil	}	return nil, shipping.ErrUnknownCargo}func (r *cargoRepository) FindAll() []*shipping.Cargo {	r.mtx.RLock()	defer r.mtx.RUnlock()	c := make([]*shipping.Cargo, 0, len(r.cargos))	for _, val := range r.cargos {		c = append(c, val)	}	return c}// NewCargoRepository returns a new instance of a in-memory cargo repository.func NewCargoRepository() shipping.CargoRepository {	return &cargoRepository{		cargos: make(map[shipping.TrackingID]*shipping.Cargo),	}}type locationRepository struct {	locations map[shipping.UNLocode]*shipping.Location}func (r *locationRepository) Find(locode shipping.UNLocode) (*shipping.Location, error) {	if l, ok := r.locations[locode]; ok {		return l, nil	}	return nil, shipping.ErrUnknownLocation}func (r *locationRepository) FindAll() []*shipping.Location {	l := make([]*shipping.Location, 0, len(r.locations))	for _, val := range r.locations {		l = append(l, val)	}	return l}// NewLocationRepository returns a new instance of a in-memory location repository.func NewLocationRepository() shipping.LocationRepository {	r := &locationRepository{		locations: make(map[shipping.UNLocode]*shipping.Location),	}	r.locations[shipping.SESTO] = shipping.Stockholm	r.locations[shipping.AUMEL] = shipping.Melbourne	r.locations[shipping.CNHKG] = shipping.Hongkong	r.locations[shipping.JNTKO] = shipping.Tokyo	r.locations[shipping.NLRTM] = shipping.Rotterdam	r.locations[shipping.DEHAM] = shipping.Hamburg	return r}type voyageRepository struct {	voyages map[shipping.VoyageNumber]*shipping.Voyage}func (r *voyageRepository) Find(voyageNumber shipping.VoyageNumber) (*shipping.Voyage, error) {	if v, ok := r.voyages[voyageNumber]; ok {		return v, nil	}	return nil, shipping.ErrUnknownVoyage}// NewVoyageRepository returns a new instance of a in-memory voyage repository.func NewVoyageRepository() shipping.VoyageRepository {	r := &voyageRepository{		voyages: make(map[shipping.VoyageNumber]*shipping.Voyage),	}	r.voyages[shipping.V100.VoyageNumber] = shipping.V100	r.voyages[shipping.V300.VoyageNumber] = shipping.V300	r.voyages[shipping.V400.VoyageNumber] = shipping.V400	r.voyages[shipping.V0100S.VoyageNumber] = shipping.V0100S	r.voyages[shipping.V0200T.VoyageNumber] = shipping.V0200T	r.voyages[shipping.V0300A.VoyageNumber] = shipping.V0300A	r.voyages[shipping.V0301S.VoyageNumber] = shipping.V0301S	r.voyages[shipping.V0400S.VoyageNumber] = shipping.V0400S	return r}type handlingEventRepository struct {	mtx    sync.RWMutex	events map[shipping.TrackingID][]shipping.HandlingEvent}func (r *handlingEventRepository) Store(e shipping.HandlingEvent) {	r.mtx.Lock()	defer r.mtx.Unlock()	// Make array if it's the first event with this tracking ID.	if _, ok := r.events[e.TrackingID]; !ok {		r.events[e.TrackingID] = make([]shipping.HandlingEvent, 0)	}	r.events[e.TrackingID] = append(r.events[e.TrackingID], e)}func (r *handlingEventRepository) QueryHandlingHistory(id shipping.TrackingID) shipping.HandlingHistory {	r.mtx.RLock()	defer r.mtx.RUnlock()	return shipping.HandlingHistory{HandlingEvents: r.events[id]}}// NewHandlingEventRepository returns a new instance of a in-memory handling event repository.func NewHandlingEventRepository() shipping.HandlingEventRepository {	return &handlingEventRepository{		events: make(map[shipping.TrackingID][]shipping.HandlingEvent),	}}
 |