2.8 KiB
2.8 KiB
AGENTS.md — dashback (Express API)
ESM (type: module), Express 5, Node. Depends on libdashstore via file:../dashdbschema.
Architecture
- Entry:
src/index.js→src/api/index.js(startApi/stopApi,loadRoutes()walkssrc/api/routes/**/*.js→register(app, basePath)). - Each route file owns its
@openapiJSDoc +*ErrorStatus(err)mapper +requireSelectedCompany(req). Source of truth is code. - DB:
src/db/store.jslazy singleton provider+store (timing logslibstore <ns>.<method>);src/db/<domain>.jsare thin wrappers aroundstore.<ns>.<method>. - Config:
src/config/env.js(.env;PORT4208,HTTPS_PORT,GOOGLE_CLIENT_ID,JWT_SECRET,CORS_ORIGINS,DB_PROVIDER=mssql|sqlite,SQLITE_PATH,MSSQL_*). - Auth:
src/api/middleware/auth.js(Google SSO + JWT cookie,req.user.{id,selectedCompanyId}); allowlist viascripts/manageUsers.js. - SSE:
src/api/sse.js(emit),routes/events.js. Stock adjust emitsstock,ledger,articles,article-<sku>. src/v1/legacy POS compat — don't touch unless task is POS.quixpos2jtl/is a separate Electron/CLI bridge — ignore unless task mentions JTL.- Docs: generated, never hand-edit — see below. Interactive API documentation & tester served under
/docs/(/docs/openapi.json).
Build / Test / Docs
cp .env.example .env && npm install
npm start # PORT 4208 (HTTPS 8443)
npm run docs:api # regenerates docs/api/routes.md + docs/api/routes/ + openapi.json
npm run manage-users # email allowlist
- No
npm test. Verify with syntax check or a self-exiting run on a different port; never leave a listener running — user keeps their own dev server. - Store contract lives in sibling repo:
../dashdbschema/API.md+API.<module>.md,../dashdbschema/README.md. Read-only.
Conventions
- Sibling repos (
../dashdbschema,../dashfront) are read-only: may read docs/code +git -C ../<repo> log --oneline -20, never write/install/start. Missing contract → ask human, don't guess. No fallbacks/defaults. See.cursor/rules/sibling-repos.mdc,.cursor/rules/dont-start-the-API-server.mdc. - After any route change run
npm run docs:api. Docs index:docs/api/README.md. - HTTP mapping per route file:
No company selected→400,Not authorized→403,*not found→404, validation (includes())→400, uniqueness/in-use→409, else 500 +console.error.Stock tracking is disabled…→409. - Keep error strings stable/greppable — mapping depends on exact messages from
libdashstore. - Stock/ledger invariants belong in
dashdbschema/src/store/, not routes, so bothstock.adjustand directledger.addare covered. - Full backend/store conventions:
.agents/skills/project-overview/SKILL.md.