ProviderUser.php 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135
  1. <?php
  2. /**
  3. * This file is part of the ForkBB <https://github.com/forkbb>.
  4. *
  5. * @copyright (c) Visman <mio.visman@yandex.ru, https://github.com/MioVisman>
  6. * @license The MIT License (MIT)
  7. */
  8. declare(strict_types=1);
  9. namespace ForkBB\Models\ProviderUser;
  10. use ForkBB\Core\Container;
  11. use ForkBB\Models\Model;
  12. use ForkBB\Models\Provider\Driver;
  13. use ForkBB\Models\User\User;
  14. use PDO;
  15. use RuntimeException;
  16. class ProviderUser extends Model
  17. {
  18. /**
  19. * Ключ модели для контейнера
  20. */
  21. protected string $cKey = 'ProvUser';
  22. /**
  23. * Возращает id локального пользователя по данным провайдера или 0
  24. * Поиск идет по провайдеру и идентификатору пользователя
  25. */
  26. public function findUser(Driver $provider): int
  27. {
  28. if ('' == $provider->userId) {
  29. throw new RuntimeException('The user ID is empty');
  30. }
  31. $vars = [
  32. ':name' => $provider->name,
  33. ':id' => $provider->userId,
  34. ];
  35. $query = 'SELECT pu.uid
  36. FROM ::providers_users AS pu
  37. WHERE pu.pr_name=?s:name AND pu.pu_uid=?s:id';
  38. $result = $this->c->DB->query($query, $vars)->fetchAll(PDO::FETCH_COLUMN);
  39. $count = \count($result);
  40. if ($count > 1) {
  41. throw new RuntimeException("Many entries for '{$provider->name}-{$provider->userId}'");
  42. }
  43. return $count ? \array_pop($result) : 0;
  44. }
  45. /**
  46. * Возращает id локального пользователя по данным провайдера или 0
  47. * Поиск идет по email
  48. */
  49. public function findEmail(Driver $provider): int
  50. {
  51. if ('' == $provider->userEmail) {
  52. throw new RuntimeException('The user email is empty');
  53. }
  54. $vars = [
  55. ':email' => $this->c->NormEmail->normalize($provider->userEmail),
  56. ];
  57. $query = 'SELECT pu.uid
  58. FROM ::providers_users AS pu
  59. WHERE pu.pu_email_normal=?s:email
  60. GROUP BY pu.uid';
  61. $result = $this->c->DB->query($query, $vars)->fetchAll(PDO::FETCH_COLUMN);
  62. $count = \count($result);
  63. if ($count > 1) {
  64. throw new RuntimeException("Many entries for '{$provider->userEmail}'");
  65. }
  66. return $count ? \array_pop($result) : 0;
  67. }
  68. /**
  69. * Создает новую связь между пользователем и провайдером
  70. */
  71. public function registration(User $user, Driver $provider): bool
  72. {
  73. if ($user->isGuest) {
  74. throw new RuntimeException('User expected, not guest');
  75. }
  76. if ('' == $provider->userId) {
  77. throw new RuntimeException('The user ID is empty');
  78. }
  79. if ('' == $provider->userEmail) {
  80. throw new RuntimeException('The user email is empty');
  81. }
  82. $vars = [
  83. ':uid' => $user->id,
  84. ':name' => $provider->name,
  85. ':userid' => $provider->userId,
  86. ':email' => $provider->userEmail,
  87. ':normal' => $this->c->NormEmail->normalize($provider->userEmail),
  88. ':verif' => $provider->userEmailVerifed ? 1 : 0,
  89. ];
  90. $query = 'INSERT INTO ::providers_users (uid, pr_name, pu_uid, pu_email, pu_email_normal, pu_email_verified)
  91. VALUES (?i:uid, ?s:name, ?s:userid, ?s:email, ?s:normal, ?i:verif)';
  92. return false !== $this->c->DB->exec($query, $vars);
  93. }
  94. /**
  95. * Удаляет записи удаляемых пользователей
  96. */
  97. public function delete(User ...$users): void
  98. {
  99. $ids = [];
  100. foreach ($users as $user) {
  101. $ids[$user->id] = $user->id;
  102. }
  103. $vars = [
  104. ':users' => $ids,
  105. ];
  106. $query = 'DELETE
  107. FROM ::providers_users
  108. WHERE uid IN (?ai:users)';
  109. $this->c->DB->exec($query, $vars);
  110. }
  111. }