LoginController.php 1.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657
  1. <?php
  2. namespace Controllers;
  3. use Firebase\JWT\JWT;
  4. use Libs\Logger;
  5. use Libs\Payload;
  6. use Libs\Validator;
  7. use Models\UserModel;
  8. use Psr\Http\Message\ServerRequestInterface;
  9. class LoginController
  10. {
  11. public function __invoke(ServerRequestInterface $request)
  12. {
  13. $body = json_decode((string) $request->getBody(), true) ?: [];
  14. $email = $body['email'] ?? $body['user_email'] ?? '';
  15. $password = $body['password'] ?? '';
  16. $validator = (new Validator(['email' => $email, 'password' => $password]))
  17. ->required('email')->email('email')->maxLength('email', 255)
  18. ->required('password');
  19. if ($validator->fails()) {
  20. return Payload::fail($validator->firstError(), [], 'E_VALIDATE', 400);
  21. }
  22. $secret = $_ENV['JWT_SECRET'] ?? '';
  23. if ($secret === '') {
  24. Logger::error('JWT_SECRET is not configured; cannot issue tokens');
  25. return Payload::fail('Internal server error', [], 'E_GENERIC', 500);
  26. }
  27. $userModel = new UserModel();
  28. $user = $userModel->validateLogin($email, $password);
  29. if (!$user) {
  30. return Payload::fail('Invalid credentials', [], 'E_VALIDATE', 401);
  31. }
  32. $payload = [
  33. 'sub' => $user['user_id'],
  34. 'email' => $user['user_email'],
  35. 'company_id' => $user['company_id'],
  36. 'role' => $user['user_role'],
  37. 'iat' => time(),
  38. 'exp' => time() + 3600
  39. ];
  40. $jwt = JWT::encode($payload, $secret, 'HS256');
  41. return Payload::ok([
  42. 'token' => $jwt,
  43. 'user' => $user,
  44. ]);
  45. }
  46. }