12. En la API se guardan los votos

15/04/20191 Min lectura — En Laravel, API, 😀

Hace 2 o 3 días hablaba sobre el local storage y la necesidad de no contar con él para almacenar los datos en el cliente.

Queremos tener votaciones de cada Quote y lo primero, según mi forma de entender el desarrollo, es crear el armazón con la lógica de negocio y el almacenamiento.

Con artisan es muy sencillo crear nuevos modelos a partir de snippets de código prefabricados por el propio Laravel.

De esta forma:

php artisan make:model Vote -mfc

Creará:

  • Modelo Vote
  • Controlador VoteController
  • Factoría VoteFactory
  • Migración para las tablas del modelo.

Los datos que queremos almacenar de cada voto son:

  • Identificador del voto
  • Estado. Por defecto a true. Así podríamos "cancelar" el voto pero dejarlo almacenado.
  • Usuario que lo ha ejecutado (de momento le asignaremos siempre el usuario 1)
  • Modelo contra el que se vota.
  • Valor del voto: up y down

No voy ahora a controlar el usuario que crea el voto ni a autenticarlo. Queremos "correr" para centrarnos en el trabajo en el frontend que es lo que más verde tengo.

Por otra parte el modelo que se vota es Quote pero quiero dejar preparado el modelo para que acepte votar contra Author o cualquier otra cosa.

Hacemos uso de las relaciones polímórficas y el resultado del "corazón" del voto es:

class Vote extends BaseModel
{
public function user()
{
return $this->belongsTo(User::class);
}
public function voteable()
{
return $this->morphTo();
}
}

Por su parte en Quote añadimos:

public function votes()
{
return $this->morphMany(Vote::class, 'voteable')->where('status', 1);
}

Todo sobre ruedas creando las rutas de endpoint para añadir el voto y la modificación. Deberíamos crear también el del borrado.