Imported from Aaron7121/PosWebPinchosEP (
BackedPosWeb2026/AGENTS.md). Install upstream withnpx skills add Aaron7121/PosWebPinchosEP --skill BackedPosWeb2026. Copyright stays with the author.
AGENTS.md
POS gastronómico (Pinchos el Parqueadero). Monorepo con dos apps independientes: backend Quarkus en src/ y frontend React en FrontEndPosWeb2026/. No hay CI, ni docker-compose, ni test runner en el frontend.
Backend (Quarkus 3.39.2 / Java 21 / PostgreSQL)
- Comandos (Windows): compilar
.\mvnw.cmd -DskipTests compile; dev.\mvnw.cmd quarkus:dev(sirve en0.0.0.0:8080). En Linux usar./mvnw. - Arquitectura por capas en
com.joedev.posweb.pep:entity→repository(interfacesPanacheRepositoryBase<T, Integer>) →services→rest(resources JAX-RS). Los resources serializan entidades directamente, sin DTOs. Endpoint nuevo = método en resource + delegación a service + query en repository. - Entidades con Lombok
@Getter/@Setter(scopeprovideden pom). - Errores: lanzar
DatoInvalidoException(400),EntidadNoEncontradaException(404) oConflictoException(409);exception/ErrorHandlerlos mapea. /api/*exige JWT. RolesADMIN/COLABORADORcon@RolesAllowed. Solo son públicos:/api/auth/login,/api/testy/uploads/*(reglapermit-uploads).- CORS con lista fija en
application.properties(localhost:5173 y 192.168.18.119). Si se accede desde otra IP de la red hay que agregarla. - BD:
quarkus.hibernate-orm.database.generation=none+ Flyway. Solo existeV1.0.0__Init.sql; las tablas de negocio se crean manualmente en PostgreSQL y no deben tocarse (el cliente pidió no alterarlas). Conexión local:jdbc:postgresql://localhost:5432/dbposweb, user/passpostgres.
Subida de imágenes (multipart)
POST /api/uploads(multipart, camposfile+ opcionaltipo=platos|categorias) → devuelve{"path":"/uploads/{tipo}/{uuid}.ext"}. Guarda enpos.upload.dir(defaultuploads/, gitignored). Se sirve de forma pública enGET /uploads/{tipo}/{nombre}(con anti path-traversal).- No hay que agregar dependencia de multipart: viene incluido en
quarkus-rest(@RestForm+FileUpload); los artefactosquarkus-rest-multipart/quarkus-resteasy-reactive-multipartNO están en el BOM y hacen fallar el build. quarkus.http.limits.max-body-sizeymax-form-attribute-sizeestán en 10M a propósito (el default de 2048 B rechaza subidas con 413). No reducirlos.- En Docker/Linux,
pos.upload.dires relativo al working dir: montar un volumen.
Frontend (React 19 + Vite 8 + TypeScript + Tailwind 4)
- Comandos (desde
FrontEndPosWeb2026/):npm run dev(Vite en0.0.0.0:5173, proxy/apiy/uploads→ localhost:8080),npm run build(tsc -b && vite build),npm run lint(oxlint).npm run dev+distse sirven desde el backend en producción. - TS estricto:
verbatimModuleSyntax→ obligatorioimport type;noUnusedLocals/noUnusedParameters;erasableSyntaxOnly→ prohibidoenum/namespace. - Estado servidor con TanStack React Query; estado global con Zustand (
useAuthStore), token JWT persistido en localStorage bajopos-auth(el backend la expira en 1800 s). api/client.tsrequest()fuerzaContent-Type: application/jsony NO sirve para subir archivos (FormData). Para uploads usarfetchdirecto con headerAuthorizationmanual.- Los objetos relacionados se mandan al backend como
{ id }(ej.idCategoria: { id }) — vertypes/catalogo.ts. - Rutas definidas en
App.tsx; la sección de administración vive en/configuracion(perfil, platos, productos, categorias, usuarios). - Guía de UI (paleta naranja, layout 3 columnas, mobile-first, PWA con autoUpdate):
FrontEndPosWeb2026/docs/design.md.
