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

por Halí - publicado: julio 28, 2023
LaravelBackend

Continuando con los form requests revisaremos que opciones nos dan para validar datos.

Índice

Form requests

Primero vemos que Laravel creó dos para nosotros: StoreCreditCardRequest y UpdateCreditCardRequest, este par de form requests servirán para validar los datos, dar autorización en la capa de solicitudes, enviar mensajes entendibles como respuesta y en algunas ocasiones podemos realizar pre-procesamientos en la validación.

Almacenar

Autorización

El método authorize devuelve verdadero si el usuario puede tener acceso a esta solicitud. Lo hemos implementado así:

public function authorize(): bool
{
    return $this->user()->can('create', CreditCard::class);
}

Reglas

Después está el método rules que devuelve el arreglo de reglas que tienen que cumplir los campos, nosotros queremos que al solicitar el almacenamiento de una tarjeta, tenga en cuenta el nombre, fecha límite de pago, fecha de corte, tasa de interés y límite de crédito.

El único campo opcional o nullable es la tasa de interés, a los demás les agregamos otras reglas, como que son requeridos:

Nombre

  • Requerido
  • Cadena de texto
  • Máximo 255 caracteres

Fecha límite de pago

  • Requerido
  • Entero
  • La fecha límite de pago representa un día en el mes corriente, en el que debes terminar de pagar tu deuda, o sea que no tiene sentido que sean negativos y seguramente no habrá días mayores a 28 porque pues ✨ febrero ✨

Fecha de corte

  • Requerido
  • Entero
  • Similar a la fecha de corte, en el sentido que la acotaremos de 1 a 28

Tasa de interés

  • No requerido
  • Decimal, puede tener de 0 a 2 decimales
  • Este porcentaje debería ser mayor a 0 y menor a 200, ya que si tu tarjeta tiene más de 200% como tasa de interés… bueno quizá después tengamos que cambiar esto

Límite de crédito

  • Requerido, para poder saber cuanto tienes disponible en cualquier momento
  • Decimal, puede tener de 0 a 4 decimales
  • Debe ser mayor a 0 (espero que no tengas un límite de crédito negativo 😬)

Laravel utilizara estas reglas para validar los datos que lleguen desde la API.

Atributos

Luego tenemos el método attributes, que devolverá un arreglo que indica a Laravel cómo sustituir los nombres de los atributos, para que se vean bonitos, básicamente. Ahí sustituimos el atributo name por Nombre (y así con los demás), y lo traducimos, para que si el usuario utiliza otro de nuestros lenguajes soportados y nos lo indica así, podamos responder de forma clara.

En resumen el código para la solicitud de almacenamiento de una tarjeta de crédito queda así… (Ya teníamos algunas reglas escritas)

Actualizar

Haremos lo mismo para la solicitud de actualización de la tarjeta, con algunas excepciones.

Para la autorización, necesitamos tomar en cuenta la tarjeta de crédito que se está solicitando actualizar.

Y en las reglas habrá campos que el usuario no quiera actualizar, por lo que marcaremos algunos campos como sometimes para decirle a Laravel que esos campos no estarán presentes en todas las solicitudes de actualización, pero también los marcamos como required ya que no pueden ser null.

Y por último agregamos también los atributos.

Fixes

Ahora bien, en nuestro PR anterior nos faltaban algunas cosas, cómo decirle al controlador, que nombre debía tener el parámetro tarjeta de crédito, ya que el método authorizeResource lo obtiene automáticamente con snake case, pero nosotros estamos usando camel case.

Al final, el código queda algo así:

Pruebas con Postman

Probaremos el endpoint POST credit-cards en Postman, para lo que agregamos la url y hacemos una solicitud con valores de prueba.

Mensajes de error

Vemos que los mensajes están “localizados”, es decir traducidos a una variante específica de un idioma, en este caso el español de México.

Si hacemos una solicitud vacía podremos ver algo así:

Solicitud vacía

Y por último si enviamos los datos correctos se verá algo así…

Solicitud correcta

Esto es porque todavía no contamos con la lógica en el controlador.

Conclusión

Podemos ver que las form requests son bastante ágiles para realizar tareas de validación, además que abstrae muchas cosas que de otra forma tendríamos que escribir por nosotros mismos (como la autorización y los mensajes).

Esto es todo lo que haremos en este sprint (ya que no me quedó mucho tiempo libre) y en el siguiente veremos cómo interactuar con el ORM Doctrine, para guardar los datos que recuperamos de la solicitud.