54 lines
1.6 KiB
PHP
54 lines
1.6 KiB
PHP
<?php
|
|
|
|
namespace App\Services\Email;
|
|
|
|
use App\Models\Customer;
|
|
use App\Models\MailCampaign;
|
|
use App\Models\Template;
|
|
use App\Support\MailGlobals;
|
|
use App\Support\MailPlaceholders;
|
|
|
|
final class MailCampaignRenderer
|
|
{
|
|
/**
|
|
* @param array<string, string> $values
|
|
* @return array{subject: string, html: string}
|
|
*/
|
|
public function render(MailCampaign $campaign, array $values): array
|
|
{
|
|
$subject = MailPlaceholders::fill((string) $campaign->subject, $values, escapeHtml: false);
|
|
$content = MailPlaceholders::fill((string) $campaign->message, $values);
|
|
|
|
return [
|
|
'subject' => $subject,
|
|
'html' => $campaign->template_id ? $content : Template::renderWithLayout($subject, $content),
|
|
];
|
|
}
|
|
|
|
/**
|
|
* @return array<string, string>
|
|
*/
|
|
public function recipientValues(MailCampaign $campaign, ?Customer $customer, string $email): array
|
|
{
|
|
return [...MailGlobals::values(), ...MailPlaceholders::recipientValues($customer, $email), ...$this->adminValues($campaign)];
|
|
}
|
|
|
|
/**
|
|
* @return array<string, string>
|
|
*/
|
|
public function sampleValues(MailCampaign $campaign): array
|
|
{
|
|
$samples = array_map(fn (string $key) => "[{$key}]", array_combine(
|
|
array_keys(MailPlaceholders::RECIPIENT_FIELDS),
|
|
array_keys(MailPlaceholders::RECIPIENT_FIELDS),
|
|
));
|
|
|
|
return [...MailGlobals::values(), ...$samples, ...$this->adminValues($campaign)];
|
|
}
|
|
|
|
private function adminValues(MailCampaign $campaign): array
|
|
{
|
|
return array_filter($campaign->variables ?? [], fn ($value) => $value !== null && $value !== '');
|
|
}
|
|
}
|