<?php
declare(strict_types=1);
namespace Harmonizely\EventSubscriber;
use Harmonizely\Mailer\UserMailer;
use Harmonizely\Model\Member;
use Harmonizely\Organization\OrganizationEvents;
use Harmonizely\Service\Core\Contract\ICompanySelector;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\EventDispatcher\GenericEvent;
final class SendMembershipInvitationEmailSubscriber implements EventSubscriberInterface
{
public const TEMPLATE = 'join_organization.html.twig';
public const TEMPLATE_SSO = 'join_organization_sso.html.twig';
/**
* @var UserMailer
*/
private UserMailer $mailer;
/**
* @var ICompanySelector
*/
private ICompanySelector $companySelector;
/**
* SendMembershipInvitationEmailSubscriber constructor.
* @param UserMailer $mailer
* @param ICompanySelector $companySelector
*/
public function __construct(
UserMailer $mailer,
ICompanySelector $companySelector
)
{
$this->mailer = $mailer;
$this->companySelector = $companySelector;
}
/**
* {@inheritdoc}
*/
public static function getSubscribedEvents(): array
{
return [
OrganizationEvents::MEMBER_POST_CREATE => 'onMemberCreate',
];
}
public function onMemberCreate(GenericEvent $event): void
{
if (!$this->companySelector->isDefaultCompany()) {
return;
}
/** @var Member $member */
$member = $event->getSubject();
$organization = $member->getOrganization();
$organizationName = $organization->getName();
if ($member->getUser()->getUserSso()) {
$template = self::TEMPLATE_SSO;
$title = "Joined the '$organizationName' organization on SimplyMeet.me";
} else {
$template = self::TEMPLATE;
$title = "Join the '$organizationName' organization on SimplyMeet.me";
}
$owners = $organization->getEnabledOwners();
/** @var Member $owner */
$owner = $owners[array_key_first($owners)];
$this->mailer->send(
$owner->getUser(),
$template,
$title,
[$member->getUser()->getEmail()],
[
'user' => $owner->getUser(),
'member' => $member,
'organizationName' => $organizationName,
'allowLoginAsUser' => $organization->isAllowLoginAsUser(),
'recipient' => $member->getUser()->getEmail(),
'is_admin' => true,
],
$organizationName
);
}
}