Troud es una aplicación backend tipo "Tinder" para intercambio de ropa que permite a los usuarios buscar, encontrar e intercambiar prendas de vestir usadas o nuevas.
- Gestión de Usuarios: Registro, autenticación y gestión de perfiles
- Catálogo de Artículos: CRUD completo para prendas de vestir con categorización
- Sistema de Matching: Funcionalidad tipo "swipe" con likes, superlikes y dislikes
- Gestión de Matches: Creación automática de matches cuando hay interés mutuo
- Subida de Imágenes: Integración con AWS S3 para almacenamiento de fotos
- Autenticación JWT: Sistema seguro de autenticación con tokens
- Framework: Express.js
- Base de Datos: MongoDB 6.x
- Autenticación: Passport.js (Basic + JWT)
- Validación: Joi con middleware personalizado
- Manejo de Errores: Sistema robusto con clases personalizadas
- Almacenamiento: AWS S3
- Encriptación: bcrypt 5.x
- Testing: Mocha + Supertest + nyc
├── config/ # Configuración de variables de entorno
├── lib/ # Conexión a MongoDB
├── routes/ # Rutas de la API con autenticación
├── schemas/ # Validación de datos con Joi
├── services/ # Lógica de negocio
├── utils/ # Utilidades (auth, mocks, testing, errorHandler)
├── test/ # Pruebas unitarias e integración
├── scripts/ # Scripts de configuración y mantenimiento
└── index.js # Punto de entrada con manejo de errores
- Node.js >= 14.x
- MongoDB >= 4.x
- Cuenta de AWS (para S3)
# Clonar el repositorio
git clone https://github.com/personal/troud.git
cd troud
# Instalar dependencias
npm install
# Auditoría de seguridad (recomendado)
npm audit fixCrear un archivo .env en la raíz del proyecto:
# Configuración del servidor
NODE_ENV=development
PORT=8000
# Base de datos MongoDB
DB_USER=your_mongo_user
DB_PASSWORD=your_mongo_password
DB_HOST=your_mongo_host
DB_NAME=troud
# Autenticación JWT
AUTH_JWT_SECRET=your_super_secret_jwt_key
# AWS S3 (para imágenes)
ACCESS_KEY_ID=your_aws_access_key
SECRET_ACCESS_KEY=your_aws_secret_keynpm run dev # Ejecuta con nodemon (auto-restart)npm start # Ejecuta en modo producciónnpm test # Ejecuta las pruebas
npm run cover # Ejecuta pruebas con coverage
npm run report # Genera reporte HTML de coveragenpm run test:connection # Probar conexión a MongoDB
npm run test:auth # Probar endpoint de autenticación
npm run schema:setup # Configurar esquemas e índices
npm run seed # Insertar datos de prueba
npm run db:reset # ⚠️ Eliminar todas las colecciones
npm run db:full-setup # Setup completo (schema + seed)POST /api/auth/token- Obtener token JWT
GET /api/users- Listar usuarios (requiere auth)GET /api/users/:userId- Obtener usuario por ID (requiere auth)POST /api/users- Crear nuevo usuarioPUT /api/users/:userId- Actualizar usuario (requiere auth)DELETE /api/users/:userId- Eliminar usuario (requiere auth)
GET /api/articles- Listar artículos (requiere auth)GET /api/articles/:articleId- Obtener artículo por ID con estadísticas de reaccionesGET /api/articles/categories/:category/:phoneUser- Obtener artículos por categoría (requiere auth)GET /api/articles/unreaction/:phoneUser- Obtener artículos sin reacción (requiere auth)POST /api/articles- Crear nuevo artículo (requiere auth)PUT /api/articles/:articleId- Actualizar artículo (requiere auth)DELETE /api/articles/:articleId- Eliminar artículo (requiere auth)
GET /api/reactions- Listar reacciones (requiere auth)GET /api/reactions/:reactionId- Obtener reacción por ID (requiere auth)POST /api/reactions- Crear nueva reacción (requiere auth)DELETE /api/reactions/:reactionId- Eliminar reacción (requiere auth)
GET /api/matches- Listar matches (requiere auth)GET /api/matches/:matchId- Obtener match por ID (requiere auth)GET /api/matches/phone/:phoneFirst- Obtener matches por teléfono (requiere auth)POST /api/matches- Crear nuevo match (requiere auth)DELETE /api/matches/:phoneFirst/:phoneSecond- Eliminar match (requiere auth)
GET /api/images- Listar imágenesGET /api/images/:imageId- Obtener imagen por IDPOST /api/images- Subir nueva imagen
{
userName: String, // Nombre de usuario (máx 120 chars)
email: String, // Email válido
password: String, // Contraseña encriptada (8+ chars, mayús, minus, num)
phone: String, // Teléfono (7-10 dígitos)
urlPhoto: String, // URL de foto de perfil
profileId: ObjectId // ID de perfil opcional
}{
phoneOwner: String, // Teléfono del propietario
idOwner: ObjectId, // ID del propietario
type: String, // Tipo de prenda
size: String, // Talla
name: String, // Nombre del artículo
brand: String, // Marca
condition: String, // Estado (nuevo, usado, etc.)
gender: String, // Género (hombre, mujer, unisex)
description: String, // Descripción
color: String, // Color
date: String, // Fecha de creación
urlPhoto: String, // URL de la foto
city: String // Ciudad
}{
phoneUser: String, // Teléfono del usuario que reacciona
phoneOwner: String, // Teléfono del propietario del artículo
idArticle: ObjectId, // ID del artículo
type: String // Tipo: "Like", "SuperLike", "DisLike"
}{
phoneFirst: String, // Teléfono usuario 1
nameFirst: String, // Nombre usuario 1
phoneSecond: String, // Teléfono usuario 2
nameSecond: String, // Nombre usuario 2
urlPhotoArticleFirst: String, // URL foto artículo usuario 1
urlPhotoArticleSecond: String,// URL foto artículo usuario 2
firstArticleName: String, // Nombre artículo usuario 1
secondArticleName: String, // Nombre artículo usuario 2
urlChat: String, // URL del chat (WhatsApp)
date: String // Fecha del match
}- Basic Auth: Para obtener el token inicial (username=phone, password=password)
- JWT Bearer: Para endpoints protegidos (Header:
Authorization: Bearer <token>) - Tokens expiración: 30 minutos por defecto
- Clases de Error Personalizadas: ValidationError, AuthenticationError, NotFoundError, ConflictError
- Middleware Global: Captura y procesa todos los errores de forma consistente
- Logging Detallado: Incluye URL, método, IP, timestamp para debugging
- Respuestas Consistentes: Formato estandarizado con
success: boolean - Validación Automática: ObjectId y esquemas Joi con middleware
- Validación de Entrada: Todos los inputs validados con esquemas Joi
- Verificación de Existencia: Recursos verificados antes de operaciones UPDATE/DELETE
- Validación de ObjectId: Automática en todos los endpoints con parámetros ID
- Contraseñas: Encriptadas con bcrypt (salt rounds: 10)
- Prevención de Duplicados: Índices únicos en campos críticos
- Configurado para aceptar todos los orígenes en desarrollo
- Métodos permitidos: GET, POST, PUT, DELETE
- Headers personalizables para producción
El proyecto incluye configuración para Vercel en now.json:
# Desplegar a Vercel
vercel --prodConfigurar en Vercel:
@troud-db-password@troud-db-user@troud-db-name@troud-db-host@troud-auth-admin-username@troud-auth-admin-password@troud-auth-admin-email@troud-auth-jwt-secret@troud-secret-access-key@troud-access-key-id
Puedes ver la demo en vivo en: troud.vercel.app
- Registro: Usuario se registra con email, teléfono y contraseña
- Login: Obtiene token JWT con credenciales
- Subir Artículos: Usuario sube fotos y datos de sus prendas
- Explorar: Ve artículos de otros usuarios por categoría
- Reaccionar: Da like, superlike o dislike a artículos
- Match: Si hay interés mutuo, se crea un match automáticamente
- Chat: Los usuarios pueden contactarse vía WhatsApp
El proyecto incluye tests completos:
- Tests unitarios para servicios
- Tests de integración para rutas
- Tests de esquemas de validación
- Coverage reports con nyc
- Fork el repositorio
- Crea una rama para tu feature (
git checkout -b feature/nueva-funcionalidad) - Commit tus cambios (
git commit -am 'Añadir nueva funcionalidad') - Push a la rama (
git push origin feature/nueva-funcionalidad) - Crea un Pull Request
Este proyecto está licenciado bajo la Licencia ISC.
- Alexander Alvarez
- Andrés Felipe Carrión
- Andrés Felipe Chávez
- Felipe Merchán
- Luis Ruiz
Para más información sobre la API, consulta la documentación de Swagger en /api-docs una vez que la aplicación esté ejecutándose.