<?php
declare(strict_types=1);
namespace Harmonizely\Organization\EventSubscriber;
use Doctrine\ORM\EntityManagerInterface;
use Harmonizely\Model\Member;
use Harmonizely\Organization\Copier\UserSettingsCopier;
use Harmonizely\Organization\OrganizationEvents;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\EventDispatcher\GenericEvent;
/**
* When an existing user accepts an organization invitation that requested
* cloning settings from another user, perform the copy at accept time and
* replace the invitee's own settings. The source user is stored on the Member
* at invite time (see ExistingUserMemberInviter). New users are handled at
* invite time instead, so they never reach this path (CY1SMDV1-578).
*/
final class CopyMemberSettingsOnJoinSubscriber implements EventSubscriberInterface
{
private UserSettingsCopier $userSettingsCopier;
private EntityManagerInterface $entityManager;
public function __construct(
UserSettingsCopier $userSettingsCopier,
EntityManagerInterface $entityManager
) {
$this->userSettingsCopier = $userSettingsCopier;
$this->entityManager = $entityManager;
}
/**
* @return string[]
*/
public static function getSubscribedEvents(): array
{
return [
OrganizationEvents::MEMBER_POST_JOIN => 'memberPostJoin',
];
}
public function memberPostJoin(GenericEvent $event): void
{
/** @var Member $member */
$member = $event->getSubject();
$fromUser = $member->getCopyFromUser();
if (null === $fromUser) {
return;
}
$this->userSettingsCopier->copy($fromUser, $member->getUser(), false, true);
$member->setCopyFromUser(null);
$this->entityManager->flush();
}
}