54 lines
1.8 KiB
PHP
54 lines
1.8 KiB
PHP
<?php
|
|
|
|
declare(strict_types=1);
|
|
|
|
namespace Application\UseCases\CampaignRequest\Create;
|
|
|
|
use Domain\Models\Entities\CampaignRequest;
|
|
use Domain\Ports\Repositories\BrandRepository;
|
|
use Domain\Ports\Repositories\CampaignRequestRepository;
|
|
use Shared\DDD\UseCases\Input as BaseInput;
|
|
use Shared\DDD\UseCases\Transactional;
|
|
use Shared\DDD\UseCases\UseCase;
|
|
use Webmozart\Assert\Assert;
|
|
|
|
/** @implements UseCase<\Application\UseCases\CampaignRequest\Create\Input, \Application\UseCases\CampaignRequest\Create\Output> */
|
|
final readonly class CreateCampaignRequest implements UseCase, Transactional
|
|
{
|
|
public function __construct(
|
|
private CampaignRequestRepository $campaignRequestRepository,
|
|
private BrandRepository $brandRepository
|
|
) {
|
|
}
|
|
|
|
#[\Override]
|
|
public function execute(BaseInput $input): Output
|
|
{
|
|
Assert::isInstanceOf($input, Input::class);
|
|
|
|
if (! $this->brandRepository->existsByCode($input->brandCode)) {
|
|
throw new \DomainException(sprintf('Brand with code "%s" was not found.', $input->brandCode->value));
|
|
}
|
|
|
|
$campaignRequest = CampaignRequest::create(
|
|
brandCode: $input->brandCode,
|
|
name: $input->name,
|
|
applicant: $input->applicant,
|
|
campaignType: $input->campaignType,
|
|
requestedCoupon: $input->requestedCoupon,
|
|
);
|
|
|
|
$this->campaignRequestRepository->save($campaignRequest);
|
|
|
|
return new Output(
|
|
id: $campaignRequest->id(),
|
|
brandCode: $campaignRequest->brandCode,
|
|
name: $campaignRequest->name,
|
|
applicant: $campaignRequest->applicant,
|
|
campaignType: $campaignRequest->campaignType,
|
|
requestedCoupon: $campaignRequest->requestedCoupon,
|
|
status: $campaignRequest->status,
|
|
createdAt: $campaignRequest->createdAt(),
|
|
);
|
|
}
|
|
}
|