NoteController.php 9.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316
  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 NoteController
  8. {
  9. /*
  10. * Obtiene los nombres de los campos del formulario.
  11. */
  12. private function getFormFields()
  13. {
  14. return ['title', 'body', 'tags'];
  15. }
  16. /*
  17. * Renderiza el formulario de registro de notas.
  18. */
  19. public function new($req, $res)
  20. {
  21. $values = [];
  22. $validations = [];
  23. /*
  24. * Obtiene los valores y los mensajes de validación
  25. * de los campos del formulario.
  26. */
  27. foreach ($this->getFormFields() as $field) {
  28. $values[$field] = $req->session['values'][$field] ?? null;
  29. $validations[$field] = $req->session['validations'][$field] ?? null;
  30. }
  31. $client = Api::client();
  32. // Realiza la petición de consulta de los tags del usuario.
  33. $response = $client->get('v1/tags');
  34. $body = json_decode($response->body ?? '', true);
  35. $tags = $body['data'] ?? [];
  36. $error = $body['error'] ?? $req->session['error'] ?? null;
  37. foreach (['values', 'validations', 'error'] as $key) {
  38. unset($req->session[$key]);
  39. }
  40. $res->render('notes/new', [
  41. 'app' => $req->app,
  42. 'values' => $values,
  43. 'validations' => $validations,
  44. 'tags' => $tags,
  45. 'error' => $error
  46. ]);
  47. }
  48. /*
  49. * Registra la nota de un usuario.
  50. */
  51. public function create($req, $res)
  52. {
  53. $data = [];
  54. // Obtiene los valores de los campos del formulario.
  55. foreach ($this->getFormFields() as $field) {
  56. $data[$field] = $req->body[$field] ?? null;
  57. }
  58. /*
  59. * Asegura no vincular ningún tag a la nota
  60. * si no se encuentra presente.
  61. */
  62. if (!v::key('tags', v::notEmpty(), true)->validate($data)) {
  63. $data['tags'] = '[]';
  64. }
  65. $client = Api::client();
  66. // Realiza la petición del registro de la nota del usuario.
  67. $response = $client->post('v1/notes', [], $data);
  68. $body = json_decode($response->body ?? '', true);
  69. // Comprueba el cuerpo de la petición.
  70. if (empty($response->success) || empty($body['data'])) {
  71. $req->session['values'] = $data;
  72. // Envía los mensajes de validación de los campos del formulario.
  73. if (!empty($body['validations'])) {
  74. $req->session['validations'] = $body['validations'];
  75. }
  76. // Envía el mensaje de error de la petición.
  77. $req->session['error'] = $body['error'] ?? 'The note could not be created';
  78. $res->redirect(Url::build('notes/new'), StatusCode::FOUND);
  79. }
  80. $req->session['success'] = 'The note was created correctly';
  81. $res->redirect(Url::build('notes'), StatusCode::FOUND);
  82. }
  83. /*
  84. * Consulta las notas del usuario.
  85. */
  86. public function index($req, $res)
  87. {
  88. $client = Api::client();
  89. // Realiza la petición de consulta de las notas del usuario.
  90. $response = $client->get('v1/notes');
  91. $body = json_decode($response->body ?? '', true);
  92. $notes = $body['data'] ?? [];
  93. $error = $body['error'] ?? $req->session['error'] ?? null;
  94. $success = $req->session['success'] ?? null;
  95. foreach (['success', 'error'] as $key) {
  96. unset($req->session[$key]);
  97. }
  98. $res->render('notes/index', [
  99. 'app' => $req->app,
  100. 'notes' => $notes,
  101. 'success' => $success,
  102. 'error' => $error
  103. ]);
  104. }
  105. /*
  106. * Renderiza la nota de un usuario.
  107. */
  108. public function show($req, $res)
  109. {
  110. $uuid = $req->params['uuid'] ?? '';
  111. $client = Api::client();
  112. /*
  113. * Realiza la petición de consulta de
  114. * la información de la nota del usuario.
  115. */
  116. $response = $client->get('v1/notes/' . $uuid);
  117. $body = json_decode($response->body ?? '', true);
  118. $note = $body['data'] ?? [];
  119. // Comprueba el cuerpo de la petición.
  120. if (empty($response->success) || empty($note)) {
  121. // Envía el mensaje de error de la petición.
  122. $req->session['error'] = $body['error'] ?? 'The note could not be displayed';
  123. $res->redirect(Url::build('notes'), StatusCode::FOUND);
  124. }
  125. $res->render('notes/show', [
  126. 'app' => $req->app,
  127. 'note' => $note
  128. ]);
  129. }
  130. /*
  131. * Renderiza el formulario de modificación de notas.
  132. */
  133. public function edit($req, $res)
  134. {
  135. $uuid = $req->params['uuid'] ?? '';
  136. $client = Api::client();
  137. /*
  138. * Realiza la petición de consulta de
  139. * la información de la nota del usuario.
  140. */
  141. $noteResponse = $client->get('v1/notes/' . $uuid);
  142. $noteBody = json_decode($noteResponse->body ?? '', true);
  143. $note = $noteBody['data'] ?? [];
  144. // Comprueba el cuerpo de la petición.
  145. if (empty($noteResponse->success) || empty($note)) {
  146. // Envía el mensaje de error de la petición.
  147. $req->session['error'] = $noteBody['error'] ?? 'The note could not be edited';
  148. $res->redirect(Url::build('notes'), StatusCode::FOUND);
  149. }
  150. // Realiza la petición de consulta de los tags del usuario.
  151. $tagsResponse = $client->get('v1/tags');
  152. $tagsBody = json_decode($tagsResponse->body ?? '', true);
  153. $tags = $tagsBody['data'] ?? [];
  154. $validations = [];
  155. $error = $tagsBody['error'] ?? $req->session['error'] ?? null;
  156. $success = $req->session['success'] ?? null;
  157. $noteTagsIDs = array_column($note['tags'], 'id');
  158. // Marca los tags seleccionados desde los tags de la nota.
  159. foreach ($tags as &$tag) {
  160. $tag['selected'] = in_array($tag['id'], $noteTagsIDs);
  161. }
  162. unset($tag);
  163. /*
  164. * Obtiene los valores y los mensajes de validación
  165. * de los campos del formulario.
  166. */
  167. foreach ($this->getFormFields() as $field) {
  168. $validations[$field] = $req->session['validations'][$field] ?? null;
  169. }
  170. foreach (['validations', 'error', 'success'] as $key) {
  171. unset($req->session[$key]);
  172. }
  173. $res->render('notes/edit', [
  174. 'app' => $req->app,
  175. 'note' => $note,
  176. 'tags' => $tags,
  177. 'validations' => $validations,
  178. 'error' => $error,
  179. 'success' => $success
  180. ]);
  181. }
  182. /*
  183. * Modifica la nota de un usuario.
  184. */
  185. public function update($req, $res)
  186. {
  187. $uuid = $req->params['uuid'] ?? '';
  188. $data = [];
  189. // Obtiene los valores de los campos del formulario.
  190. foreach ($this->getFormFields() as $field) {
  191. $data[$field] = $req->body[$field] ?? null;
  192. }
  193. /*
  194. * Asegura eliminar todos los tags de la nota
  195. * si no se encuentra presente.
  196. */
  197. if (!v::key('tags', v::notEmpty(), true)->validate($data)) {
  198. $data['tags'] = '[]';
  199. }
  200. $client = Api::client();
  201. $headers = ['Content-Type' => 'application/x-www-form-urlencoded'];
  202. // Realiza la petición de modificación de la nota del usuario.
  203. $response = $client->put('v1/notes/' . $uuid, $headers, $data);
  204. $body = json_decode($response->body ?? '', true);
  205. // Comprueba el cuerpo de la petición.
  206. if (empty($response->success) || empty($body['data'])) {
  207. // Envía los mensajes de validación de los campos del formulario.
  208. if (!empty($body['validations'])) {
  209. $req->session['validations'] = $body['validations'];
  210. }
  211. // Envía el mensaje de error de la petición.
  212. $req->session['error'] = $body['error'] ?? 'The note could not be updated';
  213. $res->redirect(Url::build('notes/edit/' . $uuid), StatusCode::FOUND);
  214. }
  215. $req->session['success'] = 'The note was modified correctly';
  216. $res->redirect(Url::build('notes/edit/' . $uuid), StatusCode::FOUND);
  217. }
  218. /*
  219. * Elimina la nota de un usuario.
  220. */
  221. public function delete($req, $res)
  222. {
  223. $uuid = $req->params['uuid'] ?? '';
  224. $client = Api::client();
  225. // Realiza la petición de eliminación de la nota del usuario.
  226. $response = $client->delete('v1/notes/' . $uuid);
  227. $body = json_decode($response->body ?? '', true);
  228. // Comprueba el cuerpo de la petición.
  229. if (empty($response->success) || empty($body['data'])) {
  230. // Envía el mensaje de error de la petición.
  231. $req->session['error'] = $body['error'] ?? 'The note could not be deleted';
  232. $res->redirect(Url::build('notes'), StatusCode::FOUND);
  233. }
  234. $req->session['success'] = 'The note was deleted correctly';
  235. $res->redirect(Url::build('notes'), StatusCode::FOUND);
  236. }
  237. }