Alexandria. Desde el diseño a la implementación

Juan Otálora
Juan Otálora
Scrum Master y estudiante de Ingeniería Informática en la UM
Share on whatsapp
Share on twitter
Share on linkedin

🕐 4 min

Share on whatsapp
Share on twitter
Share on linkedin

🕐 4 min

Este proyecto todavía se encuentra en desarrollo

Alexandria es un software self-hosted de gestión personal de libros desarrollador en PHP usando el framework Symfony en su versión 5. En este artículo voy a describir todo el proceso de desarrollo que he ido siguiendo hasta completar la implementación, desde los diagramas UML hasta el último punto y coma de todo el código.

Diseño

Lo primero que hice fue escribir cada uno de los requisitos que quería en la aplicación. Finalmente, llegué a la conclusión de que lo mejor sería incluir estas entidades:

  • Home. Lo utilizamos para distinguir las diferentes casas en las que podemos registrar libros.
  • Room. Una casa puede estar compuesta por varias habitaciones. Solo los creadores de una Home pueden crear habitaciones dentro.
  • User. Puede convivir en una o varias casas y son añadidos a la misma por un administrador o el creador de la propia cada. Leen libros, registran libros en la plataforma y prestan libros a otras personas. También tienen la capacidad de dejar opiniones sobre los libros de su misma casa.
  • Book. Los libros tienen categoría y etiquetas. Toda la información (excepto las etiquetas) se obtiene de la API de libros de Google.
  • Category. Se crean conforma van apareciendo nuevas categorías en la búsqueda de la API. De esta forma podremos clasificar a los libros por categorías de forma sencilla.
  • Tag. Son etiquetas que los usuarios pueden dar de forma manual a lo libros que han registrado.
  • Borrow. Los préstamos de libros permiten a los propietarios de los libros prestarlos a otras personas durante un tiempo limitado. Durante este tiempo, los libros se marcaran como tal.
  • Review. Las opiniones pueden ser dejadas por aquellos usuarios que pueden acceder a los libros. Estas opiniones pueden ser visualizadas por el resto de personas que pueden acceder al libro, salvo con una condición: las opiniones de personas que no estén en mi misma casa, se marcarán como anónimas.

A tener en cuenta sobre los roles:

  1. Los roles de un usuario pueden ser (en orden ascendente de permisos): estandar, creador de casa y administrador.
  2. Solo los administradores pueden crear casas.
  3. Solo los creadores y los administradores pueden crear habitaciones dentro de una casa.
  4. Solo lo creadores y los administradores pueden registrar usuarios a una casa.

A tener en cuenta sobre el sistema de registro

  1. Los administradores tan solo se podrán crear administradores a través de un comando de Symfony.
  2. Tanto los administradores como los dueños de casas pueden añadir usuarios a las casas. En el caso de no exixtir el usuario, ambos podrán registrarlo.

A tener en cuenta sobre el sistema de crear casas

  1. Solo los administradores pueden crear casas
  2. Los administradores, en el momento de registrar la casa, pueden seleccionar a un usuario (o seleccionarse a ellos mismos) para ser los dueños de la casa

A tener en cuenta sobre el sistema de estados

  1. Un libro podrá estar leyéndose por alguien, prestado o libre. Del segundo caso hablaremos detalladamente más adelante.
  2. Un libro se maraca como que se está leyendo si hay algún usuario que así lo ha marcado.
  3. Un usuario puede leer cualquier libro que tenga en cualquiera de las casas en las que está viviendo.
  4. Los libros que están en préstamo no se pueden leer.

A tener en cuenta sobre el sistema de préstamos.

  1. Un usuario solo podrá prestar los libros que ha registrado, sean de la casa que sean.
  2. Solo se pueden prestar los libros que no están siendo leídos por otros integrantes de la casa.
  3. Para saber si un libro está en préstamo, comprobamos todos sus préstamos y si alguno de ellos no tiene fecha de fin, es que el préstamo no ha terminado.

Bien, para mí estos han sido los requisitos que he ido apuntando sobre cómo quiero que funcione la aplicación. Es posible que algunas especificaciones cambien a lo largo del tiempo, pero de momento usaremos estas.

Modelo de dominio

Una vez tengamos todos los requisitos y todas las entidades que compondrá nuestra aplicación, veamos como quedaría el modelado del dominio:

He decidido no incluir los getters y los setters para evitar que el modelo saliese muy aparatoso. Hay que tener en cuenta las dos notas situadas en la esquina inferior izquierda que recuerdan que no deben programase los setters de los identificadores ni de las fechas de registro, ya que serán establecidas de firma automática teniendo en cuanta la fecha actual.

Algunas capturas de pantalla del diseño final

Desarrollo

Para el desarrollo, he usado Symfony 5 y PHP en su versión 7.3. La elección la he tomado simplemente porque son las últimas versiones de cada uno.

Implementación

La puesta en producción en mi servidor he decidido hacerla con Nginx, un servidor web de alto rendimiento que le está ganando terreno a Apache desde hace varios años. Symfony tiene en su página web un ejemplo de archivo de configuración para Nginx y este framework. Lo único que tendremos que modificar será la ruta, el dominio y la localización del socket de PHP

Para instalar la certificación SSL usaremos certbot, un software disponible para Ubuntu que nos permite instalar certificados de Let’s Encrypt.

Seguir leyendo

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *