API REST desarrollada con Fastify y TypeORM para la aplicación de gestión de tareas.
- Fastify 5.6 - Framework web rápido y eficiente
- TypeORM 0.3 - ORM para TypeScript
- PostgreSQL 15 - Base de datos relacional
- JWT - Autenticación basada en tokens
- bcrypt - Hash de contraseñas
- DiceBear - Generación de avatares abstractos
backend/
├── src/
│ ├── config/ # Configuración (data-source, etc.)
│ ├── controllers/ # Controladores de rutas
│ │ ├── auth.controller.ts
│ │ ├── task.controller.ts
│ │ ├── project.controller.ts
│ │ ├── user.controller.ts
│ │ └── ...
│ ├── entities/ # Entidades TypeORM
│ │ ├── User.ts
│ │ ├── Task.ts
│ │ ├── Project.ts
│ │ └── ...
│ ├── routes/ # Definición de rutas
│ ├── services/ # Lógica de negocio
│ ├── plugins/ # Plugins de Fastify
│ ├── utils/ # Utilidades
│ │ └── avatar.ts # Generación de avatares
│ └── index.ts # Punto de entrada
├── docker-compose.yml # Configuración de PostgreSQL
├── package.json
└── tsconfig.json
- Instalar dependencias
bun install- Configurar variables de entorno
Crea un archivo
.enven la raíz del backend:
PORT=8080
DB_HOST=localhost
DB_PORT=5433
DB_USERNAME=postgres
DB_PASSWORD=tu_contraseña
DB_DATABASE=todo_app
JWT_SECRET=tu_secreto_jwt_muy_seguro- Iniciar PostgreSQL con Docker
docker-compose up -d- Iniciar el servidor en desarrollo
bun run devEl servidor estará disponible en http://localhost:8080
bun run dev- Inicia el servidor en modo desarrollo con hot-reloadbun run build- Compila TypeScript a JavaScriptbun run start- Inicia el servidor en modo producciónbun run typeorm- Ejecuta comandos de TypeORM
- User: Usuarios del sistema (email, password, name, avatar, language)
- Task: Tareas (title, description, dueDate, priority, projectId, sectionId)
- Project: Proyectos (name, description, isFavorite)
- Section: Secciones dentro de proyectos
- Tag: Etiquetas para categorizar tareas
- Category: Categorías predefinidas
TypeORM está configurado con synchronize: true para desarrollo. En producción, usa migraciones.
El backend usa JWT (JSON Web Tokens) para autenticación:
-
Registro:
POST /api/auth/register{ "email": "usuario@example.com", "password": "contraseña" } -
Login:
POST /api/auth/login{ "email": "usuario@example.com", "password": "contraseña" }Respuesta:
{ "token": "jwt_token_aqui" } -
Rutas Protegidas: Todas las rutas excepto
/api/auth/*requieren el header:Authorization: Bearer <token>
POST /api/auth/register- Registrar nuevo usuarioPOST /api/auth/login- Iniciar sesión
GET /api/users/me- Obtener usuario actualPATCH /api/users/me- Actualizar usuario (name, avatar, language)
GET /api/tasks- Listar tareas (con filtros opcionales)POST /api/tasks- Crear tareaPATCH /api/tasks/:id- Actualizar tareaDELETE /api/tasks/:id- Eliminar tarea
GET /api/projects- Listar proyectosPOST /api/projects- Crear proyectoPATCH /api/projects/:id- Actualizar proyectoDELETE /api/projects/:id- Eliminar proyecto
GET /api/tags- Listar etiquetasPOST /api/tags- Crear etiquetaDELETE /api/tags/:id- Eliminar etiqueta
GET /api/sections?projectId=:id- Listar secciones de un proyectoPOST /api/sections- Crear secciónPATCH /api/sections/:id- Actualizar secciónDELETE /api/sections/:id- Eliminar sección
El backend genera avatares abstractos usando DiceBear con la paleta de colores de la aplicación:
- Se genera automáticamente un avatar al registrar un usuario
- Los avatares se guardan como Data URI en la base de datos
- Colores utilizados:
#2d3142,#4f5d75,#ef8354,#bfc0c0,#f5a882
El backend soporta el guardado del idioma preferido del usuario:
- Campo
languageen la entidad User - Valor por defecto:
'en' - Se actualiza mediante
PATCH /api/users/me
- Contraseñas hasheadas con bcrypt (10 rounds)
- JWT con expiración configurable
- CORS configurado para el frontend
- Validación de datos en controladores
El proyecto incluye un docker-compose.yml para PostgreSQL:
docker-compose up -d # Iniciar
docker-compose down # Detener
docker-compose logs # Ver logs- Compilar el proyecto
bun run build-
Configurar variables de entorno de producción
-
Iniciar el servidor
bun run start