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.
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 los scripts proporcionados.
all-affiliates.ts-> Devuelve el listado de los socios, de todas las bibliotecas.find-affiliate-by-id.ts-> Búsqueda por affiliateId. Devuelve un socio.find-affiliates-by-lastname.ts-> Busca socios por lastName. Devuelve una lista de socios.find-affiliates-by-library-id.ts-> Devuelve el listado de los socios de una biblioteca en concreto.new-affiliate.ts-> Permite introducir un nuevo socio a una biblioteca.
all-authors.ts-> Devuelve el listado de los autores.find-author-by-id.ts-> Búsqueda por authorId. Devuelve un autor.find-authors-by-lastname.ts-> Búsqueda por lastName. Devuelve una lista de autores.new-author.ts-> Permite introducir un nuevo autor.
all-books.ts-> Devuelve el listado de los libros.book-availability.ts-> Dado un bookId, devuelve un booleano según si el libro está o no en préstamo.find-book-by-id.ts-> Búsqueda por bookId. Devuelve un libro.find-books-by-author.ts-> Búsqueda por authorId. Devuelve una lista de libros.find-books-by-library.ts-> Búsqueda por libraryId. Devuelve una lista de libros.find-books-by-title.ts-> Búsqueda por title. Devuelve una lista de libros.new-book.ts-> Permite introducir un nuevo socio a una biblioteca.
all-active-borrowings.ts-> Devuelve el listado de préstamos activos.find-active-borrowing-by-book-id.ts->find-active-borrowing-by-affiliate-id.ts-> Búsqueda por affiliateId. Devuelve el listado de préstamos activos por parte de un socio.find-all-borrowings-by-affiliate-id.ts-> Búsqueda por affiliateId. Devuelve el listado de préstamos, activos o pasados, por parte de un socio.new-borrowing-availability-check.ts-> Se genera un nuevo préstamo por affiliateId y bookId.- Se comprueba que el usuario no tenga ya 3 préstamos activos.
- Se comprueba que el libro esté disponible.
- Se genera el préstamo.
- se actualiza el estado del libro a no disponible.
return-book.ts-> Devolución de un préstamo por bookId.- Se comprueba que el libro no esté disponible.
- Se actualiza el préstamo a inactivo.
- se actualiza el estado del libro a disponible.
all-libraries.ts-> Devuelve el listado de las bibliotecas.find-library-by-id.ts-> Búsqueda por libraryId. Devuelve una biblioteca.find-library-by-name.ts-> Búsqueda por libraryId. Devuelve una biblioteca.new-library.ts-> Permite introducir una nueva biblioteca.
En esta práctica hay que desarrollar el modelo de datos para una aplicación que resulte de tu interés. (No es necesario pensar en la autenticación aún, estudiaremos eso por separado.)
Se trata, como otras veces, de hacer un fork de este repositorio y trabajar en él.
La solución del ejercicio debe ser un proyecto Javascript con:
- El esquema de Prisma (
schema.prisma). - La configuración para una base de datos (con
docker-compose.yml). - Rellenado con unos pocos datos de prueba.
- Scripts en Typescript de demostración que hacen algunas cosas con los datos.
- Documentación sobre cómo lanzar la base de datos y usar los scripts de demostración (sustituyendo este mismo README).
El esquema debe tener almenos 3 entidades, pero no hay límite superior. Empieza siempre por definir las entidades más importantes, y asegúrate de que las relaciones cumplen con las necesidades que has planteado (nunca hay una única solución, cada solución tienes sus ventajas e inconvenientes, simplemente hay que ser conscientes de ellos). Luego añade entidades para hacer crecer el modelo. No intentes hacerlo todo de golpe (a no ser que ya tengas experiencia).
Para crear los datos iniciales con los que poder hacer algo al principio se puede usar cualquier mecanismo que automatice la inserción. Se recomienda mirar la documentación sobre como usar seed.ts en Prisma, que es una manera semi-estandarizada.
