ProfileController.php 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135
  1. <?php
  2. namespace App\Controllers\Api;
  3. use App\Models\UserModel;
  4. use App\Utils\DB;
  5. use App\Utils\Password;
  6. use PH7\JustHttp\StatusCode;
  7. use Respect\Validation\Exceptions\NestedValidationException;
  8. use Respect\Validation\Validator as v;
  9. class ProfileController
  10. {
  11. /*
  12. * Obtiene las reglas de validación.
  13. */
  14. private function getValidationRules()
  15. {
  16. return [
  17. 'email' => v::stringType()->notEmpty()->email()->length(4, 255, true),
  18. 'username' => v::stringType()->notEmpty()->alnum()->length(4, 32, true),
  19. 'password' => v::stringType()->notEmpty()->graph()->length(8, 64, true),
  20. 'pass_confirm' => 'equals'
  21. ];
  22. }
  23. /*
  24. * Modifica o actualiza el perfil
  25. * del usuario autenticado.
  26. */
  27. public function update($req, $res)
  28. {
  29. $data = [];
  30. $rules = $this->getValidationRules();
  31. // Obtiene los campos del cuerpo de la petición.
  32. foreach (array_keys($rules) as $field) {
  33. if (v::key($field, v::notOptional(), true)->validate($req->body)) {
  34. $data[$field] = $req->body[$field];
  35. }
  36. }
  37. // Comprueba los campos del cuerpo de la petición.
  38. try {
  39. v::key('email', $rules['email'], false)
  40. ->key('username', $rules['username'], false)
  41. ->key('password', $rules['password'], false)
  42. ->assert($data);
  43. /*
  44. * Comprueba la confirmación de la contraseña
  45. * si la contraseña se encuentra presente.
  46. */
  47. if (v::key('password', v::notOptional(), true)->validate($data)) {
  48. v::keyValue('pass_confirm', $rules['pass_confirm'], 'password')
  49. ->assert($data);
  50. // Encripta la nueva contraseña del usuario autenticado.
  51. $data['password'] = Password::encrypt($data['password']);
  52. }
  53. } catch (NestedValidationException $e) {
  54. $res->status(StatusCode::BAD_REQUEST)->json([
  55. 'validations' => $e->getMessages()
  56. ]);
  57. }
  58. unset($data['pass_confirm']);
  59. $userAuth = $req->app->local('userAuth');
  60. $userModel = UserModel::factory();
  61. /*
  62. * Comprueba que el email del usuario autenticado
  63. * sea único solo si se encuentra presente.
  64. */
  65. if (v::key('email', v::notOptional(), true)->validate($data)) {
  66. $data['email'] = mb_strtolower($data['email']);
  67. $existsEmail = $userModel
  68. ->reset()
  69. ->select('id')
  70. ->where('email', $data['email'])
  71. ->where('id', '!=', $userAuth['id'])
  72. ->value('id');
  73. if (!empty($existsEmail)) {
  74. $res->status(StatusCode::CONFLICT)->json([
  75. 'error' => 'A user already exists with that email'
  76. ]);
  77. }
  78. }
  79. /*
  80. * Comprueba que el nombre del usuario autenticado
  81. * sea único solo si se encuentra presente.
  82. */
  83. if (v::key(('username'), v::notOptional(), true)->validate($data)) {
  84. $existsUsername = $userModel
  85. ->reset()
  86. ->select('id')
  87. ->where('username', $data['username'])
  88. ->where('id', '!=', $userAuth['id'])
  89. ->value('id');
  90. if (!empty($existsUsername)) {
  91. $res->status(StatusCode::CONFLICT)->json([
  92. 'error' => 'A user already exists with that username'
  93. ]);
  94. }
  95. }
  96. // Modifica total o parcialmente la información del usuario autenticado.
  97. if (!empty($data)) {
  98. $data['updated_at'] = DB::datetime();
  99. $userModel
  100. ->reset()
  101. ->where('id', $userAuth['id'])
  102. ->update($data);
  103. }
  104. // Consulta la información modificada del usuario autenticado.
  105. $updatedUserAuth = $userModel
  106. ->reset()
  107. ->select('id, username, email, active, is_admin, created_at, updated_at')
  108. ->find($userAuth['id']);
  109. $res->json([
  110. 'data' => $updatedUserAuth
  111. ]);
  112. }
  113. }