В общем, имеется следующее: есть таблица networks и таблица users. При первой авторизации (авторизация только через соц сети) пользователь добавляется и в таблицу networks, и в таблицу users. При привязке аккаунта смотрится, нет ли уже такой соц сети в двух таблицах. Если есть, выкидывается exception, что аккаунт привязан за кем-то. Если нет, добавляем запись только в таблицу networks (связь с users many to one). В результате при входе из какой-то соц сети сначала смотрится на запись в networks и через нее достается юзер в таблице users. Вроде бы все просто. Но как быть с отвязкой, если наличие почты обязательно? То есть идем по условиям: если аккаунт остался один, то просто выкидываем exception, что отвязать нельзя. Но если пользователь хочет отвязать соц сеть, которая хранится в users и networks, а не только в networks, но при этом в networks у него есть еще 2 соц сети, то как отвязываем? Можно, например, взять данные любой другой соц сети из списка и заменить ими запись в users, ну и рефрешить сессию, чтобы юзера не заставлять логиниться по новой. Однако мне кажется, это неправильно. Кто что может посоветовать?
Данные:
Табл. users
uuid | client_id | email | auth_at | updated_at
Табл. networks
uuid | user_id | client_id | email
Примерный хэндлер
if ($command->user->getNetworks()->count() === 1) {
throw new \DomainException('Нельзя отвязать последнюю соц сеть');
}
if ($command->user->getClientId() ===
$this->networkRepository->findOneBy(['clientId' => $command->clientId])
) {
// Надо понять, что делать в этой итерации
}
$command->user->detachNetwork(
$command->network,
$command->clientId
);
$this->em->flush();