Refactor Email Integration Handling

- Removed the AbstractEmailIntegrationHandler class to streamline email integration logic.
- Updated EmailIntegration class to extend AbstractIntegrationHandler instead of the removed class.
- Modified FormEmailNotification to handle mailer configuration internally, eliminating the need to pass the mailer as a parameter.

These changes enhance the clarity and maintainability of the email integration process by consolidating configuration logic and reducing class dependencies.
This commit is contained in:
Julien Nahum 2025-01-14 11:53:31 +01:00
parent 06c35121a0
commit e3fd709326
4 changed files with 37 additions and 61 deletions

View File

@ -1,47 +0,0 @@
<?php
namespace App\Integrations\Handlers;
use App\Events\Forms\FormSubmitted;
use App\Models\Integration\FormIntegration;
use Illuminate\Support\Facades\Log;
abstract class AbstractEmailIntegrationHandler extends AbstractIntegrationHandler
{
protected $mailer;
public function __construct(FormSubmitted $event, FormIntegration $formIntegration, array $integration)
{
parent::__construct($event, $formIntegration, $integration);
$this->initializeMailer();
}
protected function initializeMailer()
{
$this->mailer = config('mail.default');
$this->setWorkspaceSMTPSettings();
if (!$this->mailer) {
Log::error('Mailer not specified', [
'form_id' => $this->form->id
]);
}
}
protected function setWorkspaceSMTPSettings()
{
$workspace = $this->form->workspace;
$emailSettings = $workspace->settings['email_settings'] ?? [];
if (!$workspace->is_pro || !$emailSettings || empty($emailSettings['host']) || empty($emailSettings['port']) || empty($emailSettings['username']) || empty($emailSettings['password'])) {
return;
}
config([
'mail.mailers.custom_smtp.host' => $emailSettings['host'],
'mail.mailers.custom_smtp.port' => $emailSettings['port'],
'mail.mailers.custom_smtp.username' => $emailSettings['username'],
'mail.mailers.custom_smtp.password' => $emailSettings['password']
]);
$this->mailer = 'custom_smtp';
}
}

View File

@ -11,7 +11,7 @@ use App\Open\MentionParser;
use App\Service\Forms\FormSubmissionFormatter; use App\Service\Forms\FormSubmissionFormatter;
use Illuminate\Validation\ValidationException; use Illuminate\Validation\ValidationException;
class EmailIntegration extends AbstractEmailIntegrationHandler class EmailIntegration extends AbstractIntegrationHandler
{ {
public const RISKY_USERS_LIMIT = 120; public const RISKY_USERS_LIMIT = 120;
@ -95,16 +95,15 @@ class EmailIntegration extends AbstractEmailIntegrationHandler
->filter(function ($email) { ->filter(function ($email) {
return filter_var($email, FILTER_VALIDATE_EMAIL); return filter_var($email, FILTER_VALIDATE_EMAIL);
}); });
Log::debug('Sending email notification', [ Log::info('Sending email notification', [
'recipients' => $recipients->toArray(), 'recipients' => $recipients->toArray(),
'form_id' => $this->form->id, 'form_id' => $this->form->id,
'form_slug' => $this->form->slug, 'form_slug' => $this->form->slug,
'mailer' => $this->mailer
]); ]);
$recipients->each(function ($subscriber) { $recipients->each(function ($subscriber) {
Notification::route('mail', $subscriber)->notify( Notification::route('mail', $subscriber)->notify(
new FormEmailNotification($this->event, $this->integrationData, $this->mailer) new FormEmailNotification($this->event, $this->integrationData)
); );
}); });
} }

View File

@ -5,30 +5,49 @@ namespace App\Notifications\Forms;
use App\Events\Forms\FormSubmitted; use App\Events\Forms\FormSubmitted;
use App\Open\MentionParser; use App\Open\MentionParser;
use App\Service\Forms\FormSubmissionFormatter; use App\Service\Forms\FormSubmissionFormatter;
use Illuminate\Bus\Queueable;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Notifications\Messages\MailMessage; use Illuminate\Notifications\Messages\MailMessage;
use Illuminate\Notifications\Notification; use Illuminate\Notifications\Notification;
use Illuminate\Support\Str; use Illuminate\Support\Str;
use Vinkla\Hashids\Facades\Hashids; use Vinkla\Hashids\Facades\Hashids;
use Symfony\Component\Mime\Email; use Symfony\Component\Mime\Email;
class FormEmailNotification extends Notification implements ShouldQueue class FormEmailNotification extends Notification
{ {
use Queueable;
public FormSubmitted $event; public FormSubmitted $event;
public string $mailer;
/** /**
* Create a new notification instance. * Create a new notification instance.
* *
* @return void * @return void
*/ */
public function __construct(FormSubmitted $event, private $integrationData, string $mailer) public function __construct(FormSubmitted $event, private $integrationData)
{ {
$this->event = $event; $this->event = $event;
$this->mailer = $mailer; }
private function getMailer(): string
{
$workspace = $this->event->form->workspace;
$emailSettings = $workspace->settings['email_settings'] ?? [];
if (
$workspace->is_pro
&& $emailSettings
&& !empty($emailSettings['host'])
&& !empty($emailSettings['port'])
&& !empty($emailSettings['username'])
&& !empty($emailSettings['password'])
) {
config([
'mail.mailers.custom_smtp.host' => $emailSettings['host'],
'mail.mailers.custom_smtp.port' => $emailSettings['port'],
'mail.mailers.custom_smtp.username' => $emailSettings['username'],
'mail.mailers.custom_smtp.password' => $emailSettings['password']
]);
return 'custom_smtp';
}
return config('mail.default');
} }
/** /**
@ -51,7 +70,7 @@ class FormEmailNotification extends Notification implements ShouldQueue
public function toMail($notifiable) public function toMail($notifiable)
{ {
return (new MailMessage()) return (new MailMessage())
->mailer($this->mailer) ->mailer($this->getMailer())
->replyTo($this->getReplyToEmail($this->event->form->creator->email)) ->replyTo($this->getReplyToEmail($this->event->form->creator->email))
->from($this->getFromEmail(), $this->getSenderName()) ->from($this->getFromEmail(), $this->getSenderName())
->subject($this->getSubject()) ->subject($this->getSubject())

View File

@ -3,6 +3,7 @@
use App\Notifications\Forms\FormEmailNotification; use App\Notifications\Forms\FormEmailNotification;
use Tests\Helpers\FormSubmissionDataFactory; use Tests\Helpers\FormSubmissionDataFactory;
use Illuminate\Notifications\AnonymousNotifiable; use Illuminate\Notifications\AnonymousNotifiable;
use Illuminate\Support\Facades\Notification;
it('can not save custom SMTP settings if not pro user', function () { it('can not save custom SMTP settings if not pro user', function () {
$user = $this->actingAsUser(); $user = $this->actingAsUser();
@ -54,8 +55,12 @@ it('send email with custom SMTP settings', function () {
new AnonymousNotifiable(), new AnonymousNotifiable(),
FormEmailNotification::class, FormEmailNotification::class,
function (FormEmailNotification $notification, $channels, $notifiable) { function (FormEmailNotification $notification, $channels, $notifiable) {
$renderedMail = $notification->toMail($notifiable);
return $notifiable->routes['mail'] === 'test@test.com' && return $notifiable->routes['mail'] === 'test@test.com' &&
$notification->mailer === 'custom_smtp'; config('mail.mailers.custom_smtp.host') === 'custom.smtp.host' &&
config('mail.mailers.custom_smtp.port') === '587' &&
config('mail.mailers.custom_smtp.username') === 'custom_username' &&
config('mail.mailers.custom_smtp.password') === 'custom_password';
} }
); );
}); });