UserController.php 7.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253
  1. <?php
  2. namespace App\Controllers\Web;
  3. use App\Utils\Api;
  4. use App\Utils\Url;
  5. use PH7\JustHttp\StatusCode;
  6. use Respect\Validation\Validator as v;
  7. class UserController
  8. {
  9. /*
  10. * Obtiene los nombres de los campos del formulario.
  11. */
  12. private function getFormFields()
  13. {
  14. return [
  15. 'username',
  16. 'email',
  17. 'password',
  18. 'active',
  19. 'is_admin',
  20. 'pass_confirm'
  21. ];
  22. }
  23. /*
  24. * Renderiza el formulario de registro de usuarios.
  25. */
  26. public function new($req, $res)
  27. {
  28. $values = [];
  29. $validations = [];
  30. $error = $req->session['error'] ?? null;
  31. /*
  32. * Obtiene los valores y los mensajes de validación
  33. * de los campos del formulario.
  34. */
  35. foreach ($this->getFormFields() as $field) {
  36. $values[$field] = $req->session['values'][$field] ?? null;
  37. $validations[$field] = $req->session['validations'][$field] ?? null;
  38. }
  39. foreach (['values', 'validations', 'error'] as $key) {
  40. unset($req->session[$key]);
  41. }
  42. $res->render('users/new', [
  43. 'app' => $req->app,
  44. 'values' => $values,
  45. 'validations' => $validations,
  46. 'error' => $error
  47. ]);
  48. }
  49. /*
  50. * Registra un nuevo usuario.
  51. */
  52. public function create($req, $res)
  53. {
  54. $data = [];
  55. // Obtiene los valores de los campos del formulario.
  56. foreach ($this->getFormFields() as $field) {
  57. $data[$field] = $req->body[$field] ?? null;
  58. }
  59. $client = Api::client();
  60. // Realiza la petición de registro del usuario.
  61. $response = $client->post('v1/users', [], $data);
  62. $body = json_decode($response->body ?? '', true);
  63. // Comprueba el cuerpo de la petición.
  64. if (empty($response->success) || empty($body['data'])) {
  65. $req->session['values'] = $data;
  66. // Envía los mensajes de validación de los campos del formulario.
  67. if (!empty($body['validations'])) {
  68. $req->session['validations'] = $body['validations'];
  69. }
  70. // Envía el mensaje de error de la petición..
  71. $req->session['error'] = $body['error'] ?? 'The user could not be created';
  72. $res->redirect(Url::build('users/new'), StatusCode::FOUND);
  73. }
  74. $req->session['success'] = 'The user was created correctly';
  75. $res->redirect(Url::build('users'), StatusCode::FOUND);
  76. }
  77. /*
  78. * Consulta los usuarios registrados.
  79. */
  80. public function index($req, $res)
  81. {
  82. $client = Api::client();
  83. // Realiza la petición de consulta de los usuarios registrados.
  84. $response = $client->get('v1/users');
  85. $body = json_decode($response->body ?? '', true);
  86. $users = $body['data'] ?? [];
  87. $error = $body['error'] ?? $req->session['error'] ?? null;
  88. $success = $req->session['success'] ?? null;
  89. foreach (['success', 'error'] as $key) {
  90. unset($req->session[$key]);
  91. }
  92. $res->render('users/index', [
  93. 'app' => $req->app,
  94. 'users' => $users,
  95. 'success' => $success,
  96. 'error' => $error
  97. ]);
  98. }
  99. /*
  100. * Renderiza el formulario de modificación de usuarios.
  101. */
  102. public function edit($req, $res)
  103. {
  104. $uuid = $req->params['uuid'] ?? '';
  105. $client = Api::client();
  106. /*
  107. * Realiza la petición de consulta
  108. * de la información del usuario.
  109. */
  110. $response = $client->get('v1/users/' . $uuid);
  111. $body = json_decode($response->body ?? '', true);
  112. $user = $body['data'] ?? [];
  113. // Comprueba el cuerpo de la petición.
  114. if (empty($response->success) || empty($user)) {
  115. // Envía el mensaje de error de la petición.
  116. $req->session['error'] = $body['error'] ?? 'The user could not be edited';
  117. $res->redirect(Url::build('users'), StatusCode::FOUND);
  118. }
  119. $validations = [];
  120. $error = $req->session['error'] ?? null;
  121. $success = $req->session['success'] ?? null;
  122. /*
  123. * Obtiene los valores y los mensajes de validación
  124. * de los campos del formulario.
  125. */
  126. foreach ($this->getFormFields() as $field) {
  127. $validations[$field] = $req->session['validations'][$field] ?? null;
  128. }
  129. foreach (['validations', 'error', 'success'] as $key) {
  130. unset($req->session[$key]);
  131. }
  132. $res->render('users/edit', [
  133. 'app' => $req->app,
  134. 'user' => $user,
  135. 'validations' => $validations,
  136. 'error' => $error,
  137. 'success' => $success
  138. ]);
  139. }
  140. /*
  141. * Modifica la información de un usuario.
  142. */
  143. public function update($req, $res)
  144. {
  145. $uuid = $req->params['uuid'] ?? '';
  146. $data = [];
  147. // Obtiene los valores de los campos del formulario.
  148. foreach ($this->getFormFields() as $field) {
  149. $data[$field] = $req->body[$field] ?? null;
  150. }
  151. $client = Api::client();
  152. $headers = ['Content-Type' => 'application/x-www-form-urlencoded'];
  153. // Establece el rol y el estatus del usuario si no encuentran presentes.
  154. foreach (['active', 'is_admin'] as $key) {
  155. if (v::key($key, v::optional(v::falseVal()), false)->validate($data)) {
  156. $data[$key] = (string) (int) false;
  157. }
  158. }
  159. // Realiza la petición de modificación del usuario.
  160. $response = $client->put('v1/users/' . $uuid, $headers, $data);
  161. $body = json_decode($response->body ?? '', true);
  162. // Comprueba el cuerpo de la petición.
  163. if (empty($response->success) || empty($body['data'])) {
  164. // Envía los mensajes de validación de los campos del formulario.
  165. if (!empty($body['validations'])) {
  166. $req->session['validations'] = $body['validations'];
  167. }
  168. // Envía el mensaje de error de la petición.
  169. $req->session['error'] = $body['error'] ?? 'The user could not be updated';
  170. $res->redirect(Url::build('users/edit/' . $uuid), StatusCode::FOUND);
  171. }
  172. $req->session['success'] = 'The user was modified correctly';
  173. $res->redirect(Url::build('users/edit/' . $uuid), StatusCode::FOUND);
  174. }
  175. /*
  176. * Elimina un usuario.
  177. */
  178. public function delete($req, $res)
  179. {
  180. $uuid = $req->params['uuid'] ?? '';
  181. $client = Api::client();
  182. // Realiza la petición de eliminación del usuario.
  183. $response = $client->delete('v1/users/' . $uuid);
  184. $body = json_decode($response->body ?? '', true);
  185. // Comprueba el cuerpo de la petición.
  186. if (empty($response->success) || empty($body['data'])) {
  187. // Envía el mensaje de error de la petición.
  188. $req->session['error'] = $body['error'] ?? 'The user could not be deleted';
  189. $res->redirect(Url::build('users'), StatusCode::FOUND);
  190. }
  191. $req->session['success'] = 'The user was deleted correctly';
  192. $res->redirect(Url::build('users'), StatusCode::FOUND);
  193. }
  194. }