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();
  • Вопрос задан
  • 137 просмотров
Решения вопроса 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 в случае если он пытается отвязать аккаунт
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы
YCLIENTS Москва
от 200 000 до 350 000 ₽
Ведисофт Екатеринбург
от 25 000 ₽
ИТЦ Аусферр Магнитогорск
от 100 000 до 160 000 ₽
25 апр. 2024, в 19:42
49000 руб./за проект
25 апр. 2024, в 19:41
2000 руб./за проект
25 апр. 2024, в 19:22
18000 руб./за проект