UserModel.php 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  1. <?php
  2. namespace Models;
  3. class UserModel
  4. {
  5. private \PDO $pdo;
  6. public function __construct()
  7. {
  8. // Conecta ao DB usando variável do .env
  9. $dbFile = $_ENV['DB_FILE'];
  10. $dbPath = __DIR__ . '/../' . $dbFile;
  11. $this->pdo = new \PDO("sqlite:" . $dbPath);
  12. $this->pdo->setAttribute(\PDO::ATTR_ERRMODE, \PDO::ERRMODE_EXCEPTION);
  13. }
  14. /**
  15. * Valida credenciais de login e retorna dados do usuário se válido.
  16. *
  17. * @param string $username
  18. * @param string $password Plain-text password para verificar
  19. * @return array|null Dados do usuário (user_id, user_name, etc.) ou null se inválido
  20. */
  21. public function validateLogin(string $username, string $password): ?array
  22. {
  23. $stmt = $this->pdo->prepare("SELECT user_id, user_name, user_password, role_id FROM user WHERE user_name = :username AND user_flag = 'a'");
  24. $stmt->execute(['username' => $username]);
  25. $user = $stmt->fetch(\PDO::FETCH_ASSOC);
  26. if ($user && password_verify($password, $user['user_password'])) {
  27. unset($user['password']); // Remove hash por segurança
  28. return $user;
  29. }
  30. return null;
  31. }
  32. /**
  33. * Cria um novo usuário com senha hasheada e gera chaves API.
  34. *
  35. * @param string $username
  36. * @param string $password Plain-text password
  37. * @param string $flag Default 'a' para ativo
  38. * @return array|bool Dados do usuário criado (incluindo api_key) ou false em erro
  39. */
  40. public function createUser(string $username, string $email, string $password, int $company_id, int $role_id, string $flag = 'a')
  41. {
  42. // Verifica se username já existe
  43. $stmt = $this->pdo->prepare("SELECT user_id FROM user WHERE user_name = :username");
  44. $stmt->execute(['username' => $username]);
  45. if ($stmt->fetch()) {
  46. return false; // Já existe
  47. }
  48. $hash = password_hash($password, PASSWORD_DEFAULT);
  49. // Insere usuário
  50. $stmt = $this->pdo->prepare("INSERT INTO user (user_name, user_email, user_flag, user_password, company_id, role_id) VALUES (:username, :email, :flag, :hash, :company_id, :role_id)");
  51. if (!$stmt->execute(['username' => $username, 'email' => $email, 'flag' => $flag, 'hash' => $hash, 'company_id' => $company_id, 'role_id' => $role_id])) {
  52. return false;
  53. }
  54. $userId = $this->pdo->lastInsertId();
  55. // Gera e insere chaves API (random para HMAC)
  56. $apiKey = bin2hex(random_bytes(16)); // Ex: 32 chars hex
  57. $apiSecret = bin2hex(random_bytes(32)); // Mais longo para secret
  58. $stmt = $this->pdo->prepare("INSERT INTO api_key (user_id, api_key_user, api_key_secret) VALUES (:user_id, :api_key, :api_secret)");
  59. if (!$stmt->execute(['user_id' => $userId, 'api_key' => $apiKey, 'api_secret' => $apiSecret])) {
  60. return false;
  61. }
  62. return [
  63. 'user_id' => $userId,
  64. 'user_name' => $username,
  65. 'api_key_user' => $apiKey,
  66. 'api_key_secret' => $apiSecret // Retorne para o usuário (apenas uma vez!)
  67. ];
  68. }
  69. }