RegisterController.php 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  1. <?php
  2. namespace Controllers;
  3. use Libs\Logger;
  4. use Libs\ResponseLib;
  5. use Libs\Validator;
  6. use Models\UserModel;
  7. use Psr\Http\Message\ServerRequestInterface;
  8. class RegisterController
  9. {
  10. private UserModel $userModel;
  11. public function __construct()
  12. {
  13. $this->userModel = new UserModel();
  14. }
  15. public function __invoke(ServerRequestInterface $request)
  16. {
  17. // company_id NÃO vem mais do body: é herdado do usuário autenticado (JWT).
  18. // Isso impede que alguém se registre sob uma empresa arbitrária.
  19. $userId = (int) ($request->getAttribute('user_id') ?? 0);
  20. if ($userId <= 0) {
  21. return ResponseLib::sendFail("Unauthorized: Missing authenticated user", [], "E_VALIDATE")->withStatus(401);
  22. }
  23. $body = json_decode((string) $request->getBody(), true) ?: [];
  24. $name = $body['name'] ?? $body['user_name'] ?? null;
  25. $phone = $body['phone'] ?? $body['user_phone'] ?? '';
  26. $email = $body['email'] ?? $body['user_email'] ?? '';
  27. $role = $body['role'] ?? $body['user_role'] ?? '';
  28. $password = $body['password'] ?? '';
  29. $validator = (new Validator([
  30. 'name' => $name,
  31. 'phone' => $phone,
  32. 'email' => $email,
  33. 'role' => $role,
  34. 'password' => $password,
  35. ]))
  36. ->maxLength('name', 120)
  37. ->required('phone')->phone('phone')
  38. ->required('email')->email('email')->maxLength('email', 255)
  39. ->required('role')->maxLength('role', 50)
  40. ->required('password')->minLength('password', 8)->maxLength('password', 255);
  41. if ($validator->fails()) {
  42. return ResponseLib::sendFail($validator->firstError(), [], "E_VALIDATE")->withStatus(400);
  43. }
  44. try {
  45. $companyId = $this->userModel->getCompanyIdByUserId($userId);
  46. if ($companyId === null) {
  47. return ResponseLib::sendFail("User not found", [], "E_NOT_FOUND")->withStatus(404);
  48. }
  49. $userData = $this->userModel->createUser($companyId, $email, $password, $phone, $role, $name);
  50. if (!$userData) {
  51. return ResponseLib::sendFail("Email already exists or creation failed", [], "E_VALIDATE")->withStatus(400);
  52. }
  53. return ResponseLib::sendOk($userData, "S_CREATED", "User created.");
  54. } catch (\Throwable $e) {
  55. Logger::error('Failed to register user', ['error' => $e->getMessage()]);
  56. return ResponseLib::sendFail("Failed to register user", [], "E_GENERIC")->withStatus(500);
  57. }
  58. }
  59. }