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