Aplicación de citas moderna con sistema de historias tipo Instagram, matching inteligente, mensajería en tiempo real y backend seguro en Golang.
- ✅ Autenticación completa (Login/Register)
- 📸 Sistema de historias tipo Instagram
- 💕 Swipe para matches (like/dislike/superlike)
- 💬 Chat en tiempo real con WebSocket
- 📷 Gestión de fotos de perfil
- 🎨 UI moderna con Tailwind CSS y Radix UI
- 🌙 Modo oscuro/claro
- 📱 Diseño responsive (mobile-first)
- 🔐 Autenticación JWT con refresh tokens
- 🗄️ PostgreSQL con PostGIS para geolocalización
- 📡 WebSocket para mensajería en tiempo real
- 🔒 Seguridad avanzada (OWASP, rate limiting, CORS)
- 📦 Arquitectura limpia con patrones de diseño
- 🐳 Docker y Docker Compose
- 📊 Sistema de historias con expiración automática
- 🎯 Algoritmo de matching por compatibilidad
- Node.js 18+
- Go 1.22+
- PostgreSQL 15+ con PostGIS
- Docker (opcional)
# Navegar al directorio del backend
cd backend
# Copiar archivo de configuración
cp .env.example .env
# Editar .env con tus configuraciones
# DB_PASSWORD=tu_password_seguro
# JWT_SECRET=tu_jwt_secret_muy_seguro
# Instalar dependencias
go mod download
# Crear base de datos
make setup-db
# Ejecutar migraciones
make migrate-up
# Ejecutar backend
make runEl backend estará disponible en http://localhost:8080
# En la raíz del proyecto
npm install
# Copiar archivo de configuración
cp .env.local.example .env.local
# Ejecutar en modo desarrollo
npm run devEl frontend estará disponible en http://localhost:3000
# Backend con Docker Compose
cd backend
docker-compose up -d
# Verificar que todo esté funcionando
docker-compose logs -f
# Frontend
cd ..
npm install
npm run devllm-dating-app-2/
├── app/ # Next.js App Router
│ ├── layout.tsx
│ └── page.tsx
├── components/ # Componentes React
│ ├── auth/ # Componentes de autenticación
│ ├── stories/ # Sistema de historias
│ ├── swipe/ # Sistema de swipe
│ ├── matches/ # Listado de matches
│ ├── navigation/ # Navegación
│ └── ui/ # Componentes UI base
├── lib/ # Librerías y utilidades
│ ├── api/ # Cliente API
│ │ ├── client.ts # Axios client con interceptores
│ │ ├── auth.ts # API de autenticación
│ │ ├── stories.ts # API de historias
│ │ ├── matches.ts # API de matches
│ │ └── messages.ts # API de mensajes
│ ├── hooks/ # Custom hooks
│ │ └── useWebSocket.ts # Hook de WebSocket
│ └── auth-context.tsx # Contexto de autenticación
├── backend/ # Backend en Golang
│ ├── cmd/api/ # Punto de entrada
│ ├── config/ # Configuración
│ ├── internal/ # Código interno
│ │ ├── models/ # Modelos de datos
│ │ ├── repository/ # Capa de datos
│ │ ├── service/ # Lógica de negocio
│ │ ├── handler/ # HTTP handlers
│ │ ├── middleware/ # Middleware
│ │ └── websocket/ # WebSocket manager
│ ├── pkg/ # Paquetes públicos
│ ├── migrations/ # Migraciones SQL
│ └── Dockerfile
└── README.md
NEXT_PUBLIC_API_URL=http://localhost:8080/api/v1
NEXT_PUBLIC_WS_URL=ws://localhost:8080/api/v1/wsVer backend/.env.example para la lista completa.
Principales:
DB_PASSWORD: Contraseña de PostgreSQLJWT_SECRET: Secret para JWT tokensJWT_REFRESH_SECRET: Secret para refresh tokensSTORAGE_TYPE: "local" o "s3"AWS_*: Credenciales de AWS (si usas S3)
POST /api/v1/auth/register- Registrar usuarioPOST /api/v1/auth/login- Iniciar sesiónPOST /api/v1/auth/refresh- Refrescar tokenGET /api/v1/auth/me- Obtener usuario actual
POST /api/v1/stories- Crear historiaGET /api/v1/stories/feed- Feed de historiasPOST /api/v1/stories/{id}/view- Marcar como vistaGET /api/v1/stories/{id}/views- Ver quién vio
POST /api/v1/swipe- Swipe (like/dislike)GET /api/v1/discover- Usuarios para descubrirGET /api/v1/matches- Obtener matchesDELETE /api/v1/matches/{id}- Unmatch
POST /api/v1/messages- Enviar mensajeGET /api/v1/messages/{matchId}- Obtener conversaciónPATCH /api/v1/messages/{id}/read- Marcar como leído
GET /api/v1/ws- Conectar WebSocket (requiere auth)
Ver backend/README.md para documentación completa de la API.
El backend implementa múltiples capas de seguridad:
-
Autenticación
- JWT con algoritmo HS256
- Tokens de refresh separados
- Bcrypt para passwords (cost 12)
-
Protección contra ataques
- Rate limiting por IP
- Protección CSRF
- Headers de seguridad (OWASP)
- Sanitización de inputs
- Protección SQL Injection
-
HTTPS
- En producción, usar HTTPS obligatorio
- Strict-Transport-Security headers
-
Validación
- Validación exhaustiva en backend
- Tipos seguros con TypeScript en frontend
# Backend
cd backend
make test
# Frontend
npm run testcd backend
# Build Docker image
docker build -t dating-app-backend:latest .
# Run
docker run -p 8080:8080 --env-file .env dating-app-backend:latest# Build para producción
npm run build
# Start servidor de producción
npm startO desplegar en Vercel:
vercel deploy --prodHandlers → Services → Repositories → Database
↓ ↓ ↓
Middleware Business Data Access
(Auth, Logic (Repository
Security) Pattern)
- Singleton: Config, JWT Manager, Database Connection
- Repository: Abstracción de acceso a datos
- Factory: Creación de storage instances
- Strategy: Diferentes estrategias de almacenamiento
- Service Layer: Separación de lógica de negocio
- Fork el proyecto
- Crea una rama (
git checkout -b feature/amazing-feature) - Commit tus cambios (
git commit -m 'Add amazing feature') - Push a la rama (
git push origin feature/amazing-feature) - Abre un Pull Request
Este proyecto es privado y confidencial.
# Verificar que PostgreSQL esté corriendo
psql -U postgres -c "SELECT version();"
# Verificar conexión
psql -h localhost -U dating_app -d dating_app_db- Verificar que el backend esté corriendo en el puerto correcto
- Verificar las variables de entorno en
.env.local - Verificar CORS en el backend
- Verificar que estés usando el protocolo correcto (ws:// o wss://)
- Verificar que el token JWT sea válido
- Revisar logs del backend
Para soporte técnico, abre un issue en el repositorio.
Desarrollado con ❤️ usando Next.js, React, Golang, PostgreSQL y mucho café ☕