Skip to content

Navigation Menu

Sign in
Sign up

Repository files navigation

Biblioteca-springboot

Este es el backend de una aplicación construida con Spring Boot, creada para proporcionar servicios de reservas y prestamos a los clientes de una biblioteca. Permite la administración de libros, y visualización de reservas y préstamos realizados por los usuarios registrados en la plataforma. Utiliza tecnologías como Hibernate, Lombok, JPA, Spring Security, PostgreSQL y JWT para la autenticación y autorización.

Tecnologías Utilizadas

  • Spring Boot - Framework principal del backend.
  • Hibernate - Implementación de JPA para el manejo de la base de datos.
  • Lombok - Reducción de código repetitivo en las entidades por medio de anotaciones.
  • JPA - API para la gestión de datos.
  • Spring Security - Seguridad y manejo de autenticación/autorización.
  • PostgreSQL - Base de datos utilizada.
  • JWT (JSON Web Token) - Mecanismo de autenticación.

Requisitos Previos

Antes de ejecutar la aplicación, asegúrate de tener instalado:

  • Java 17
  • Gradle o Maven
  • PostgreSQL
  • Docker (opcional, para contenerización)

Instalación y Configuración

  1. Clonar el repositorio:

    git clone https://github.com/LeyLopez/Library-springboot.git
    cd tu-repositorio
  2. Configurar la base de datos en application.properties o application.yml:

    spring.datasource.url=jdbc:postgresql://localhost:5432/tu_base_de_datos
    spring.datasource.username=tu_usuario
    spring.datasource.password=tu_contraseña
    spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.PostgreSQLDialect
  3. Ejecutar la aplicación con Gradle:

    ./gradlew bootRun

    o con Maven:

    mvn spring-boot:run

Endpoints Principales

Autenticación

POST /api/auth/login - Iniciar sesión y obtener token JWT.

Ejemplo de petición

 {
 "username":"Leydis",
 "password":"123456"
 }

Ejemplo de respuesta (200 OK)

 {
 "token": "eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJMZXlkaXMiLCJpYXQiOjE3NDM0MDMxNTV9.UFxYrRCS2KGDGJAzh6exW9Kl8x18EIHQDli9kZ9gzfw",
 "type": "Bearer",
 "username": "Leydis",
 "roles": [
 "ROLE_USER"
 ]
}

POST /api/auth/signup - Registrar un nuevo usuario a la plataforma.

Ejemplo de petición

 {
 "name":"Leidis",
 "lastname": "Lopez",
 "email":"leidislopez@gmail.com",
 "username":"Leidis",
 "password":"12345",
 "kindOfDocument":"Cedula",
 "documentNumber":1234567,
 "dateOfBirth":"2003年09月26日",
 "phoneNumber":"123456",
 "address": "Calle 23"
}

Ejemplo de respuesta (200 OK)

 {
 "id": 5,
 "name": "Leidis",
 "lastname": "Lopez",
 "email": "leidislopez@gmail.com",
 "username": "Leidis",
 "kindOfDocument": "Cedula",
 "documentNumber": 1234567,
 "dateOfBirth": "2003年09月26日T00:00:00.000+00:00",
 "phoneNumber": "123456",
 "address": "Calle 23"
}

Endpoints de la aplicación (Requieren autenticación)

GET /api/usuario - Obtener lista de usuarios.

Ejemplo de respuesta (200 OK)

 [
 {
 "id": 2,
 "name": "Mateo",
 "lastname": "Cantillo",
 "email": "mateo@gmail.com",
 "username": "Mateo",
 "password": "2ドルa10ドル$ntd3E2AWuREKOm0.B3veyui96XW6NJqvmqnu/FMFXA6nbiZpDJNha",
 "kindOfDocument": "TARJETA DE IDENTIDAD",
 "documentNumber": 23254345,
 "dateOfBirth": "2021年12月01日T00:00:00.000+00:00",
 "phoneNumber": "32423534",
 "address": "Calle 12"
 },
 {
 "id": 3,
 "name": "Leydis",
 "lastname": "Lopez",
 "email": "ley@gmail.com",
 "username": "Leydis",
 "password": "2ドルa10ドル7ドル/R1BTdKIJU0XVFa.mHPEOKB4OMgZzsq5aamMhPRVCC0xqfoqU3PW",
 "kindOfDocument": "CEDULA",
 "documentNumber": 2342342,
 "dateOfBirth": "2003年12月12日T00:00:00.000+00:00",
 "phoneNumber": "12345673",
 "address": "Calle 13"
 },
 {
 "id": 4,
 "name": "Angelica",
 "lastname": "Coronel",
 "email": "ange@gmail.com",
 "username": "Ange",
 "password": "12345",
 "kindOfDocument": "CEDULA",
 "documentNumber": 2312435,
 "dateOfBirth": "2002年01月04日T00:00:00.000+00:00",
 "phoneNumber": "3456789",
 "address": "Calle 15"
 },
 {
 "id": 5,
 "name": "Leidis",
 "lastname": "Lopez",
 "email": "leidislopez@gmail.com",
 "username": "Leidis",
 "password": "2ドルa10ドル$SFyXY4rSstzMbQmCUE57/.AWaEQVgkqVWDJS/m2T9jyt8be321Bl2",
 "kindOfDocument": "Cedula",
 "documentNumber": 1234567,
 "dateOfBirth": "2003年09月26日T00:00:00.000+00:00",
 "phoneNumber": "123456",
 "address": "Calle 23"
 }
]

GET /api/libro -Obtener lista de libros.

Ejemplo de respuesta (200 OK)

 [
 {
 "id": 57,
 "title": "Don Quijote de la Mancha",
 "description": "Historia del ingenioso hidalgo",
 "dateOfPublication": "1605年01月16日T05:00:00.000+00:00",
 "quantity": 3,
 "author": 2,
 "coverPage": "https://covers.openlibrary.org/b/id/8228691-L.jpg",
 "genre": 1
 },
 {
 "id": 58,
 "title": "1984",
 "description": "Distopía futurista",
 "dateOfPublication": "1949年06月08日T05:00:00.000+00:00",
 "quantity": 7,
 "author": 3,
 "coverPage": "https://covers.openlibrary.org/b/id/7222246-L.jpg",
 "genre": 1
 },
 {
 "id": 59,
 "title": "Orgullo y prejuicio",
 "description": "Romance clásico",
 "dateOfPublication": "1813年01月28日T05:00:00.000+00:00",
 "quantity": 4,
 "author": 4,
 "coverPage": "https://covers.openlibrary.org/b/id/8231990-L.jpg",
 "genre": 2
 },
 {
 "id": 60,
 "title": "Moby Dick",
 "description": "Aventura marina",
 "dateOfPublication": "1851年10月18日T05:00:00.000+00:00",
 "quantity": 6,
 "author": 5,
 "coverPage": "https://covers.openlibrary.org/b/id/7222276-L.jpg",
 "genre": 2
 },
 {
 "id": 61,
 "title": "Crimen y castigo",
 "description": "Reflexión sobre la culpa",
 "dateOfPublication": "1866年01月01日T05:00:00.000+00:00",
 "quantity": 5,
 "author": 6,
 "coverPage": "https://covers.openlibrary.org/b/id/8231856-L.jpg",
 "genre": 3
 },
 {
 "id": 62,
 "title": "El principito",
 "description": "Fábula filosófica",
 "dateOfPublication": "1943年04月06日T05:00:00.000+00:00",
 "quantity": 9,
 "author": 7,
 "coverPage": "https://covers.openlibrary.org/b/id/8774816-L.jpg",
 "genre": 3
 },
 {
 "id": 63,
 "title": "Los miserables",
 "description": "Relato de redención",
 "dateOfPublication": "1862年01月01日T05:00:00.000+00:00",
 "quantity": 3,
 "author": 8,
 "coverPage": "https://covers.openlibrary.org/b/id/8231851-L.jpg",
 "genre": 5
 },
 {
 "id": 64,
 "title": "La odisea",
 "description": "Épica de Homero",
 "dateOfPublication": "0800年01月01日T05:00:00.000+00:00",
 "quantity": 5,
 "author": 9,
 "coverPage": "https://covers.openlibrary.org/b/id/8231995-L.jpg",
 "genre": 2
 },
 {
 "id": 65,
 "title": "El nombre de la rosa",
 "description": "Misterio medieval",
 "dateOfPublication": "1980年01月01日T05:00:00.000+00:00",
 "quantity": 4,
 "author": 10,
 "coverPage": "https://covers.openlibrary.org/b/id/8231950-L.jpg",
 "genre": 1
 },
 {
 "id": 66,
 "title": "Rayuela",
 "description": "Narrativa experimental",
 "dateOfPublication": "1963年06月28日T05:00:00.000+00:00",
 "quantity": 6,
 "author": 11,
 "coverPage": "https://covers.openlibrary.org/b/id/8231980-L.jpg",
 "genre": 2
 }
]

GET /api/reserva -Obtener lista de reservas.

Ejemplo de respuesta (200 OK)

 [
 {
 "id": 51,
 "reservationDate": "2024年06月12日T05:00:00.000+00:00",
 "reservationEndDate": "2024年06月22日T05:00:00.000+00:00",
 "statusChangeDate": "2024年06月20日T05:00:00.000+00:00",
 "user": 3,
 "book": 60,
 "status": "CANCELADO"
 },
 {
 "id": 74,
 "reservationDate": "2025年07月15日T05:00:00.000+00:00",
 "reservationEndDate": "2025年07月25日T05:00:00.000+00:00",
 "statusChangeDate": "2025年07月23日T05:00:00.000+00:00",
 "user": 3,
 "book": 67,
 "status": "ENTREGADO"
 }
]

GET /api/prestamo -Obtener lista de préstamos.

Ejemplo de respuesta (200 OK)

 [
 {
 "id": 140,
 "loanDate": "2024年05月03日T05:00:00.000+00:00",
 "devolutionDate": "2024年05月13日T05:00:00.000+00:00",
 "statusChangeDate": "2024年05月11日T05:00:00.000+00:00",
 "user": 3,
 "book": 58,
 "status": "ENTREGADO"
 },
 {
 "id": 141,
 "loanDate": "2024年06月08日T05:00:00.000+00:00",
 "devolutionDate": "2024年06月18日T05:00:00.000+00:00",
 "statusChangeDate": "2024年06月15日T05:00:00.000+00:00",
 "user": 3,
 "book": 59,
 "status": "ENTREGADO"
 }
]

GET /api/libro/{id} -Obtener libro por ID.

Ejemplo de respuesta (200 OK)

 {
 "id": 58,
 "title": "1984",
 "description": "Distopía futurista",
 "dateOfPublication": "1949年06月08日T05:00:00.000+00:00",
 "quantity": 7,
 "author": 3,
 "coverPage": "https://covers.openlibrary.org/b/id/7222246-L.jpg",
 "genre": 1
}

GET /api/usuario/{id} -Obtener usuario por ID.

Ejemplo de respuesta (200 OK)

 {
 "id": 3,
 "name": "Leydis",
 "lastname": "Lopez",
 "email": "ley@gmail.com",
 "username": "Leydis",
 "password": "2ドルa10ドル7ドル/R1BTdKIJU0XVFa.mHPEOKB4OMgZzsq5aamMhPRVCC0xqfoqU3PW",
 "kindOfDocument": "CEDULA",
 "documentNumber": 2342342,
 "dateOfBirth": "2003年12月12日T00:00:00.000+00:00",
 "phoneNumber": "12345678",
 "address": "Calle 13"
}

GET /api/reserva/{id} -Obtener reserva por ID.

Ejemplo de respuesta (200 OK)

 {
 "id": 89,
 "reservationDate": "2026年02月04日T05:00:00.000+00:00",
 "reservationEndDate": "2026年02月14日T05:00:00.000+00:00",
 "statusChangeDate": "2026年02月12日T05:00:00.000+00:00",
 "user": 3,
 "book": 62,
 "status": "ENTREGADO"
}

GET /api/prestamo/{id} -Obtener prestamo por ID.

Ejemplo de respuesta (200 OK)

 {
 "id": 140,
 "loanDate": "2024年05月03日T05:00:00.000+00:00",
 "devolutionDate": "2024年05月13日T05:00:00.000+00:00",
 "statusChangeDate": "2024年05月11日T05:00:00.000+00:00",
 "user": 3,
 "book": 58,
 "status": "ENTREGADO"
}

GET /api/autor/{id} -Obtener autor por ID.

Ejemplo de respuesta (200 OK)

 {
 "id": 1,
 "name": "Gabriel",
 "lastname": "García Márquez",
 "dateOfBirth": "1927年03月06日T05:00:00.000+00:00"
}

GET /api/genero/{id} -Obtener genero de un libro por ID del genero.

 {
 "id": 1,
 "name": "Realismo Mágico"
}

POST /api/genero -Agregar genero a la biblioteca.

Ejemplo de petición

 {
 "id":1,
 "name":"terror"
}

Ejemplo de respuesta (200 OK)

 {
 "id": 1,
 "name": "terror"
}

POST /api/libro -Agregar libro a la biblioteca.

Ejemplo de petición

 {
 "title":"cien años",
 "description":"macondo",
 "dateOfPublication": "2000年12月07日",
 "quantity": 3,
 "coverPage":"andja",
 "author":2
}

Ejemplo de respuesta (200 OK)

 {
 "id": 90,
 "title": "cien años",
 "description": "macondo",
 "dateOfPublication": "2000年12月07日T00:00:00.000+00:00",
 "quantity": 3,
 "author": 2,
 "coverPage": "andja",
 "genre": null
}

POST /api/autor -Agregar autor a la biblioteca.

Ejemplo de petición

 {
 "name":"Leidis",
 "lastname":"Lopez",
 "dateOfBirth":"2002-26-09"
}

Ejemplo de respuesta (200 OK)

 {
 "id": 53,
 "name": "Leidis",
 "lastname": "Lopez",
 "dateOfBirth": "2004年02月09日T00:00:00.000+00:00"
}

POST /api/prestamo -Agregar prestamo a la biblioteca.

Ejemplo de petición

 {
 "loanDate":"2025年01月12日",
 "devolutionDate":"2025年02月12日",
 "statusChangeDate":"2025年02月10日",
 "user":3,
 "book":58,
 "status":"ENTREGADO"
}

Ejemplo de respuesta (200 OK)

 {
 "id": 187,
 "loanDate": "2025年01月12日T00:00:00.000+00:00",
 "devolutionDate": "2025年02月12日T00:00:00.000+00:00",
 "statusChangeDate": "2025年02月10日T00:00:00.000+00:00",
 "user": 3,
 "book": 58,
 "status": "ENTREGADO"
}

POST /api/reserva -Agregar reserva a la biblioteca.

Ejemplo de petición

 {
 "reservationDate":"2024年12月30日",
 "reservationEndDate":"2025年01月30日",
 "statusChangeDate": "2024年01月25日",
 "user":3,
 "book":58,
 "status":"ENTREGADO"
}

Ejemplo de respuesta (200 OK)

 {
 "id": 99,
 "reservationDate": "2024年12月30日T00:00:00.000+00:00",
 "reservationEndDate": "2025年01月30日T00:00:00.000+00:00",
 "statusChangeDate": "2024年01月25日T00:00:00.000+00:00",
 "user": 3,
 "book": 58,
 "status": "ENTREGADO"
}

PUT /api/usuario/{id} -Actualizar un usuario por su ID.

PUT /api/libro/{id} -Actualizar un libro por su ID.

PUT /api/genero/{id} -Actualizar un genero por su ID.

PUT /api/autor/{id} -Actualizar un autor por su ID.

PUT /api/reserva/{id} -Actualizar una reserva por su ID.

PUT /api/prestamo/{id} -Actualizar un préstamo por su ID.

DELETE /api/usuario/{id} -Eliminar un usuario por su ID.

DELETE /api/libro/{id} -Eliminar un libro por su ID.

DELETE /api/genero/{id} -Eliminar un genero por su ID.

DELETE /api/autor/{id} -Eliminar un autor por su ID.

DELETE /api/reserva/{id} -Eliminar una reserva por su ID.

DELETE /api/prestamo/{id} -Eliminar un préstamo por su ID.

Seguridad y JWT

La aplicación usa Spring Security con JWT para la autenticación. El token debe enviarse en la cabecera de cada petición:

Authorization: Bearer <tu_token_jwt>

Contenerización con Docker

Para ejecutar la aplicación en Docker, utiliza el siguiente Dockerfile:

FROM openjdk:17-jdk-slim
WORKDIR /app
COPY build/libs/tu-app.jar app.jar
EXPOSE 8080
ENTRYPOINT ["java", "-jar", "app.jar"]

Construir y ejecutar el contenedor:

docker build -t mi-aplicacion .
docker run -p 8080:8080 mi-aplicacion

Contribuciones

Si deseas contribuir, por favor abre un Pull Request o crea un Issue para discutir cambios.

About

Se desarrolla el Back-end del Servicio de Reservas y préstamos de una Biblioteca a través del Framework de Java: Springboot.

Topics

Resources

Stars

0 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

AltStyle によって変換されたページ (->オリジナル) /