UserModel.php 3.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495
  1. <?php
  2. namespace Models;
  3. use Libs\Database;
  4. class UserModel
  5. {
  6. private \PDO $pdo;
  7. public function __construct()
  8. {
  9. $this->pdo = Database::pdo();
  10. }
  11. /**
  12. * Valida credenciais de login e retorna dados do usuário se válido.
  13. *
  14. * @param string $username
  15. * @param string $password Plain-text password para verificar
  16. * @return array|null Dados do usuário (user_id, user_name, etc.) ou null se inválido
  17. */
  18. public function validateLogin(string $email, string $password): ?array
  19. {
  20. $stmt = $this->pdo->prepare("SELECT user_id, company_id, user_name, user_phone, user_email, user_role, user_password FROM \"user\" WHERE user_email = :email AND user_deleted_at = 'infinity'");
  21. $stmt->execute(['email' => mb_strtolower(trim($email))]);
  22. $user = $stmt->fetch(\PDO::FETCH_ASSOC);
  23. if ($user && password_verify($password, $user['user_password'])) {
  24. unset($user['user_password']);
  25. return $user;
  26. }
  27. return null;
  28. }
  29. /**
  30. * Cria um novo usuário com senha hasheada e gera chaves API.
  31. *
  32. * @param string $username
  33. * @param string $password Plain-text password
  34. * @param string $flag Default 'a' para ativo
  35. * @return array|bool Dados do usuário criado (incluindo api_key) ou false em erro
  36. */
  37. public function createUser(int $companyId, string $email, string $password, string $phone, string $role, ?string $name = null)
  38. {
  39. $normalizedEmail = mb_strtolower(trim($email));
  40. $normalizedPhone = trim($phone);
  41. $normalizedRole = trim($role);
  42. $normalizedName = $name !== null ? trim($name) : null;
  43. if ($normalizedName === '') {
  44. $normalizedName = null;
  45. }
  46. $stmt = $this->pdo->prepare('SELECT user_id FROM "user" WHERE user_email = :email');
  47. $stmt->execute(['email' => $normalizedEmail]);
  48. if ($stmt->fetch()) {
  49. return false;
  50. }
  51. $hash = password_hash($password, PASSWORD_DEFAULT);
  52. try {
  53. $stmt = $this->pdo->prepare("INSERT INTO \"user\" (company_id, user_name, user_phone, user_email, user_role, user_password) VALUES (:company_id, :user_name, :user_phone, :user_email, :user_role, :user_password) RETURNING user_id, company_id, user_name, user_phone, user_email, user_role, user_created_at");
  54. $stmt->execute([
  55. 'company_id' => $companyId,
  56. 'user_name' => $normalizedName,
  57. 'user_phone' => $normalizedPhone,
  58. 'user_email' => $normalizedEmail,
  59. 'user_role' => $normalizedRole,
  60. 'user_password' => $hash,
  61. ]);
  62. $createdUser = $stmt->fetch(\PDO::FETCH_ASSOC);
  63. } catch (\PDOException $e) {
  64. return false;
  65. }
  66. if (!$createdUser) {
  67. return false;
  68. }
  69. return [
  70. 'user_id' => (int) $createdUser['user_id'],
  71. 'company_id' => (int) $createdUser['company_id'],
  72. 'user_name' => $createdUser['user_name'],
  73. 'user_phone' => $createdUser['user_phone'],
  74. 'user_email' => $createdUser['user_email'],
  75. 'user_role' => $createdUser['user_role'],
  76. 'user_created_at' => $createdUser['user_created_at'],
  77. ];
  78. }
  79. }