API de Gestión de Biblioteca

Esta API permite gestionar libros, editoriales, autores, roles, usuarios, géneros y préstamos.

🖊️ Autores

Obtener todos los autores

Endpoint: GET /api/authors/

Este endpoint devuelve una lista de todos los autores registrados en el sistema.

fetch('https://rest-api-library.vercel.app/api/authors')
                    .then(res => res.json())
                    .then(json => console.log(json));

Crear un nuevo autor

Endpoint: POST /api/authors/

Este endpoint crea un nuevo autor en la base de datos.

fetch('https://rest-api-library.vercel.app/api/authors', {
        method: 'POST',
        headers: {
            'Content-Type': 'application/json',
            'Authorization': 'Bearer yourTokenHere'
        },
        body: JSON.stringify({
            name: "Gabriel García Márquez",
            surnames: "García Márquez",
            birthdate: "1927-03-06",
            nationality: "Colombiano"
        })
    })
    .then(res => res.json())
    .then(json => console.log(json));
Respuestas
  • 200 OK:
    
    {
      "message": "Autor Guardado"
    }
                        
  • 404 Not Found:
    
    {
      "message": "Error guardar autor"
    }
                        

Obtener un autor por ID

Endpoint: GET /api/authors/:authorId

Este endpoint devuelve un autor específico basado en su ID.

fetch('https://rest-api-library.vercel.app/api/authors/1')
        .then(res => res.json())
        .then(json => console.log(json));

Actualizar un autor por ID

Endpoint: PUT /api/authors/:authorId

Este endpoint actualiza la información de un autor basado en su ID.

{
        "name": "Nombre actualizado",
        "surnames": "Apellidos actualizados",
        "birthdate": "YYYY-MM-DD",
        "nationality": "Nacionalidad actualizada"
    }
fetch('https://rest-api-library.vercel.app/api/authors/1', {
        method: 'PUT',
        headers: {
            'Content-Type': 'application/json',
            'Authorization': 'Bearer yourTokenHere'
        },
        body: JSON.stringify({
            name: "Nombre actualizado",
            surnames: "Apellidos actualizados",
            birthdate: "YYYY-MM-DD",
            nationality: "Nacionalidad actualizada"
        })
    })
    .then(res => res.json())
    .then(json => console.log(json));
Respuestas
  • 200 OK:
    
    {
      "message": "Autor modificado" : "No se realizaron cambios"
    }
                        
  • 404 Not Found:
    
    {
      "message": "Autor no encontrado"
    }
                        

Eliminar un autor por ID

Endpoint: DELETE /api/authors/:authorId

Este endpoint elimina un autor específico basado en su ID. Si el autor está relacionado con algún libro, se le asignará un autor general/sin autor.

fetch('https://rest-api-library.vercel.app/api/authors/1', {
        method: 'DELETE',
        headers: {
            'Authorization': 'Bearer yourTokenHere'
        })
    .then(res => res.json())
    .then(json => console.log(json));
Respuestas
  • 201
    
    {
    "message": "Es Autor default del sistema no se puede eliminar"
    }
                
  • 404 Not Found:
    
    {
    "message": "Autor no encontrado"
    }
                
  • 201
    
    {
    "message": "Autor eliminado" : "No se pudo eliminar"
    }
            
  • 📚 Libros

    Obtener todos los libros

    Endpoint: GET /api/books/

    Este endpoint devuelve una lista de todos los libros registrados en el sistema.

    fetch('https://rest-api-library.vercel.app/api/books')
            .then(res => res.json())
            .then(json => console.log(json));

    Crear un nuevo libro

    Endpoint: POST /api/books/

    Este endpoint crea un nuevo libro en la base de datos.

    {
            "name": "Nombre del libro",
            "category": "ID de la categoría",
            "author": "ID del autor",
            "editorial": "ID de la editorial",
            "pages": Número de páginas,
            "year_edition": "Año de edición",
            "stock": Cantidad en stock
        }
    fetch('https://rest-api-library.vercel.app/api/books', {
            method: 'POST',
            headers: {
                'Content-Type': 'application/json',
                'Authorization': 'Bearer yourTokenHere'
            },
            body: JSON.stringify({
                name: "Cien años de soledad",
                category: "ID de la categoría",
                author: "ID del autor",
                editorial: "ID de la editorial",
                pages: 417,
                year_edition: 1967,
                stock: 10
            })
        })
        .then(res => res.json())
        .then(json => console.log(json));

    Modificar un Libro por ID

    Endpoint: PUT /api/books/:bookId

    Este endpoint actualiza la información de un libro específico basado en su ID.

    Parámetros
    • URL Parameter: bookId (string): El ID del libro que se desea actualizar.
    • Request Body:
      
          {
            "name": "Nuevo Nombre del Libro",
            "category": "ID de la categoría",
            "author": "ID del autor",
            "editorial": "ID de la editorial",
            "pages": 350,
            "year_edition": 2022,
            "stock": 10
          }
                              
    Respuestas
    • 200 OK:
      
          {
            "message": "Libro modificado"
          }
                              
    • 404 Not Found:
      
          {
            "message": "Libro no fue encontrado"
          }
                              
    • 500 Internal Server Error:
      
          {
            "message": "Descripción del error"
          }
                              
    Ejemplo de Solicitud
    
        fetch('https://rest-api-library.vercel.app/api/books/12345', {
            method: 'PUT',
            headers: {
                'Content-Type': 'application/json',
                'Authorization': 'Bearer yourTokenHere'
            },
            body: JSON.stringify({
                name: "Nuevo Nombre del Libro",
                category: "ID de la categoría",
                author: "ID del autor",
                editorial: "ID de la editorial",
                pages: 350,
                year_edition: 2022,
                stock: 10
            })
        })
        .then(res => res.json())
        .then(json => console.log(json))
        .catch(error => console.error('Error:', error));
                    
    Ejemplo de Respuesta Exitosa
    
        {
          "message": "Libro modificado"
        }
                    
    Ejemplo de Respuesta con Error
    • Libro no encontrado:
      
          {
            "message": "Libro no fue encontrado"
          }
                              
    • Error en el servidor:
      
          {
            "message": "Descripción del error"
          }
                              

    Actualizar un libro por ID

    Endpoint: PUT /api/books/:bookId

    Este endpoint actualiza la información de un libro basado en su ID.

    {
            "name": "Nombre actualizado",
            "category": "ID de la categoría actualizada",
            "author": "ID del autor actualizado",
            "editorial": "ID de la editorial actualizada",
            "pages": Número de páginas actualizadas,
            "year_edition": "Año de edición actualizado",
            "stock": Cantidad en stock actualizada
        }
    fetch('https://rest-api-library.vercel.app/api/books/1', {
            method: 'PUT',
            headers: {
                'Content-Type': 'application/json',
                'Authorization': 'Bearer yourTokenHere'
            },
            body: JSON.stringify({
                name: "Nombre actualizado",
                category: "ID de la categoría actualizada",
                author: "ID del autor actualizado",
                editorial: "ID de la editorial actualizada",
                pages: 420,
                year_edition: 1970,
                stock: 15
            })
        })
        .then(res => res.json())
        .then(json => console.log(json));

    Eliminar un libro por ID

    Endpoint: DELETE /api/books/:bookId

    Este endpoint elimina un libro específico basado en su ID. Si el libro está relacionado con un préstamo activo, no se podrá eliminar.

    fetch('https://rest-api-library.vercel.app/api/books/1', {
            method: 'DELETE',
            headers: {
                'Authorization': 'Bearer yourTokenHere'
            })
        .then(res => res.json())
        .then(json => console.log(json));

    📓 Editorial

    Obtener todas las editoriales

    Endpoint: GET /api/editorials

    Este endpoint devuelve una lista de todas las editoriales. Si no hay registros, devuelve un mensaje indicando que no hay datos.

    
        fetch('https://rest-api-library.vercel.app/api/editorials')
            .then(res => res.json())
            .then(json => console.log(json))
            .catch(error => console.error('Error:', error));
                    
    Ejemplo de Respuesta sin Datos
    
        {
            "message": "No hay registros"
        }
                    

    Crear una editorial

    Endpoint: POST /api/editorials

    Este endpoint crea una nueva editorial. El nombre de la editorial debe ser proporcionado en el cuerpo de la solicitud.

    Ejemplo de Solicitud
    
        fetch('https://rest-api-library.vercel.app/api/editorials', {
            method: 'POST',
            headers: {
                'Content-Type': 'application/json'
            },
            body: JSON.stringify({
                name: "Nueva Editorial"
            })
        })
        .then(res => res.json())
        .then(json => console.log(json))
        .catch(error => console.error('Error:', error));
                    
    Ejemplo de Respuesta Exitosa
    
        {
            "id": "3",
            "name": "Nueva Editorial"
        }
                    
    Ejemplo de Respuesta con Error
    
        {
            "message": "Error de servidor"
        }
                    

    Obtener una editorial por Id

    Endpoint: GET /api/editorials/:editorialId

    Este endpoint devuelve una editorial específica basada en su ID. Si no se encuentra la editorial, devuelve un mensaje de error.

    Ejemplo de Solicitud
    
        fetch('https://rest-api-library.vercel.app/api/editorials/1')
            .then(res => res.json())
            .then(json => console.log(json))
            .catch(error => console.error('Error:', error));
                    
    Ejemplo de Respuesta Exitosa
    
        {
            "id": "1",
            "name": "Editorial A"
        }
                    
    Ejemplo de Respuesta con Error
    
        {
            "error": "No se encontró editorial"
        }
                    

    Modificar una editorial por Id

    Endpoint: PUT /api/editorials/:editorialId

    Este endpoint actualiza la información de una editorial específica basada en su ID. Debe proporcionar el nombre en el cuerpo de la solicitud.

    Ejemplo de Solicitud
    
        fetch('https://rest-api-library.vercel.app/api/editorials/1', {
            method: 'PUT',
            headers: {
                'Content-Type': 'application/json',
                'Authorization': 'Bearer yourTokenHere'
            },
            body: JSON.stringify({
                name: "Editorial Actualizada"
            })
        })
        .then(res => res.json())
        .then(json => console.log(json))
        .catch(error => console.error('Error:', error));
                    
    Ejemplo de Respuesta Exitosa
    
        {
            "message": "Editorial modificada"
        }
                    
    Ejemplo de Respuesta con Error
    
        {
            "message": "Editorial no encontrada"
        }
                    

    Eliminar una editorial por Id

    Endpoint: DELETE /api/editorials/:editorialId

    Este endpoint elimina una editorial específica basada en su ID. Si la editorial es la predeterminada del sistema, no se puede eliminar. Si se encuentra la editorial y se elimina con éxito, se devuelve un mensaje de confirmación.

    Ejemplo de Solicitud
    
        fetch('https://rest-api-library.vercel.app/api/editorials/1', {
            method: 'DELETE',
            headers: {
                'Authorization': 'Bearer yourTokenHere'
            },
        })
        .then(res => res.json())
        .then(json => console.log(json))
        .catch(error => console.error('Error:', error));
                    
    Ejemplo de Respuesta Exitosa
    
        {
            "message": "Editorial eliminada"
        }
                    
    Ejemplo de Respuesta con Error
    
        {
            "message": "Editorial no encontrada"
        }
                    
    
        {
            "message": "La editorial default del sistema no se puede eliminar"
        }
                    

    🗂️ Categorias

    Obtener todas las categorías

    Endpoint: GET /api/categories

    Este endpoint devuelve una lista de todas las categorías. Si no hay registros, devuelve un mensaje indicando que no hay datos.

    
        fetch('https://rest-api-library.vercel.app/api/categories')
            .then(res => res.json())
            .then(json => console.log(json))
            .catch(error => console.error('Error:', error));
                    
    Ejemplo de Respuesta sin Datos
    
        {
            "message": "No hay registros"
        }
                    

    Crear una categoría

    Endpoint: POST /api/categories

    Este endpoint crea una nueva categoría. El nombre de la categoría debe ser proporcionado en el cuerpo de la solicitud.

    Ejemplo de Solicitud
    
        fetch('https://rest-api-library.vercel.app/api/categories', {
            method: 'POST',
            headers: {
                'Content-Type': 'application/json',
                'Authorization': 'Bearer yourTokenHere'
            },
            body: JSON.stringify({
                name: "Nueva Categoría"
            })
        })
        .then(res => res.json())
        .then(json => console.log(json))
        .catch(error => console.error('Error:', error));
                    
    Ejemplo de Respuesta Exitosa
    
        {
            "id": "3",
            "name": "Nueva Categoría"
        }
                    
    Ejemplo de Respuesta con Error
    
        {
            "message": "Error de servidor"
        }
                    

    Obtener una categoría por Id

    Endpoint: GET /api/categories/:categoryId

    Este endpoint devuelve una categoría específica basada en su ID. Si no se encuentra la categoría, devuelve un mensaje de error.

    Ejemplo de Solicitud
    
        fetch('https://rest-api-library.vercel.app/api/categories/1')
            .then(res => res.json())
            .then(json => console.log(json))
            .catch(error => console.error('Error:', error));
                    
    Ejemplo de Respuesta Exitosa
    
        {
            "id": "1",
            "name": "Categoría A"
        }
                    
    Ejemplo de Respuesta con Error
    
        {
            "error": "No se encontró categoría"
        }
                    
    Modificar una categoría por Id

    Endpoint: PUT /api/categories/:categoryId

    Este endpoint actualiza la información de una categoría específica basada en su ID. Debe proporcionar el nombre en el cuerpo de la solicitud.

    Ejemplo de Solicitud
    
        fetch('https://rest-api-library.vercel.app/api/categories/1', {
            method: 'PUT',
            headers: {
                'Content-Type': 'application/json',
                'Authorization': 'Bearer yourTokenHere'
            },
            body: JSON.stringify({
                name: "Categoría Actualizada"
            })
        })
        .then(res => res.json())
        .then(json => console.log(json))
        .catch(error => console.error('Error:', error));
                    
    Ejemplo de Respuesta Exitosa
    
        {
            "message": "Categoría modificada"
        }
                    
    Ejemplo de Respuesta con Error
    
        {
            "message": "Categoría no encontrada"
        }
                    

    Eliminar una categoría por Id

    Endpoint: DELETE /api/categories/:categoryId

    Este endpoint elimina una categoría específica basada en su ID. Si la categoría es la predeterminada del sistema, no se puede eliminar. Si se encuentra la categoría y se elimina con éxito, se devuelve un mensaje de confirmación.

    Ejemplo de Solicitud
    
        fetch('https://rest-api-library.vercel.app/api/categories/1', {
            method: 'DELETE',
            headers: {
                'Authorization': 'Bearer yourTokenHere'
            })
        })
        .then(res => res.json())
        .then(json => console.log(json))
        .catch(error => console.error('Error:', error));
                    
    Ejemplo de Respuesta Exitosa
    
        {
            "message": "Categoría eliminada"
        }
                    
    Ejemplo de Respuesta con Error
    
        {
            "message": "Categoría no encontrada"
        }
                    
    
        {
            "message": "La categoría default del sistema no se puede eliminar"
        }
                    

    📉 Deudas

    Obtener todas las deudas

    Endpoint: GET /api/debts

    Este endpoint devuelve una lista de todas las deudas. Si no hay registros, devuelve un mensaje indicando que no hay datos.

    Ejemplo de Solicitud
    
    fetch('https://rest-api-library.vercel.app/api/debts', {
            method: 'GET',
            headers: {
                'Authorization': 'Bearer yourTokenHere'
            }
        })
        .then(res => res.json())
        .then(json => console.log(json))
        .catch(error => console.error('Error:', error));
                
    Ejemplo de Respuesta sin Datos
    
    {
        "message": "No hay registros"
    }
                

    Obtener una deuda por Id

    Endpoint: GET /api/debts/:debtId

    Este endpoint devuelve una deuda específica basada en su ID. Si no se encuentra la deuda, devuelve un mensaje de error.

    Ejemplo de Solicitud
    
    fetch('https://rest-api-library.vercel.app/api/debts/1', {
            method: 'GET',
            headers: {
                'Authorization': 'Bearer yourTokenHere'
            }
        })
        .then(res => res.json())
        .then(json => console.log(json))
        .catch(error => console.error('Error:', error));
                
    Ejemplo de Respuesta Exitosa
    
    {
        "id": "1",
        "amount": 500,
        "status": "Activo"
    }
                
    Ejemplo de Respuesta con Error
    
    {
        "error": "No se encontró deuda"
    }
                

    Modificar una deuda por Id

    Endpoint: PUT /api/debts/:debtId

    Este endpoint actualiza el estado de una deuda específica basada en su ID, marcándola como pagada si el monto es suficiente. Debe proporcionar el monto en el cuerpo de la solicitud.

    Ejemplo de Solicitud
    
    fetch('https://rest-api-library.vercel.app/api/debts/1', {
        method: 'PUT',
        headers: {
            'Content-Type': 'application/json',
            'Authorization': 'Bearer yourTokenHere'
        },
        body: JSON.stringify({
            amount: 500
        })
    })
    .then(res => res.json())
    .then(json => console.log(json))
    .catch(error => console.error('Error:', error));
                
    Ejemplo de Respuesta Exitosa
    
    {
        "message": "Deuda modificada, cambio de: 0. Ya puedes cerrar el préstamo"
    }
                
    Ejemplo de Respuesta con Error
    
    {
        "message": "Deuda no encontrada"
    }
                
    
    {
        "message": "El monto a pagar es de: 500"
    }
                

    Eliminar una deuda por Id

    Endpoint: DELETE /api/debts/:debtId

    Este endpoint elimina una deuda específica basada en su ID. No se puede eliminar si la deuda está activa.

    Ejemplo de Solicitud
    
    fetch('https://rest-api-library.vercel.app/api/debts/1', {
        method: 'DELETE',
        headers: {
                'Authorization': 'Bearer yourTokenHere'
            }
    })
    .then(res => res.json())
    .then(json => console.log(json))
    .catch(error => console.error('Error:', error));
                
    Ejemplo de Respuesta Exitosa
    
    {
        "message": "Deuda eliminada"
    }
                
    Ejemplo de Respuesta con Error
    
    {
        "message": "Deuda no encontrada"
    }
                
    
    {
        "message": "La deuda no está pagada, no se puede eliminar"
    }
                

    💸 Prestamos

    Obtener todos los préstamos

    Endpoint: GET /api/loans

    Este endpoint devuelve una lista de todos los préstamos. Si no hay registros, devuelve un mensaje indicando que no hay datos.

    Ejemplo de Solicitud
    
    fetch('https://rest-api-library.vercel.app/api/loans', {
            method: 'GET',
            headers: {
                'Authorization': 'Bearer yourTokenHere'
            }
        })
        .then(res => res.json())
        .then(json => console.log(json))
        .catch(error => console.error('Error:', error));
                
    Ejemplo de Respuesta sin Datos
    
    {
        "message": "No hay registros"
    }
                

    Crear un préstamo

    Endpoint: POST /api/loans

    Este endpoint crea un nuevo préstamo. Debe proporcionar los libros, usuario y fecha máxima en el cuerpo de la solicitud.

    Ejemplo de Solicitud
    
    fetch('https://rest-api-library.vercel.app/api/loans', {
        method: 'POST',
        headers: {
            'Content-Type': 'application/json',
            'Authorization': 'Bearer yourTokenHere'
        },
        body: JSON.stringify({
            books: [
                {"_id": "book1", "amount": 2},
                {"_id": "book2", "amount": 1}
            ],
            user: "user1",
            date_maximun: "2024-08-30"
        })
    })
    .then(res => res.json())
    .then(json => console.log(json))
    .catch(error => console.error('Error:', error));
                
    Ejemplo de Respuesta Exitosa
    
    {
        "id": "1",
        "books": [
            {"_id": "book1", "amount": 2},
            {"_id": "book2", "amount": 1}
        ],
        "user": "user1",
        "date_maximun": "2024-08-30",
        "status": "Activo"
    }
                
    Ejemplo de Respuesta con Error
    
    {
        "message": "El libro book1 no existe"
    }
                
    
    {
        "message": "Tienes 5 libros del _id book1. Estas intentando hacer un préstamo de 10. Verifica la cantidad"
    }
                

    Obtener un préstamo por Id

    Endpoint: GET /api/loans/:loanId

    Este endpoint devuelve un préstamo específico basado en su ID. Si no se encuentra el préstamo, devuelve un mensaje de error.

    Ejemplo de Solicitud
    
    fetch('https://rest-api-library.vercel.app/api/loans/1', {
            method: 'GET',
            headers: {
                'Authorization': 'Bearer yourTokenHere'
            }
        })
        .then(res => res.json())
        .then(json => console.log(json))
        .catch(error => console.error('Error:', error));
                
    Ejemplo de Respuesta Exitosa
    
    {
        "id": "1",
        "books": [
            {"_id": "book1", "amount": 2},
            {"_id": "book2", "amount": 1}
        ],
        "user": "user1",
        "date_maximun": "2024-08-30",
        "status": "Activo"
    }
                
    Ejemplo de Respuesta con Error
    
    {
        "error": "No se encontró préstamo"
    }
                

    Modificar un préstamo por Id

    Endpoint: PUT /api/loans/:loanId

    Este endpoint actualiza un préstamo específico basado en su ID. Solo se puede modificar si el estado es "Activo".

    Ejemplo de Solicitud
    
    fetch('https://rest-api-library.vercel.app/api/loans/1', {
        method: 'PUT',
        headers: {
            'Content-Type': 'application/json',
            'Authorization': 'Bearer yourTokenHere'
        },
        body: JSON.stringify({
            books: [
                {"_id": "book1", "amount": 3},
                {"_id": "book3", "amount": 2}
            ],
            user: "user1",
            date_maximun: "2024-09-05"
        })
    })
    .then(res => res.json())
    .then(json => console.log(json))
    .catch(error => console.error('Error:', error));
                
    Ejemplo de Respuesta Exitosa
    
    {
        "message": "Préstamo modificado"
    }
                
    Ejemplo de Respuesta con Error
    
    {
        "message": "El préstamo ya tiene estado Devuelto, no lo puedes modificar"
    }
                
    
    {
        "message": "Tienes 8 libros del _id book1. Estas intentando hacer un préstamo de 10. Verifica la cantidad"
    }
                

    Cambiar estado a Devuelto para cerrar préstamo

    Endpoint: PUT /api/loans/close/:loanId

    Este endpoint cambia el estado de un préstamo a "Devuelto" y actualiza la fecha de retorno. Se deben cumplir ciertas validaciones antes de cerrar el préstamo.

    Ejemplo de Solicitud
    
    fetch('https://rest-api-library.vercel.app/api/loans/close/1', {
        method: 'PUT',
        headers: {
                'Authorization': 'Bearer yourTokenHere'
            }
    })
    .then(res => res.json())
        .then(json => console.log(json))
        .catch(error => console.error('Error:', error));
                
    Ejemplo de Respuesta Exitosa
    
    {
        "message": "Préstamo cerrado"
    }
                
    Ejemplo de Respuesta con Error
    
    {
        "message": "El préstamo ya tiene estado Devuelto, no lo puedes modificar"
    }
                
    
    {
        "message": "No se puede cerrar. El préstamo tiene una deuda de: $500. El id de la deuda es: debt1"
    }
                

    Eliminar un préstamo

    Endpoint: DELETE /api/loans/:loanId

    Este endpoint elimina un préstamo específico basado en su ID. Solo se puede eliminar si el estado es "Devuelto".

    Ejemplo de Solicitud
    
    fetch('https://rest-api-library.vercel.app/api/loans/1', {
        method: 'DELETE',
        headers: {
                'Authorization': 'Bearer yourTokenHere'
            }
    })
    .then(res => res.json())
        .then(json => console.log(json))
        .catch(error => console.error('Error:', error));
                
    Ejemplo de Respuesta Exitosa
    
    {
        "message": "Préstamo eliminado"
    }
                
    Ejemplo de Respuesta con Error
    
    {
        "message": "Préstamo no ha sido Devuelto, verifica antes de eliminar"
    }
                
    
    {
        "message": "Hubo un error al modificar"
    }
                

    👤 Usuarios

    Obtener todos los usuarios

    Endpoint: GET /api/users

    Descripción: Obtiene una lista de todos los usuarios registrados en el sistema.

    Ejemplo de Solicitud
    
    fetch('https://rest-api-library.vercel.app/api/users', {
            method: 'GET',
            headers: {
                'Authorization': 'Bearer yourTokenHere'
            }
        })
        .then(res => res.json())
        .then(json => console.log(json))
        .catch(error => console.error('Error:', error));
                    
    Ejemplo de Respuesta Sin Registros
    
    {
        "message": "No hay registros"
    }
                    
    Errores Comunes
    
    {
        "message": "Error en el servidor"
    }
                    

    Crear un usuario

    Endpoint: POST /api/users

    Descripción: Crea un nuevo usuario en el sistema.

    Ejemplo de Solicitud
    
    fetch('https://rest-api-library.vercel.app/api/users', {
        method: 'POST',
        headers: {
            'Content-Type': 'application/json',
            'Authorization': 'Bearer yourTokenHere'
        },
        body: JSON.stringify({
            "username": "newuser",
            "email": "newuser@example.com",
            "password": "password123",
            "roles": ["role_name_1", "role_name_2"]
        })
    })
    .then(res => res.json())
    .then(json => console.log(json))
    .catch(error => console.error('Error:', error));
                    
    Ejemplo de Respuesta Exitosa
    
    {
        "_id": "new_user_id",
        "username": "newuser",
        "email": "newuser@example.com",
        "roles": ["role_id_1", "role_id_2"]
    }
                    
    Ejemplo de Respuesta Usuario Existente
    
    {
        "message": "El usuario ya existe, intenta de nuevo"
    }
                    
    Errores Comunes
    
    {
        "message": "Error en el servidor"
    }
                    
    Obtener un usuario por email o username

    Endpoint: POST /api/users/find

    Descripción: Obtiene un usuario basado en el email o el nombre de usuario.

    Ejemplo de Solicitud
    
    fetch('https://rest-api-library.vercel.app/api/users/find', {
        method: 'POST',
        headers: {
            'Content-Type': 'application/json',
            'Authorization': 'Bearer yourTokenHere'
        },
        body: JSON.stringify({
            "username": "existinguser",
            "email": "existinguser@example.com"
        })
    })
    .then(res => res.json())
    .then(json => console.log(json))
    .catch(error => console.error('Error:', error));
                    
    Ejemplo de Respuesta Exitosa
    
    {
        "_id": "existing_user_id",
        "username": "existinguser",
        "email": "existinguser@example.com",
        "roles": ["role_id_1"]
    }
                    
    Ejemplo de Respuesta Usuario No Encontrado
    
    {
        "message": "El usuario no existe"
    }
                    
    Errores Comunes
    
    {
        "message": "Error en el servidor"
    }
                    

    Modificar un usuario

    Endpoint: PUT /api/users/:userId

    Descripción: Modifica un usuario existente.

    Ejemplo de Solicitud
    
    fetch('https://rest-api-library.vercel.app/api/users/:userId', {
        method: 'PUT',
        headers: {
            'Content-Type': 'application/json',
            'Authorization': 'Bearer yourTokenHere'
        },
        body: JSON.stringify({
            "username": "updateduser",
            "email": "updateduser@example.com",
            "password": "newpassword123",
            "roles": ["role_name_1"]
        })
    })
    .then(res => res.json())
    .then(json => console.log(json))
    .catch(error => console.error('Error:', error));
                    
    Ejemplo de Respuesta Exitosa
    
    {
        "message": "Usuario modificado"
    }
                    
    Ejemplo de Respuesta Usuario No Encontrado
    
    {
        "message": "El usuario no existe"
    }
                    
    Errores Comunes
    
    {
        "message": "Error en el servidor"
    }
                    

    Eliminar un usuario

    Endpoint: DELETE /api/users/:userId

    Descripción: Elimina un usuario del sistema.

    Ejemplo de Solicitud
    
    fetch('https://rest-api-library.vercel.app/api/users/:userId', {
        method: 'DELETE',
        headers: {
                'Authorization': 'Bearer yourTokenHere'
        }
    })
    .then(res => res.json())
    .then(json => console.log(json))
    .catch(error => console.error('Error:', error));
                    
    Ejemplo de Respuesta Exitosa
    
    {
        "message": "Usuario eliminado"
    }
                    
    Ejemplo de Respuesta Usuario No Encontrado
    
    {
        "message": "Usuario no encontrado"
    }
                    
    Ejemplo de Respuesta Usuario con Préstamos Activos
    
    {
        "message": "El usuario no se puede eliminar debido a que tiene préstamos activos"
    }
                    
    Ejemplo de Respuesta Usuario del Sistema
    
    {
        "message": "Es usuario del sistema no se puede eliminar"
    }
                    
    Errores Comunes
    
    {
        "message": "Error en el servidor"
    }
                    

    🔑Autenticación

    Registro para usuarios normales

    Endpoint: POST /api/auth/signup

    Descripción: Registra un nuevo usuario con el rol "user".

    Ejemplo de Solicitud
    
    fetch('https://rest-api-library.vercel.app/api/auth/signup', {
        method: 'POST',
        headers: {
            'Content-Type': 'application/json'
        },
        body: JSON.stringify({
            username: "newuser",
            email: "newuser@example.com",
            password: "password123"
        })
    })
    .then(res => res.json())
    .then(json => console.log(json))
    .catch(error => console.error('Error:', error));
                
    Ejemplo de Respuesta Usuario Ya Existe
    
    {
        "message": "Ya existe el usuario. Intenta con otro usuario o correo"
    }
                    
    Errores Comunes
    
    {
        "message": "No fue posible registrarse, intenta de nuevo"
    }
                    

    Iniciar sesión

    Endpoint: POST /api/auth/signin

    Descripción: Inicia sesión para un usuario existente y genera un token JWT.

    Ejemplo de Solicitud
    
    fetch('https://rest-api-library.vercel.app/api/auth/signin', {
        method: 'POST',
        headers: {
            'Content-Type': 'application/json'
        },
        body: JSON.stringify({
            email: "user@example.com",
            password: "password123"
        })
    })
    .then(res => res.json())
    .then(json => console.log(json))
    .catch(error => console.error('Error:', error));
                
    Ejemplo de Respuesta Exitosa
    
    {
        "message": "Sesión iniciada",
        "token": "jwt_token_aqui"
    }
                    
    Ejemplo de Respuesta Usuario No Encontrado
    
    {
        "message": "Usuario no encontrado"
    }
                    
    Ejemplo de Respuesta Contraseña Inválida
    
    {
        "message": "Contraseña inválida",
        "token": null
    }
                    
    Errores Comunes
    
    {
        "message": "Error al iniciar sesión, no se genera token"
    }