id = $notification['id']; $this->title = $notification['title']; $this->fields = $notification['fields']; } public function __invoke(): EmailNotificationData { $dto = new EmailNotificationData; $dto->id = $this->id; $dto->title = $this->title; $dto->statusOptions = $this->getStatusOptions(); $dto->supportsRecipients = $this->hasRecipientField(); $dto->defaultValues = $this->getDefaultValues(); return $dto; } protected function getStatusOptions() { try { $field = $this->findFieldBy('id', "_give_{$this->id}_notification"); $formattedOptions = []; foreach($field['options'] as $value => $label) { $formattedOptions[] = [ 'value' => $value, 'label' => $label, ]; } return $formattedOptions; } catch(\Exception $e) { return []; } } protected function hasRecipientField(): bool { try { $this->findFieldBy('id', "_give_{$this->id}_recipient"); return true; } catch(\Exception $e) { return false; } } protected function findFieldBy($key, $value) { foreach( $this->fields as $field ) { if( isset($field[$key]) && $field[$key] === $value ) { return $field; } } throw new \Exception("Field not found with $key of '$value'"); } protected function getDefaultValues(): array { $defaultValues = []; foreach($this->fields as $field){ $key = str_replace("_give_{$this->id}_", '', $field['id']); $defaultValues[$key] = $field['default'] ?? ''; } if (!isset($defaultValues['email_message'])) { foreach ($this->fields as $field) { if (strpos($field['id'], '_message') !== false) { $defaultValues['email_message'] = $field['default'] ?? ''; break; } } } if (!isset($defaultValues['email_subject'])) { foreach ($this->fields as $field) { if (strpos($field['id'], '_subject') !== false) { $defaultValues['email_subject'] = $field['default'] ?? ''; break; } } } return $defaultValues; } }