mad_maximus
@mad_maximus

Как правильно сделать отвязывание аккаунта?

В общем, имеется следующее: есть таблица 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();
  • Вопрос задан
  • 142 просмотра
Решения вопроса 1
Decadal
@Decadal
Есть понятие Primary Email - это контактная информация, куда направляются все запросы (по смене пароля, уведомления и тд). При вашей архитектуре email в users является таким Primary Email, а в networks - список secondary emails. Не самое красивое решение в итоге, но у вас есть следующие варианты:
1) стянуть связанные соц сети и выбрать какой-нибудь email оттуда
$networks = $this->networkRepository->findBy(['clientId' => $command->clientId]);
foreach ($networks as $net) 
{
// здесь логика по которой вы решаете какой именно secondary email делать primary. 
// если решения нет (например нет ни одного акка с email), выбивать ту же ошибку что и при count === 1
}
// решение есть, значит получен некий email

//задаете новый primary, желательно перед этим проверить что нет юзера с таким праймари
$user->setEmail($email);


2) предложить пользователю самостоятельно выбирать Primary Email в случае если он пытается отвязать аккаунт
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы