|
| 1 | +<?php |
| 2 | + |
| 3 | +namespace HiEvents\Services\Domain\Event; |
| 4 | + |
| 5 | +use HiEvents\DomainObjects\Enums\HomepageBackgroundType; |
| 6 | +use HiEvents\DomainObjects\EventDomainObject; |
| 7 | +use HiEvents\DomainObjects\EventSettingDomainObject; |
| 8 | +use HiEvents\DomainObjects\OrganizerDomainObject; |
| 9 | +use HiEvents\Exceptions\OrganizerNotFoundException; |
| 10 | +use HiEvents\Helper\DateHelper; |
| 11 | +use HiEvents\Helper\IdHelper; |
| 12 | +use HiEvents\Repository\Interfaces\EventRepositoryInterface; |
| 13 | +use HiEvents\Repository\Interfaces\EventSettingsRepositoryInterface; |
| 14 | +use HiEvents\Repository\Interfaces\EventStatisticRepositoryInterface; |
| 15 | +use HiEvents\Repository\Interfaces\OrganizerRepositoryInterface; |
| 16 | +use Illuminate\Database\DatabaseManager; |
| 17 | +use Throwable; |
| 18 | + |
| 19 | +class CreateEventService |
| 20 | +{ |
| 21 | + public function __construct( |
| 22 | + private readonly EventRepositoryInterface $eventRepository, |
| 23 | + private readonly EventSettingsRepositoryInterface $eventSettingsRepository, |
| 24 | + private readonly OrganizerRepositoryInterface $organizerRepository, |
| 25 | + private readonly DatabaseManager $databaseManager, |
| 26 | + private readonly EventStatisticRepositoryInterface $eventStatisticsRepository, |
| 27 | + ) |
| 28 | + { |
| 29 | + } |
| 30 | + |
| 31 | + /** |
| 32 | + * @throws Throwable |
| 33 | + */ |
| 34 | + public function createEvent( |
| 35 | + EventDomainObject $eventData, |
| 36 | + EventSettingDomainObject $eventSettings = null |
| 37 | + ): EventDomainObject |
| 38 | + { |
| 39 | + $this->databaseManager->beginTransaction(); |
| 40 | + |
| 41 | + $organizer = $this->getOrganizer( |
| 42 | + organizerId: $eventData->getOrganizerId(), |
| 43 | + accountId: $eventData->getAccountId() |
| 44 | + ); |
| 45 | + |
| 46 | + $event = $this->handleEventCreate($eventData); |
| 47 | + |
| 48 | + $this->createEventSettings( |
| 49 | + eventSettings: $eventSettings, |
| 50 | + event: $event, |
| 51 | + organizer: $organizer |
| 52 | + ); |
| 53 | + |
| 54 | + $this->createEventStatistics($event); |
| 55 | + |
| 56 | + $this->databaseManager->commit(); |
| 57 | + |
| 58 | + return $event; |
| 59 | + } |
| 60 | + |
| 61 | + /** |
| 62 | + * @throws OrganizerNotFoundException |
| 63 | + */ |
| 64 | + private function getOrganizer(int $organizerId, int $accountId): OrganizerDomainObject |
| 65 | + { |
| 66 | + $organizer = $this->organizerRepository->findFirstWhere([ |
| 67 | + 'id' => $organizerId, |
| 68 | + 'account_id' => $accountId, |
| 69 | + ]); |
| 70 | + |
| 71 | + if ($organizer === null) { |
| 72 | + throw new OrganizerNotFoundException( |
| 73 | + __('Organizer :id not found', ['id' => $organizerId]) |
| 74 | + ); |
| 75 | + } |
| 76 | + |
| 77 | + return $organizer; |
| 78 | + } |
| 79 | + |
| 80 | + private function handleEventCreate(EventDomainObject $eventData): EventDomainObject |
| 81 | + { |
| 82 | + return $this->eventRepository->create([ |
| 83 | + 'title' => $eventData->getTitle(), |
| 84 | + 'organizer_id' => $eventData->getOrganizerId(), |
| 85 | + 'start_date' => DateHelper::convertToUTC($eventData->getStartDate(), $eventData->getTimezone()), |
| 86 | + 'end_date' => $eventData->getEndDate() |
| 87 | + ? DateHelper::convertToUTC($eventData->getEndDate(), $eventData->getTimezone()) |
| 88 | + : null, |
| 89 | + 'description' => $eventData->getDescription(), |
| 90 | + 'timezone' => $eventData->getTimezone(), |
| 91 | + 'currency' => $eventData->getCurrency(), |
| 92 | + 'location_details' => $eventData->getLocationDetails(), |
| 93 | + 'account_id' => $eventData->getAccountId(), |
| 94 | + 'user_id' => $eventData->getUserId(), |
| 95 | + 'status' => $eventData->getStatus(), |
| 96 | + 'short_id' => IdHelper::randomPrefixedId(IdHelper::EVENT_PREFIX), |
| 97 | + 'attributes' => $eventData->getAttributes(), |
| 98 | + ]); |
| 99 | + } |
| 100 | + |
| 101 | + private function createEventStatistics(EventDomainObject $event): void |
| 102 | + { |
| 103 | + $this->eventStatisticsRepository->create([ |
| 104 | + 'event_id' => $event->getId(), |
| 105 | + 'tickets_sold' => 0, |
| 106 | + 'sales_total_gross' => 0, |
| 107 | + 'sales_total_before_additions' => 0, |
| 108 | + 'total_tax' => 0, |
| 109 | + 'total_fee' => 0, |
| 110 | + 'orders_created' => 0, |
| 111 | + ]); |
| 112 | + } |
| 113 | + |
| 114 | + private function createEventSettings( |
| 115 | + ?EventSettingDomainObject $eventSettings, |
| 116 | + EventDomainObject $event, |
| 117 | + OrganizerDomainObject $organizer |
| 118 | + ): void |
| 119 | + { |
| 120 | + if ($eventSettings !== null) { |
| 121 | + $eventSettings->setEventId($event->getId()); |
| 122 | + $eventSettingsArray = $eventSettings->toArray(); |
| 123 | + |
| 124 | + unset($eventSettingsArray['id']); |
| 125 | + |
| 126 | + $this->eventSettingsRepository->create($eventSettingsArray); |
| 127 | + |
| 128 | + return; |
| 129 | + } |
| 130 | + |
| 131 | + $this->eventSettingsRepository->create([ |
| 132 | + 'event_id' => $event->getId(), |
| 133 | + 'homepage_background_color' => '#ffffff', |
| 134 | + 'homepage_primary_text_color' => '#000000', |
| 135 | + 'homepage_primary_color' => '#7b5db8', |
| 136 | + 'homepage_secondary_text_color' => '#ffffff', |
| 137 | + 'homepage_secondary_color' => '#7b5eb9', |
| 138 | + 'homepage_background_type' => HomepageBackgroundType::COLOR->name, |
| 139 | + 'homepage_body_background_color' => '#7a5eb9', |
| 140 | + 'continue_button_text' => __('Continue'), |
| 141 | + 'support_email' => $organizer->getEmail(), |
| 142 | + ]); |
| 143 | + } |
| 144 | +} |
0 commit comments