Updated the OrderService to utilize the new fromBasket method for creating orders, enhancing code clarity and maintainability. Removed the ProductAvailabilityService as its functionality is now integrated into the ProductRepository.
62 lines
1.4 KiB
PHP
62 lines
1.4 KiB
PHP
<?php
|
|
|
|
declare(strict_types=1);
|
|
|
|
namespace Domain\Services;
|
|
|
|
use Domain\Models\Entities\Basket;
|
|
use Domain\Models\Entities\Order;
|
|
use Domain\Models\Entities\Shop;
|
|
use Domain\Models\Entities\Shopper;
|
|
use Domain\Models\ValueObjects\Entities\OrderId;
|
|
use Domain\Models\ValueObjects\OrderReference;
|
|
use Domain\Models\ValueObjects\PickupTimeSlot;
|
|
use Domain\Ports\Repositories\OrderRepository;
|
|
use Ramsey\Uuid\Uuid;
|
|
|
|
class OrderService
|
|
{
|
|
public function __construct(
|
|
private readonly OrderRepository $orderRepository,
|
|
) {
|
|
}
|
|
|
|
public function createOrderFromBasket(
|
|
Basket $basket,
|
|
PickupTimeSlot $pickupTimeSlot,
|
|
Shopper $shopper,
|
|
Shop $shop
|
|
): Order {
|
|
return Order::fromBasket(
|
|
id: $this->newOrderId(),
|
|
reference: $this->newReference(),
|
|
basket: $basket,
|
|
pickupTimeSlot: $pickupTimeSlot,
|
|
shopper: $shopper,
|
|
shop: $shop
|
|
);
|
|
}
|
|
|
|
private function newOrderId(): OrderId
|
|
{
|
|
return new OrderId(Uuid::uuid7());
|
|
}
|
|
|
|
private function newReference(): OrderReference
|
|
{
|
|
return new OrderReference(Uuid::uuid7());
|
|
}
|
|
|
|
public function cancelOrder(OrderId $id): void
|
|
{
|
|
$order = $this->orderRepository->find($id);
|
|
|
|
if (! $order) {
|
|
throw new \DomainException('Order not found');
|
|
}
|
|
|
|
$order->cancel();
|
|
|
|
$this->orderRepository->persist($order);
|
|
}
|
|
}
|