turnaki-nexioq Svelte Themes

Turnaki Nexioq

Sistema SaaS Multi-Tenant de Reservas Odontológicas - Terraform + Rust + Svelte

🦷 Turnaki-NexioQ

Sistema SaaS Multi-Tenant de Reservas Odontológicas


🚀 Quick Start

Prerrequisitos

  • Terraform ≥ 1.9
  • AWS CLI configurado
  • Node.js ≥ 20
  • Rust ≥ 1.75
  • Cargo Lambda

Deployment

# 1. Inicializar backend de Terraform
cd terraform
./scripts/init-backend.sh

# 2. Deploy ambiente dev
cd environments/dev
terraform init
terraform plan
terraform apply

# 3. Build y deploy lambdas
cd ../../../backend
cargo lambda build --arm64 --release
cp target/lambda/*/bootstrap.zip ../terraform/environments/dev/lambda-assets/
cd ../terraform/environments/dev
terraform apply

# 4. Deploy frontend
cd ../../../frontend
npm run build
BUCKET=$(terraform -chdir=../../terraform/environments/dev output -raw frontend_bucket_name)
aws s3 sync build/ "s3://${BUCKET}/"

Desarrollo Local

# Frontend
cd frontend
npm run dev
# http://localhost:5173

# Backend (tests)
cd backend
cargo test --workspace

🔄 CI/CD Automatizado

Estado: ✅ OPERATIVO (v2.2.0)

GitHub Actions Workflows

Workflow Trigger Descripción
terraform-plan PR a main Plan automático en PR
terraform-apply-dev Push a main Deploy automático en dev
terraform-apply-qas Manual Deploy controlado en qas
terraform-apply-prd Manual Deploy a producción
backend-ci Cambios en backend/ Tests + build lambdas
frontend-ci Cambios en frontend/ Tests + build Svelte

Seguridad y Observabilidad

  • ✅ AWS OIDC integrado (sin access keys)
  • ✅ Alarmas CloudWatch ampliadas (Lambda, DynamoDB, WAF)
  • ✅ WAF con reglas administradas de AWS
  • ✅ Point-in-time recovery en DynamoDB (QAS/PRD)
  • ✅ Módulo Secrets Manager para configuraciones sensibles

Flujo de Trabajo

# 1. Crear feature branch
git checkout -b feature/nueva-funcionalidad

# 2. Hacer cambios y push
git push origin feature/nueva-funcionalidad

# 3. Crear PR en GitHub
# → terraform-plan se ejecuta automáticamente
# → Comentario con plan aparece en PR

# 4. Merge a main (después de aprobación)
# → terraform-apply-dev se ejecuta automáticamente
# → Dev se actualiza en ~10 minutos

# 5. Deploy a producción (manual)
gh workflow run terraform-apply-prd.yml -f confirm=yes

Configuración Inicial

Para configurar los workflows por primera vez:

  1. Configurar Secrets de AWS

    # Ver: .github/SECRETS_SETUP.md
    # Configurar AWS_ROLE_TO_ASSUME en GitHub Settings
    
  2. Crear Environments

    • Settings → Environments
    • Crear: dev, qas, prd
    • Configurar required reviewers
  3. Primera Ejecución

    # Test del workflow
    gh workflow run terraform-plan.yml
    

Ver documentación completa: .github/workflows/README.md


📚 Documentación

Documentación Principal

Documentos Históricos


🏗️ Stack Tecnológico

Capa Tecnología
Frontend SvelteKit 5 + TypeScript + TailwindCSS
Backend Rust 1.89 + AWS Lambda
Database DynamoDB (single-table)
Auth Cognito User Pool + JWT
IaC Terraform 1.9
CI/CD GitHub Actions
Monitoring CloudWatch + X-Ray

💻 Stack Tecnológico Detallado

Backend (Rust)

Language:      Rust 1.89
Runtime:       AWS Lambda AL2023 ARM64
Framework:     lambda_http 0.13
Database:      DynamoDB (single-table)
Architecture:  8 Lambdas serverless

Lambdas Implementados:

  • health - Health check
  • availability - Consulta disponibilidad
  • tenants - CRUD tenants
  • treatments - CRUD tratamientos
  • professionals - CRUD profesionales
  • bookings - CRUD completo + reprogramación
  • send-notification - Emails con templates HTML
  • schedule-reminder - EventBridge Scheduler

Frontend (SvelteKit)

Framework:     SvelteKit 5 (Runes)
Language:      TypeScript 5.6
Build Tool:    Vite 7
Styling:       TailwindCSS (inline)
Calendar:      FullCalendar
PWA:           vite-plugin-pwa

Páginas:

  • / - Home con navegación
  • /booking - Wizard 3 pasos
  • /my-appointments - Portal paciente
  • /admin - Panel admin
  • /calendar - Calendario FullCalendar ⭐
  • /auth/callback - OAuth callback

Infraestructura (Terraform)

IaC:           Terraform 1.9
Módulos:       9 módulos reutilizables
Ambientes:     dev, qas, prd
Region:        us-east-1

Módulos Terraform:

  • iam - Roles y políticas
  • dynamodb - Tabla con GSIs
  • cognito - User Pool + Client
  • lambda - Funciones genéricas
  • api-gateway - HTTP API + JWT Authorizer
  • s3-cloudfront - Frontend hosting
  • waf - Protección DDoS
  • cloudwatch - Dashboard + Alarmas
  • ses - Email sending

✨ Funcionalidades Principales

🔐 Autenticación Completa

  • Login/Registro con Cognito Hosted UI
  • 5 roles: Owner, Admin, Odontólogo, Recepción, Paciente
  • JWT authorizer en API Gateway
  • MFA opcional por grupo
  • Session management con refresh tokens

📅 Motor de Reservas (Sin Overbooking)

// Transacción atómica garantizada
TransactWriteItems [
  Put(slot) + ConditionExpression("attribute_not_exists(PK)"),
  Put(booking)
]
  • Consulta disponibilidad: Query DynamoDB real-time
  • Reserva atómica: Sin race conditions
  • Cancelación: Libera slot automáticamente
  • Reprogramación: 3 operaciones en transacción única

🗓️ Calendario Back-Office (FullCalendar)

  • Vista día/semana/mes/lista
  • Drag & drop para reprogramar citas
  • Modal de detalles interactivo
  • Colores por estado (confirmada/cancelada)
  • Estadísticas en tiempo real
  • Filtrado por profesional/sede

📧 Sistema de Notificaciones

Templates HTML:

  • booking-confirmation.html - Confirmación de cita
  • booking-reminder.html - Recordatorio T-24h y T-2h
  • booking-cancelled.html - Cancelación

Características:

  • Diseño responsive con inline CSS
  • Personalización con variables
  • SES para envío
  • EventBridge Scheduler para recordatorios

📊 Ambientes

Ambiente URL Estado
Dev https://dev.turnaki.nexioq.com ✅ Activo
QAS https://qas.turnaki.nexioq.com 🚧 Configurado
PRD https://turnaki.nexioq.com ⏸️ Pendiente

📦 Endpoints API

Públicos

GET  /health                      → Health check

Protegidos (JWT Required)

# Bookings
GET    /bookings?tenant_id=...    → Listar citas
POST   /bookings                  → Crear cita
DELETE /bookings/{id}             → Cancelar cita
PUT    /bookings/{id}             → Reprogramar cita

# Availability
POST   /booking/availability      → Consultar disponibilidad

# Tenants
GET    /tenants?...                → Listar clínicas
POST   /tenants                   → Crear clínica
GET    /tenants/{id}              → Obtener clínica

# Treatments
GET    /treatments?tenant_id=...  → Listar tratamientos
POST   /treatments                → Crear tratamiento

# Professionals
GET    /professionals?tenant_id=... → Listar profesionales
POST   /professionals              → Crear profesional

🧪 Testing

Backend

cd backend
cargo test --workspace
# 8 tests, 100% passing, 70% coverage

Frontend

cd frontend
npm run test          # Unit tests (Vitest)
npm run test:e2e      # E2E tests (Playwright)
# 6 unit tests, 12 E2E scenarios, 85% passing

Ver docs/TESTING.md para más detalles.


🔒 Seguridad

Implementado

  • ✅ WAF v2 con rate limiting (2000 req/5min)
  • ✅ JWT Authorizer en API Gateway
  • ✅ Cognito con MFA opcional
  • ✅ Encryption at rest (DynamoDB, S3)
  • ✅ Encryption in transit (HTTPS, TLS 1.2+)
  • ✅ IAM policies de mínimo privilegio
  • ✅ X-Ray tracing habilitado
  • ✅ CloudWatch Logs con retención 7 días
  • ✅ CORS whitelist específico

📊 Observabilidad

Dashboard CloudWatch

  • tk-nq-api-metrics
  • 6 widgets: invocations, errors, duration percentiles
  • Período: 5 minutos

Alarmas SNS

  1. Health Errors > 1 en 5min
  2. Bookings Errors > 1 en 5min
  3. Bookings Latency p99 > 3s

X-Ray Tracing

  • Habilitado en todas las Lambdas
  • Service map disponible
  • Trace analysis activo

💰 Costos Estimados (Serverless)

Pay-per-request

  • Lambda ARM64: ~$0.20/millón requests
  • DynamoDB: $1.25/millón writes, $0.25/millón reads
  • API Gateway: $1.00/millón requests
  • SES: $0.10/1,000 emails
  • CloudFront: $0.085/GB

Fijos mensuales

  • WAF: ~$10/mes
  • CloudWatch: ~$5/mes
  • Route53: $0.50/hosted zone

Total Estimado

  • Desarrollo: $15-25/mes
  • Producción (100 usuarios): $30-50/mes
  • Producción (1,000 usuarios): $150-200/mes

🎯 Roadmap

✅ Completado (100%)

  • Migración completa a Terraform
  • Autenticación completa con Cognito
  • Motor de reservas atómico
  • Calendario con drag & drop
  • Sistema de notificaciones
  • Templates HTML
  • Recordatorios automáticos
  • PWA offline-ready
  • Observabilidad completa
  • Multi-ambiente (dev/qas/prd)

🔄 Próximos Pasos

  • Configurar CI/CD (ver .github/SECRETS_SETUP.md)
  • Slack/Discord notifications en workflows
  • Drift detection scheduled
  • E2E tests post-deployment
  • Canary deployments en producción

Ver docs/ROADMAP.md para el plan completo de mejoras.


🤝 Contribuir

# Fork el repo
git clone <your-fork>

# Crear rama
git checkout -b feature/nueva-funcionalidad

# Commits
git commit -m "feat: agregar nueva funcionalidad"

# Push
git push origin feature/nueva-funcionalidad

# Crear PR

📄 Licencia

MIT License - Ver LICENSE para detalles


🏆 Métricas Finales

Métrica Valor
Sistema funcional 100% ✅
Infraestructura Terraform (3 ambientes)
CI/CD GitHub Actions (5 workflows)
Lambdas 8/8 (100%)
Endpoints 11/20 (55%)
Tests passing 85%
Módulos Terraform 9/9 (100%)

🙏 Agradecimientos

Construido con:

  • 🦀 Rust y la comunidad de AWS Lambda
  • 🔥 Svelte 5 y SvelteKit
  • 🏗️ Terraform y HashiCorp
  • 📅 FullCalendar
  • Y muchas otras librerías open source

Desarrollado por: Equipo Turnaki-NexioQ
Última actualización: 6 de Octubre de 2025
Versión: 2.0.0 (Terraform)
Estado: Production Ready 🚀

Top categories

Loading Svelte Themes