Files
alrahma_sunday_school_api/app/Services/Communication/CommunicationSendService.php
T
2026-06-11 11:46:12 -04:00

100 lines
3.1 KiB
PHP

<?php
namespace App\Services\Communication;
use App\Services\EmailService;
class CommunicationSendService
{
private EmailService $mailer;
private CommunicationLogService $logService;
public function __construct(EmailService $mailer, CommunicationLogService $logService)
{
$this->mailer = $mailer;
$this->logService = $logService;
}
public function send(array $payload): array
{
$recipients = $this->normalizeEmails($payload['recipients'] ?? []);
$cc = $this->normalizeEmails($payload['cc'] ?? []);
$bcc = $this->normalizeEmails($payload['bcc'] ?? []);
if (empty($recipients)) {
$this->logService->log([
'student_id' => (int) $payload['student_id'],
'family_id' => (int) $payload['family_id'],
'student_name' => (string) $payload['student_name'],
'template_key' => (string) $payload['template_key'],
'subject' => (string) $payload['subject'],
'body' => (string) $payload['body'],
'recipients' => [],
'cc' => array_values($cc),
'bcc' => array_values($bcc),
'status' => 'failed',
'error_message' => 'No recipients provided',
'sent_by' => (int) ($payload['sent_by'] ?? 0),
'metadata' => null,
]);
return [
'ok' => false,
'error' => 'No recipients provided',
];
}
$sendOk = false;
$error = null;
try {
$sendOk = $this->mailer->send(
$recipients,
(string) $payload['subject'],
(string) $payload['body'],
'general',
$cc,
$bcc
);
} catch (\Throwable $t) {
$error = $t->getMessage();
$sendOk = false;
}
if (! $sendOk && $error === null) {
$error = 'Mailer returned false';
}
$this->logService->log([
'student_id' => (int) $payload['student_id'],
'family_id' => (int) $payload['family_id'],
'student_name' => (string) $payload['student_name'],
'template_key' => (string) $payload['template_key'],
'subject' => (string) $payload['subject'],
'body' => (string) $payload['body'],
'recipients' => array_values($recipients),
'cc' => array_values($cc),
'bcc' => array_values($bcc),
'status' => $sendOk ? 'sent' : 'failed',
'error_message' => $error,
'sent_by' => (int) ($payload['sent_by'] ?? 0),
'metadata' => null,
]);
return [
'ok' => $sendOk,
'error' => $error,
];
}
private function normalizeEmails(array $values): array
{
$out = array_values(array_unique(array_filter(array_map('strval', $values))));
return array_values(array_filter($out, static function ($email) {
return $email !== '';
}));
}
}