Arquitectura del Backend
Arquitectura detallada del backend de Floutic.
Estructura de Directorios
/app
├── api/v1/endpoints/ # Módulos de endpoints
│ ├── auth/ # Autenticación (modular)
│ │ ├── __init__.py # Router principal
│ │ ├── registration.py # Registro de usuarios
│ │ ├── login.py # Login estándar y seguro
│ │ ├── session.py # Refresh, logout, verify
│ │ ├── email_verification.py # Verificación de email
│ │ ├── password.py # Recuperación de contraseña
│ │ └── roles.py # Gestión de roles
│ ├── users.py # Gestión de usuarios
│ ├── profiles.py # Perfiles empresa/experto/admin (incluye subida de imagen y perfiles de admin)
│ └── services/
│ └── profile_image_service.py # Servicio centralizado para manejo de imágenes de perfil
│ ├── projects/ # Proyectos y matching (modular)
│ │ ├── __init__.py # Router principal
│ │ ├── listing.py # Listado de proyectos
│ │ ├── crud.py # CRUD básico
│ │ ├── applications.py # Aplicaciones de expertos
│ │ ├── selection.py # Selección de expertos
│ │ ├── workflow.py # Validación y curación
│ │ ├── disputes.py # Gestión de disputas
│ │ └── helpers.py # Funciones auxiliares
│ ├── chat.py # Sistema de mensajería
│ ├── payments.py # Pagos y escrow
│ ├── reviews.py # Reseñas y reputación
│ ├── milestones.py # Hitos y entregas
│ ├── admin/ # Panel administrativo (modular)
│ │ ├── __init__.py # Router principal
│ │ ├── users.py # Gestión de usuarios
│ │ ├── projects.py # Gestión de proyectos
│ │ ├── payments.py # Endpoints de pagos (delgados, delegan a PaymentService)
│ │ ├── disputes.py # Gestión de disputas
│ │ ├── metrics.py # Métricas y dashboard
│ │ ├── commissions.py # Configuración de comisiones
│ │ ├── skill_pages.py # Páginas de habilidades
│ │ ├── exports.py # Exportación de datos
│ │ ├── system.py # Salud del sistema
│ │ └── helpers.py # Funciones auxiliares
│ └── ghl_integration.py # Integración GoHighLevel
├── models/ # Modelos de base de datos
├── schemas/ # Esquemas Pydantic
├── services/ # Servicios especializados
│ ├── payment_service.py # Lógica de negocio de pagos y escrow
│ ├── profile_image_service.py # Manejo de imágenes
│ └── ... # Otros servicios (Stripe, Email, etc.)
└── core/ # Configuración y seguridad
Componentes Principales
Endpoints
Los endpoints están organizados por funcionalidad en módulos separados.
Modelos
Modelos SQLAlchemy que representan las entidades de la base de datos.
Modelo Profile:
- Soporta múltiples tipos:
empresa,experto,admin - Campos específicos por tipo de perfil
- Campos de admin:
full_name,team_role,display_order,is_visible_in_team, redes sociales (LinkedIn, Twitter, GitHub, Instagram, TikTok),personal_website - Campo común
profile_picturepara todos los tipos de perfil - Campo
internal_rating(1.0-5.0) para valoración administrativa de expertos
Modelo InternalRatingHistory:
- Registra todos los cambios de valoración interna con trazabilidad completa
- Campos:
user_id,profile_id,old_rating,new_rating,reason,changed_by_id,created_at - Permite auditar quién cambió la valoración, cuándo y por qué
Schemas
Esquemas Pydantic para validación de datos de entrada y salida.
Servicios
Lógica de negocio encapsulada en servicios reutilizables.
ProfileImageService (app/services/profile_image_service.py):
- Validación robusta de imágenes (tipo, tamaño, extensión)
- Validación con Pillow para asegurar que el archivo sea realmente una imagen
- Optimización automática de imágenes (redimensionado, compresión)
- Normalización centralizada de rutas
- Funciones para guardar y eliminar imágenes
- Conversión entre rutas de BD y rutas de archivo físico
- Generación de nombres de archivo SEO-friendly
PaymentService (app/services/payment_service.py):
- Gestión centralizada de pagos Escrow
- Interacción con Stripe Connect (PaymentIntents, Transfers, Refunds)
- Reglas de negocio críticas: prevención de duplicados, validación de presupuestos
- Sincronización automática de estados mediante webhooks
- Gestión de hitos (milestones) relacionada con pagos
Core
Configuración, seguridad y utilidades compartidas.
Manejo de Fechas (Datetime Utils):
app/core/datetime_utils.pyprovee funciones seguras para manejo de tiempo.now_utc(): Retorna datetime con timezone UTC (para lógica de negocio).now_utc_naive(): Retorna datetime sin timezone (para camposTIMESTAMP WITHOUT TIME ZONEde PostgreSQL).- Validación Runtime: Ambas funciones validan que el retorno sea correcto para prevenir errores 500 en producción.
Flujo de Datos
- Request → Endpoint
- Validación → Schema Pydantic
- Lógica → Service
- Persistencia → Model (SQLAlchemy)
- Response → Schema Pydantic
Estándares y Limitaciones
Paginación
Por defecto, los endpoints de listado (ej. /profiles/experts) están paginados.
- Límite máximo por página (size): 100 items.
- Comportamiento si excede: Retorna error
422 Unprocessable Entity. - Iteración: Los consumidores deben iterar paginando manualmente si necesitan recuperar todos los registros (ej. generación de sitemaps).