Skip to content

Práctica 4 - Backend con Typescript, Express y Prisma

franksparks/p4-backend-2024

 
 

Repository files navigation

Práctica 4 del Posgrado Full-Stack Web Technologies, por Ferran Bals

Proyecto: Backend para una red de bibliotecas

Acerca del autor

Autor: Ferran Bals Moreno

Perfil de GitHub: franksparks

Descripción de la práctica realizada

Introducción

Se ha diseñado un modelo de datos para la gestión de una red de bibliotecas y los préstamos de libros a sus socios y se han implementado los endpoints para su gestión.

Diagrama del modelo de datos:

Modelo detallado por Prismaliser:

Descripción de las entidades:

  • Las bibliotecas cuentan con socios (affiliates) y libros. Una biblioteca puede tener varios socios y varios libros.
  • Un socio lo es de una biblioteca, y cuenta con x préstamos (tanto activos como inactivos).
  • Un libro se encuentra en una biblioteca y está escrito por un autor, pero puede formar parte de varios préstamos (sólo 1 de ellos activo).
  • Un autor puede haber escrito varios libros.
  • Un préstamo relaciona el socio y el libro prestado.

Notas:

  • Un socio no puede tener más de 3 libros en préstamo simultáneamente (préstamos activos).
  • Un libro en préstamo no puede ser prestado a otro socio.

Instrucciones

Para lanzar el modelo de datos debemos seguir los siguientes pasos:

  1. Clonar el repositorio

  2. Instalar las dependencias -> bun install

  3. Lanzar el contenedor de Postgres -> docker-compose -f docker/docker-compose.yml up -d

  4. Generar la base de datos mediante bun x prisma db push

  5. Poblar la base de datos -> bun x prisma db seed

    Este comando inyectará:

    • 10 socios (Affiliate)
    • 5 autores (Author)
    • 25 libros (Book)
    • 10 préstamos (Borrowing)
    • 5 bibliotecas (Library)
  6. Acceder a prisma studio -> bun x prisma studio

  7. Ejecutar las llamadas a los endpoints cargando la colección de Thunder Client proporcionada.

Descripción de los endpoints proporcionados

Affiliates

  • GET /affiliates Obtiene todos los socios de todas las bibliotecas.
  • GET /affiliates/search Permite buscar socios según su apellido.
  • GET /affiliates/id Obtiene un socio a partir de su affiliateId.
  • POST /affiliates Introduce un nuevo elemento socio.
  • PUT /affiliates/id Actualiza la información de un socio.
  • DELETE /affiliates No implementado.

Authors

  • GET /authors Obtiene todos los autores.
  • GET /authors/search Permite buscar autores según su apellido.
  • GET /authors/id Obtiene un libro a partir de su id.
  • POST /authors Introduce un nuevo elemento autor.
  • PUT /authors/id Actualiza la información de un autor.
  • DELETE /authors No implementado.

Books

  • GET /books Obtiene todos los libros de todas las bibliotecas.
  • GET /books/search Permite buscar socios según su título, authorId o librartyId.
  • GET /books/id Obtiene un libro a partir de su id.
  • POST /books Introduce un nuevo elemento libro.
  • PUT /books/id Actualiza la información de un libro.
  • DELETE /books No implementado.

Borrowings

  • GET /borrowings Obtiene todas los préstamos de todas las bibliotecas.

  • GET /borrowings/active Obtiene todas los préstamos activos de todas las bibliotecas.

  • GET /borrowings/search Permite buscar préstamos según su el libro a socio asociado.

  • GET /borrowings/active/search Permite buscar préstamos activos según su el libro a socio asociado.

  • GET /borrowings/id Obtiene un préstamo a partir de su id.

  • POST /borrowings Introduce un nuevo elemento préstamo, si se cumplen las condiciones:

    • El libro no ha de estar ya en préstamo.
    • El socio no puede tener ya 3 préstamos activos.
  • PUT /borrowings/id Endpoint para devolver libros,si se cumplen las condiciones:

    • El libro ha de estar en préstamo.
  • DELETE /borrowings No implementado.

Libraries

  • GET /libraries Obtiene todas las bibliotecas.
  • GET /libraries/search Permite buscar socios según su nombre.
  • GET /libraries/id Obtiene una biblioteca a partir de su id.
  • POST /libraries Introduce un nuevo elemento biblioteca.
  • PUT /libraries/id Actualiza la información de una biblioteca.
  • DELETE /libraries No implementado.

Puntos de mejora

  • Se podrían añadir fácilmente otras entidades, como los trabajadores de las bibliotecas u otros soportes para préstamos, como DVDs.

  • Se podría almacenar el timestamp del préstamos y establecer un período de préstamo.

  • Como consecuencia del punto anterior, se podría añadir un atributo adicional a los socios, "amonestado", que les impida pedir libros en préstamo si devuelven libros tarde.

  • Se podría gestionar el préstamos de libros de bibliotecas que no son la del socio, generando un pedido a otra biblioteca con tales libros.

Proveedor de Base de datos

Se ha configurado CockroachDB como proveedor. Se han efectuado algunos cambios en el esquema de Prisma para poder utilizarlo. Al ser una solución en la nube ya no es necesario el archivo docker-compose.yml.

Enunciado original

Backend en Typescript, Express y Prisma

Se trata de hacer un backend usando Typescript, Express y Prisma. El backend implementado en clase es el modelo a seguir. Para alumnos que lo hacen por primera vez y sienten algo de incomodidad, lo ideal es usar el modelo de guía y hacer un backend cercano al original de tal manera que la práctica sea un repaso a fondo. Para los que estén más cómodos, lo ideal es innovar en algun aspecto y salirse parcialmente del modelo en ciertos momentos o explorar algún interés personal. El modelo de datos es directamente la práctica anterior.

Al usar Prisma, es quizás buena idea explorar proveedores de Prisma que no sean precisamente Postgres, ya que el coste de hacerlo es mínimo (aunque esto no es obligatorio para nada). Aparte de los proveedores locales alternativos a Postgres, existen también opciones en la nube equivalentes a Postgres como PlanetScale, CockroachDB o Supabase, bien explicadas en la documentación de Prisma.

Entregable

Como anteriormente, para hacer esta práctica hay que:

  • Hacer un fork de este repositorio.
  • Trabajar en el fork haciendo commits regularmente (una práctica que aparece entera en un solo commit tendrá una nota muy baja o cero, hay que mostrar todo el proceso intermedio).
  • Al finalizar, se debe crear un ZIP del repositorio (que incluya el fichero .env!) y entregarlo en el Campus Online de UPC School (habrá una tarea preparada para ello).

El entregable es el código del proyecto, incluyendo:

  • docker-compose.yml si la base de datos corre bajo Docker.
  • El código completo del servidor.
  • Un fichero exportado de Thunder Client con la lista de endpoints que se han probado. (Esto es extremadamente relevante porque la corrección del backend, de no tener este fichero, es un trabajo muchísimo más tedioso!).
  • Si se necesitan credenciales para acceder a servicios de cloud (o incluso localmente), es importante incluir en el ZIP del campus el fichero .env con éstas. Es muy importante no subir ese fichero en GitHub (es decir, incluirlo en .gitignore).

About

Práctica 4 - Backend con Typescript, Express y Prisma

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages

  • TypeScript 100.0%