# 📚 BookSwap API
Una API construida con **NestJS** que permite a los usuarios intercambiar libros. Los visitantes pueden ver todos los libros disponibles sin autenticación, mientras que los usuarios autenticados pueden publicar nuevos libros.
---
## 🎯 Objetivo del Proyecto
Diseñar y desarrollar una API RESTful que permita:
- Registrar usuarios manualmente en base de datos.
- Autenticarse mediante JWT.
- Publicar libros por parte de usuarios autenticados.
- Consultar libros públicamente.
---
## 🛠️ Tecnologías Utilizadas
- [NestJS](https://nestjs.com/)
- [TypeORM](https://typeorm.io/)
- [PostgreSQL](https://www.postgresql.org/)
- [JWT](https://jwt.io/)
- [Swagger](https://swagger.io/)
---
## 🧱 Estructura del Proyecto
```bash
src/
├── auth/
│ ├── auth.controller.ts
│ ├── auth.service.ts
│ ├── jwt-auth.guard.ts
│ ├── jwt.strategy.ts
│ └── auth.module.ts
├── books/
│ ├── dto/create-book.dto.ts
│ ├── books.controller.ts
│ ├── books.service.ts
│ ├── book.entity.ts
│ └── books.module.ts
├── public/
│ ├── public.controller.ts
│ └── public.module.ts
├── users/
│ ├── user.entity.ts
│ ├── users.controller.ts
│ ├── users.service.ts
│ └── users.module.ts| Campo | Tipo | Descripción |
|---|---|---|
| id | number | Clave primaria autogenerada |
| string | Único | |
| name | string | Nombre del usuario |
| password | string | Contraseña sin encriptar |
Nota: Los usuarios se insertan directamente en la base de datos (semilla). No hay registro desde Postman ni frontend.
| Campo | Tipo | Descripción |
|---|---|---|
| id | number | Clave primaria autogenerada |
| title | string | Título del libro |
| author | string | Autor del libro |
| description | string | Descripción del libro |
| owner | User | Relación ManyToOne con entidad User |
- Autenticación basada en JWT.
@nestjs/jwt+ estrategiaJwtStrategy.- Protección de rutas con
AuthGuard.
- Endpoint:
POST /auth/login - Enviar en el body:
{ "email": "usuario@email.com", "password": "1234" } - Respuesta: token JWT.
GET /public/books: Retorna todos los libros con su respectivo dueño (solo nombre). No requiere autenticación.
POST /books: Permite a usuarios autenticados publicar libros. Requiere token Bearer.
-
Iniciar sesión en
/auth/logincon email y password → recibir token. -
Usar el token en el header para enviar un libro:
Authorization: Bearer <token> -
Enviar en
POST /booksel JSON del libro:{ "title": "1984", "author": "George Orwell", "description": "Una novela distópica sobre el control y la vigilancia." } -
Cualquier usuario (incluso sin token) puede hacer
GET /public/bookspara ver los libros.
La documentación Swagger está disponible en:
http://localhost:3000/api
- Estructura modular NestJS
- TypeORM con PostgreSQL
- Autenticación con JWT
- Rutas protegidas con AuthGuard
- Documentación Swagger funcional
- Uso de DTOs para validación
Diego Morales