11 KiB
Ficha del proyecto
1. Identificación
Nombre del proyecto:
Presupuestador UECKO (uecko-presupuestador, versión raíz 1.1.5).
Objetivo principal:
Aplicación web para que distribuidores creen, consulten, editen, dupliquen, envíen y descarguen presupuestos de mobiliario basados en un catálogo. Incluye autenticación, perfiles, gestión/listado de distribuidores y usuarios, generación de PDF de presupuestos y envío de incidencias.
Evidencia principal: doc/readme.adoc, client/src/Routes.tsx, server/src/infrastructure/express/api/routes/.
Estado actual:
NO DETERMINADO. Hay configuración de despliegue, dominio de producción y variables de producción (docker-compose.yml, Caddyfile, client/.env.production), pero esto no acredita que esté actualmente desplegado ni que esté en mantenimiento.
2. Repositorio
Repositorio principal:
Ruta inspeccionada: Z:\ (repositorio Git detectado).
Estructura general: Repositorio único con tres paquetes principales, no un monorepo de workspaces completo:
client/: SPA React/Vite.server/: API REST Express.shared/: contratos DTO, entidades de valor, utilidades y validaciones compartidas.
El package.json raíz declara únicamente shared como workspace. client y server son paquetes independientes con sus propios lockfiles y comandos.
3. Stack tecnológico
Backend:
- Node.js:
>=18.19.0en raíz y>=18enserver/package.json. La imagen Docker usa la etiqueta no fijadanode:lts-iron. - TypeScript:
^5.5.4enserver/package.json. - Express:
^4.18.2. - Autenticación: Passport
^0.7.0, estrategias local por email y JWT (passport-local,passport-jwt), JWT y bcrypt. - ORM: Sequelize
^6.37.3, consequelize-typescriptymysql2. - Validación: Joi,
@joi/date,@reis/joi-luxon; validaciones distribuidas entre DTO, entidades y controladores. - Logging: Morgan para solicitudes y Winston con rotación diaria.
- Generación de PDF: Puppeteer, Puppeteer Report y Handlebars.
- Documentación OpenAPI/Swagger:
express-openapi-validatorestá declarado, pero no se localizó una especificación OpenAPI/Swagger ni uso observable de esta librería.
Frontend:
- TypeScript:
^5.5.4. - React y React DOM:
^18.2.0. - Vite:
^5.4.16. - Routing: React Router DOM
^6.26.0, concreateBrowserRouter. - UI: configuración ShadCN/UI (
client/components.json), componentes locales derivados de Radix UI y Radix UI como dependencia. - Tailwind CSS:
^3.4.13; PostCSS ytailwindcss-animate. - Formularios: React Hook Form
^7.55.0,@hookform/resolversy Joi. - Estado remoto: TanStack React Query
^5.51.23; cliente Axios y proveedores mediante Context. - Tablas: TanStack React Table
^8.20.1. - Internacionalización: i18next, react-i18next y detector de idioma; recursos
es,enyca. - Otras bibliotecas relevantes: Axios, dnd-kit, React PDF, Recharts y Lucide.
Base de datos:
- Motor configurado por Sequelize: dialecto
mysql. - Servicio contenedorizado: imagen
mariadb:latest; por tanto la versión de MariaDB no está fijada y11.5no puede confirmarse. - Conexión mediante variables
MYSQL_*; en producción el host previsto es el serviciomariadb. - Migraciones: no se localizaron migraciones formales.
- Seeds: no se localizaron seeds formales. El servidor ejecuta inicialización propia mediante
initStructure()einsertUsers()al arrancar. - La sincronización Sequelize se ejecuta con
{ force: false, alter: true }.
Testing:
- Infraestructura Jest/ts-jest declarada en los tres paquetes.
- Pruebas encontradas: 8 archivos de prueba: 2 en
clienty 6 enshared; no se localizaron pruebas bajoserver/src. - Testing Library está declarada en cliente; Supertest está declarado en servidor, sin pruebas de servidor localizadas.
- No hay evidencia de pruebas E2E con Cypress o Playwright.
Infraestructura / despliegue:
- Docker Compose con Caddy, MariaDB, backend, phpMyAdmin y un contenedor de espera de base de datos.
- Caddy sirve
dist/clienty actúa como reverse proxy HTTPS hacia el backend. - El servicio frontend de Compose está comentado; el frontend se construye a
dist/clienty se monta directamente en Caddy. - No se localizaron workflows de GitHub Actions, GitLab CI ni otra configuración CI/CD.
- Evidencia:
docker-compose.yml,Dockerfile.server,client/Dockerfile,Caddyfile.
4. Arquitectura
Estilo arquitectónico:
Backend organizado por contextos funcionales y capas domain / application / infrastructure, sobre Express y Sequelize. Es razonable inferir una inspiración en puertos y adaptadores: hay interfaces de repositorio, casos de uso, adaptadores y mapeadores. No hay evidencia suficiente para afirmar cumplimiento uniforme de Clean Architecture o arquitectura hexagonal formal.
Organización principal:
- Backend:
- Contextos:
auth,catalog,profile,sales,support,usersycommon. - Las rutas Express construyen o invocan controladores.
- Los controladores delegan en casos de uso y servicios de aplicación.
- Los repositorios y modelos Sequelize residen en infraestructura.
commonaporta controladores base, errores HTTP, adaptador Sequelize, transacciones y utilidades compartidas.
- Contextos:
- Frontend:
- Organización principal por funcionalidad en
client/src/app: autenticación, catálogo, distribuidores, presupuestos, configuración y soporte. - Componentes reutilizables en
components/, UI base enui/, hooks y proveedores enlib/hooks/. shared/libcontiene DTOs, entidades de valor, criterios de consulta y utilidades consumidos por cliente y servidor.
- Organización principal por funcionalidad en
Reglas arquitectónicas importantes:
- Las rutas API se agrupan bajo
/api/v1y aplican middleware de contexto común. - Las rutas protegidas usan Passport y middleware
checkUser; usuarios y distribuidores tienen controles adicionales para permisos administrativos o acceso propio. - El acceso a base de datos se concentra predominantemente en adaptadores, repositorios y modelos de infraestructura Sequelize.
- Las llamadas HTTP del frontend se centralizan en el proveedor Axios y el
DataSourceProvider. - React Query maneja el estado remoto; los providers Context manejan autenticación, fuente de datos, tema y avisos de cambios sin guardar.
- El arranque del backend modifica potencialmente la estructura y datos de la base de datos mediante sincronización Sequelize e inicialización propia.
5. Convenciones relevantes
- Backend: nombres frecuentes
*.useCase.ts,*.controller.ts,*.repository.ts,*.model.ts,*.mapper.tsy*.presenter.ts. - Backend: los contextos usan directorios
domain,applicationeinfrastructure; los DTO compartidos suelen usar prefijosI..._Request_DTOeI..._Response_DTO. - Backend: validación recurrente con Joi y
RuleValidator; los controladores de listados validan parámetros de consulta. - Backend: mapeadores separan entidades/modelos/DTO en varios contextos.
- Backend: TypeScript estricto está activado, pero
noImplicitAnyesfalsey ESLint permite explícitamenteany. - Frontend: componentes React en PascalCase; hooks con prefijo
use; exports agrupados mediante múltiplesindex.ts. - Frontend: alias
@,@shared,@uiy@libconfigurados para importaciones. - Frontend: formularios construidos con React Hook Form y componentes de formulario reutilizables.
- Frontend: React Query usa una fábrica de claves (
KeyBuilder); mutaciones y consultas se encapsulan habitualmente en hooks. - Frontend: tablas reutilizables basadas en TanStack React Table y hooks asociados.
- Frontend: i18n se basa en detección del navegador y usa español como fallback.
Convenciones no uniformes detectadas:
- Hay lockfiles Yarn en raíz, cliente y servidor, pero también
server/pnpm-lock.yaml; no existe campopackageManagerque resuelva la ambigüedad. - El root declara solo
sharedcomo workspace, aunqueclientyserverson paquetes hermanos. - Existen convenciones de capas sólidas en el backend, pero rutas y composición de dependencias presentan mezcla de factories, llamadas directas a controladores y funciones de contexto.
- Hay directorios y nombres de pruebas no homogéneos:
__test__,*.test.ts,*.test.tsxy rutas con nombres de marcador.
6. Comandos habituales
Instalación:
yarn install
cd shared && yarn install
cd ../server && yarn install
cd ../client && yarn install
Desarrollo:
cd server && yarn dev
cd client && yarn dev
Build:
cd server && yarn build
cd client && yarn build
Tests:
cd shared && yarn test
cd server && yarn test
cd client && yarn test
Typecheck:
No existe un script dedicado de typecheck.
cd server && yarn build
cd client && yarn build
El build de servidor ejecuta tsc; el de cliente ejecuta tsc antes de Vite.
Lint:
cd server && yarn lint
cd client && yarn lint
Formato:
NO DETERMINADO. Hay configuración Prettier en raíz, pero no se declara un script de formato.
Migraciones / seeds:
NO DETERMINADO como comandos. No se localizaron scripts ni herramientas de migración/seed declaradas.
Docker:
yarn docker:rebuild
yarn docker:start
yarn docker:stop
yarn docker:restart
yarn docker:logs
yarn docker:build
yarn docker:ps
7. Documentación de referencia
doc/readme.adoc: especificación funcional y arquitectónica inicial; describe requisitos, roles, modelo conceptual y diseño propuesto. Debe leerse como documento de intención, no como reflejo automático de la implementación.package.json,server/package.json,client/package.json,shared/package.json: fuente de verdad para scripts y dependencias declaradas.docker-compose.yml,Dockerfile.server,Caddyfile: referencia de despliegue local/servidor.server/src/infrastructure/express/api/routes/: contratos de rutas actualmente implementados.server/src/config/environments/: configuración de ejecución y conexión por entorno.
8. Restricciones importantes
- Node.js requiere como mínimo
18.19.0segúnpackage.jsonraíz; servidor declara como mínimo Node 18. - Las rutas API se sirven bajo
/api/v1. - El acceso a las rutas autenticadas exige JWT mediante Passport; varias operaciones de usuarios y distribuidores exigen permisos administrativos.
- La configuración de producción limita CORS a
https://presupuestos.uecko.com. - La aplicación cliente depende de
VITE_API_URL. - La persistencia usa dialecto MySQL a través de Sequelize; el despliegue Docker suministra MariaDB.
- El servidor puede alterar el esquema al iniciar debido a
sequelize.sync({ alter: true }); no debe tratarse como un arranque sin efectos sobre la base de datos. - Los idiomas configurados en cliente son español, inglés y catalán.
9. Observaciones
- Existe una separación real entre SPA, API y librería compartida, aunque los workspaces no abarcan todos los paquetes.
- El dominio implementado gira alrededor de autenticación, catálogo, presupuestos, distribuidores, perfil, usuarios y soporte.
- La documentación funcional describe también contratos y gestión del catálogo por fábrica, pero no toda esa funcionalidad se observa en las rutas implementadas; las decisiones deben contrastarse con código.
- Hay pruebas unitarias, pero su cobertura es limitada y no se localizaron pruebas de API ni E2E.
- No se localizaron CI/CD ni una especificación OpenAPI/Swagger usable.