Bitácora de crédito (Vol. 4)

por Halí - publicado: Agosto 10, 2023
LaravelBackend

Este sprint vamos a implementar la lógica de los controladores. Un controlador sirve para procesar las solicitudes que le hacemos a nuestra API y devolver ciertos datos con base en las mismas.

Ahora vamos a interactuar con la base de datos y con las solicitudes que hicimos la semana pasada.

Índice

Controladores

Laravel ya hizo un archivo para nosotros llamado CreditCardController, donde se encuentran los métodos asociados a cada tipo de solicitud.

Como estamos haciendo una API REST *, nos basaremos en verbos y sustantivos. Verbos en los métodos HTTP y sustantivos para determinar que recursos queremos acceder.

Así en nuestro controlador de tarjetas de crédito tenemos los siguientes 5 métodos:

  • index -> GET /credit-cards
  • store -> POST /credit-cards
  • show -> GET /credit-cards/{creditCard}
  • update -> PUT /credit-cards/{creditCard}
  • delete -> DELETE /credit-cards

En nuestro controlador tenemos también un método de PHP nativo que funciona para crear o construir las clases, llamado __construct donde agregamos la autorización del recurso para el usuario que ha iniciado sesión.

Index

Para el índice de nuestro recurso, queremos mostrar todas las tarjetas pertenecientes a un usuario, así que obtenemos los datos de mysql con el ORM y luego los devolvemos con algunos vínculos que necesitamos.

Para ello haremos uso de los recursos de Laravel. Entonces creamos una coleción CreditCardCollection y un recurso CreditCardResource y los movemos a la carpeta deseada con los comandos:

sail artisan make:resource CreditCardCollection
sail artisan make:resource CreditCardResource
mv app/Http/Resources/*.php app/API/CreditCard/v1/

El recurso es para una tarjeta individual y la colección es para una lista de tarjetas.

Actualizamos el namespace de los archivos y luego agregamos un atributo más a los datos de nuestro recurso, la url de cada elemento. Ahora sí estamos listos para agregarlo a nuestro controlador.

Ver código  (GitHub)

En este commit también agregamos una relación al modelo User para poder obtener sus tarjetas de crédito asociadas.

Store

Para almacenar la tarjeta en nuestra base de datos (no realmente, solo el nombre y algunos datos necesarios), podemos utilizar la relación de usuarios con las tarjetas para no tener que recibir el uuid de usuario explicitamente.

Ver código  (GitHub)

Nota: todavía no está listo para ser usado en producción ya que queremos cifrar algunos datos sensibles como el límite de crédito en la base de datos.

Cifrado

Para cifrar datos utilizaremos los casts de Laravel. Ahora bien, tenemos que hacer unas modificaciones a nuestra tabla de credit_cards, cómo todavía no hemos desplegado esto en producción, vamos a actualizar la migración original.

Actualizamos y luego hacemos una migración fresca de las tablas.

sail artisan migrate:fresh --step

Luego podemos crear nuestros datos de prueba, pero nuestro límite de crédito ya estará cifrado en la base de datos.

Ver código  (GitHub)

Pruebas

Ahora podemos probar nuestros dos endpoints, tenemos el siguiente para store:

Prueba post

Y también el siguiente para el index:

Prueba index

Conclusión

Ahora ya tenemos dos endpoints que funcionan bien, pero falta un poco más, seguiremos en el siguiente sprint.

Notas

* Todavía no es una API REST, pero queremos lograrlo, nos basaremos en el conocimiento de la ✨Internet✨, particularmente en el siguiente artículo:

https://steveklabnik.com/writing/nobody-understands-rest-or-http