Files
quasar/docs/01-conceptos/architecture.md
Benito Rodríguez 0c9c408564
Some checks failed
CI / lint (push) Failing after 1m4s
CI / test-backend (push) Has been skipped
CI / test-frontend (push) Has been skipped
CI / test-e2e (push) Has been skipped
Refactor code structure for improved readability and maintainability
2026-02-22 18:18:46 +01:00

4.0 KiB

Arquitectura — Diseño técnico de alto nivel

Visión general

Arquitectura pensada para un MVP local-first / self-hosted que pueda evolucionar a un servicio multiusuario. Propuesta: monorepo con dos paquetes principales: /backend y /frontend (Yarn workspaces). Backend expone una REST API (Fastify + TypeScript); Frontend es una SPA en React (Vite o similar) usando TanStack Query y TanStack Router.

Diagrama de alto nivel (texto)

Usuario (Browser React) ↔ Frontend (TanStack Query/Router) ↔ Backend REST (Fastify + TypeScript)
                                 ↕
                Worker (Bull/BullMQ) ↔ Redis (cache/cola, opcional)
                                 ↕
          DB (SQLite dev → Postgres prod) + Storage (local FS | S3)
                                 ↕
                     APIs externas (IGDB, RAWG, TheGamesDB)

Decisiones clave y justificación

  • Monorepo (Yarn workspaces): coherencia de versiones, compartir utilidades y configuración (lint/tsconfig).
  • Fastify + TypeScript (REST): recomendado para rendimiento y ergonomía con TypeScript; ofrece sistema de plugins encapsulados, validación/serialización basada en Ajv integrada, logging muy rápido (pino) y mejor throughput en producción.
  • Prisma como ORM: productivo y portátil entre SQLite/Postgres.
  • SQLite en dev / Postgres en producción: facilidad de desarrollo y migraciones seguras para futuro.
  • Bull/BullMQ + Redis para trabajos asíncronos (escaneo, enrich, procesamiento de imágenes).
  • Storage: Adapter pattern para StorageAdapter que permita usar S3 o disco local según despliegue.

Stack propuesto (resumen)

  • Backend: Node.js, TypeScript, Fastify, Prisma, Bull/BullMQ, Redis (opcional), Sharp (procesado de imágenes), @fastify/multipart (uploads), @fastify/helmet, @fastify/rate-limit, Ajv (validación), pino (logging).
  • Frontend: React, TypeScript (opcional), Vite, TanStack Query, TanStack Router, Tailwind CSS (opcional).
  • Infra / DevOps: Docker Compose (self-hosting), GitHub Actions (CI), env vars + GitHub Secrets.

Estructura de carpetas sugerida

/ (monorepo)
  package.json (workspaces)
  /backend
    package.json
    prisma/schema.prisma
    src/
      index.ts
      controllers/
      services/
      routes/
      jobs/
      workers/
      lib/
  /frontend
    package.json
    src/
      routes/
      components/
      hooks/
      lib/
      assets/
  /docs

Scripts útiles sugeridos (package.json raíz)

{
  "scripts": {
    "dev": "concurrently \"yarn dev:backend\" \"yarn dev:frontend\"",
    "dev:backend": "cd backend && ts-node-dev --respawn src/index.ts",
    "dev:frontend": "cd frontend && vite",
    "start": "node backend/dist/index.js",
    "lint": "eslint . --ext .ts,.tsx,.js",
    "format": "prettier --write .",
    "prisma:migrate": "cd backend && prisma migrate dev",
    "prisma:studio": "cd backend && prisma studio"
  }
}

Seguridad y operacionales

  • Variables sensibles en .env y en GitHub Secrets para CI.
  • CORS configurado para orígenes permitidos; validación y saneamiento de entradas.
  • Rate limiting global y por endpoint (enriquecimiento de metadatos).
  • Backups: snapshots regulares de la DB y copia periódica de carpeta artwork/.
  • Despliegue: docker-compose.yml con volúmenes para DB y assets; salud (/health) y readiness probes.
  • Observabilidad: logs estructurados (pino/winston); endpoint de métricas básico (Prometheus) o integraciones simples.

Integración de APIs externas

  • Encapsular cada proveedor en un adaptador (ej.: IgdbClient, RawgClient) con interfaz común: search(query), getById(id), getArtwork(id).
  • Caching: Redis o LRU en memoria con TTL (ej. 24h) para respuestas y metadatos de artwork.
  • Retries y protección: reconectar con backoff + circuit breaker para evitar fallos en cascada.

Fuentes

  • Documentación: Fastify, Prisma, Bull/BullMQ, Redis, Sharp, TanStack Query/Router.

Metadatos Autor: Quasar (investigación automatizada) Última actualización: 2026-02-07