func (s *dispatcher) Dispatch(order *Order, couriers []*Courier) (*Courier, error) {
for _, c := range couriers {
if c.HasFreeSlot() && c.IsNear(order.Location) {
// Мутируем агрегаты внутри сервиса
err := order.Assign(c.ID)
if err != nil {
return nil, err
}
err = c.TakeOrder(order)
if err != nil {
return nil, err
}
return c, nil
}
}
return nil, ErrCourierNotFound
}
func (s *dispatcher) FindBestCourier(order *Order, couriers []*Courier) (*Courier, error) {
for _, c := range couriers {
if c.HasFreeSlot() && c.IsNear(order.Location) {
return c, nil
}
}
return nil, ErrCourierNotFound
}
courier, err := dispatcher.FindBestCourier(order, couriers)
if err != nil {
return err
}
err = order.Assign(courier.ID)
if err != nil {
return err
}
err = courier.TakeOrder(order)
if err != nil {
return err
}