Load.php 3.2 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\User;
  10. use ForkBB\Models\Action;
  11. use ForkBB\Models\User\User;
  12. use InvalidArgumentException;
  13. use ForkBB\Core\Exceptions\ForkException;
  14. class Load extends Action
  15. {
  16. /**
  17. * Создает текст запрос
  18. */
  19. protected function getSql(string $where): string
  20. {
  21. $query = 'SELECT u.*, g.*
  22. FROM ::users AS u
  23. LEFT JOIN ::groups AS g ON u.group_id=g.g_id
  24. WHERE ' . $where;
  25. return $query;
  26. }
  27. /**
  28. * Загружает пользователя из БД
  29. */
  30. public function load(int $id): ?User
  31. {
  32. if ($id < 1) {
  33. throw new InvalidArgumentException('Expected a positive user id');
  34. }
  35. $vars = [
  36. ':id' => $id,
  37. ];
  38. $query = $this->getSql('u.id=?i:id');
  39. $data = $this->c->DB->query($query, $vars)->fetch();
  40. return empty($data['id']) ? null : $this->manager->create($data);
  41. }
  42. /**
  43. * Загружает список пользователей из БД
  44. */
  45. public function loadByIds(array $ids): array
  46. {
  47. foreach ($ids as $id) {
  48. if (
  49. ! \is_int($id)
  50. || $id < 1
  51. ) {
  52. throw new InvalidArgumentException('Expected a positive user id');
  53. }
  54. }
  55. $vars = [
  56. ':ids' => $ids,
  57. ];
  58. $query = $this->getSql('u.id IN (?ai:ids)');
  59. $data = $this->c->DB->query($query, $vars)->fetchAll();
  60. $result = [];
  61. foreach ($data as $row) {
  62. $result[] = $this->manager->create($row);
  63. }
  64. return $result;
  65. }
  66. /**
  67. * Возвращает результат
  68. */
  69. protected function returnUser(string $query, array $vars): ?User
  70. {
  71. $data = $this->c->DB->query($query, $vars)->fetchAll();
  72. if (empty($data)) {
  73. return null;
  74. } elseif (\count($data) > 1) {
  75. throw new ForkException('Multiple users found');
  76. } else {
  77. return $this->manager->create($data[0]);
  78. }
  79. }
  80. /**
  81. * Получает пользователя по имени
  82. */
  83. public function loadByName(string $name, bool $caseInsencytive = false): ?User
  84. {
  85. $vars = [
  86. ':name' => $name,
  87. ];
  88. $where = 'u.username=?s:name';
  89. $query = $this->getSql($where);
  90. $user = $this->returnUser($query, $vars);
  91. if (
  92. ! $user instanceof User
  93. || (
  94. false === $caseInsencytive
  95. && $name !== $user->username
  96. )
  97. ) {
  98. return null;
  99. } else {
  100. return $user;
  101. }
  102. }
  103. /**
  104. * Получает пользователя по email
  105. */
  106. public function loadByEmail(string $email): ?User
  107. {
  108. $vars = [
  109. ':email' => $this->c->NormEmail->normalize($email),
  110. ];
  111. $query = $this->getSql('u.email_normal=?s:email');
  112. return $this->returnUser($query, $vars);
  113. }
  114. }