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.
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.
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. {: .notification.is-yellow}
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.
Pruebas
Ahora podemos probar nuestros dos endpoints, tenemos el siguiente para
store
:
Y también el siguiente para el 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