ldc-mesbr-app/src/Application/UseCases/CampaignRequest/Create/CreateCampaignRequest.php
2026-10-12 17:07:56 +02:00

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(),
);
}
}