Autor: Ferran Bals Moreno
Perfil de GitHub: franksparks
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.
Para lanzar el modelo de datos debemos seguir los siguientes pasos:
-
Clonar el repositorio
-
Instalar las dependencias ->
bun install -
Lanzar el contenedor de Postgres ->
docker-compose -f docker/docker-compose.yml up -d -
Generar la base de datos mediante
bun x prisma db push -
Poblar la base de datos ->
bun x prisma db seedEste comando inyectará:
- 10 socios (Affiliate)
- 5 autores (Author)
- 25 libros (Book)
- 10 préstamos (Borrowing)
- 5 bibliotecas (Library)
-
Acceder a prisma studio ->
bun x prisma studio -
Ejecutar las llamadas a los endpoints cargando la colección de Thunder Client proporcionada.
GET/affiliatesObtiene todos los socios de todas las bibliotecas.GET/affiliates/searchPermite buscar socios según su apellido.GET/affiliates/idObtiene un socio a partir de su affiliateId.POST/affiliatesIntroduce un nuevo elemento socio.PUT/affiliates/idActualiza la información de un socio.DELETE/affiliatesNo implementado.
GET/authorsObtiene todos los autores.GET/authors/searchPermite buscar autores según su apellido.GET/authors/idObtiene un libro a partir de su id.POST/authorsIntroduce un nuevo elemento autor.PUT/authors/idActualiza la información de un autor.DELETE/authorsNo implementado.
GET/booksObtiene todos los libros de todas las bibliotecas.GET/books/searchPermite buscar socios según su título, authorId o librartyId.GET/books/idObtiene un libro a partir de su id.POST/booksIntroduce un nuevo elemento libro.PUT/books/idActualiza la información de un libro.DELETE/booksNo implementado.
-
GET/borrowingsObtiene todas los préstamos de todas las bibliotecas. -
GET/borrowings/activeObtiene todas los préstamos activos de todas las bibliotecas. -
GET/borrowings/searchPermite buscar préstamos según su el libro a socio asociado. -
GET/borrowings/active/searchPermite buscar préstamos activos según su el libro a socio asociado. -
GET/borrowings/idObtiene un préstamo a partir de su id. -
POST/borrowingsIntroduce 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/idEndpoint para devolver libros,si se cumplen las condiciones:- El libro ha de estar en préstamo.
-
DELETE/borrowingsNo implementado.
GET/librariesObtiene todas las bibliotecas.GET/libraries/searchPermite buscar socios según su nombre.GET/libraries/idObtiene una biblioteca a partir de su id.POST/librariesIntroduce un nuevo elemento biblioteca.PUT/libraries/idActualiza la información de una biblioteca.DELETE/librariesNo implementado.
-
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.
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.
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.
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
ZIPdel 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.ymlsi 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
.envcon éstas. Es muy importante no subir ese fichero en GitHub (es decir, incluirlo en.gitignore).
