Wires up existing category.order store method (validates categoryIds are exactly the current children of parentId, sets each child sort to its index in one transaction) behind an authenticated HTTP route, plus @openapi docs and regenerated API docs.
Dash API
http://localhost:4208/api
CORS & cookies
All browser requests that need auth must send cookies:
fetch('http://localhost:4208/api/auth/me', {
credentials: 'include',
});
Sessions use an HTTP-only token cookie (Secure, SameSite=Strict, 24h). The browser must talk to the API over HTTPS for login to work — Secure cookies are not sent on plain HTTP.
Auth flow
- Call
GET /auth/meto getgoogleClientId(included in 200 and 401 responses). - Sign in with Google on the frontend (Google Identity Services / One Tap).
- POST the Google ID token to
POST /auth/login. - The API sets the session cookie.
- Call protected routes with
credentials: 'include'. The cookie is refreshed automatically when it has less than 2 hours left.
Routes
Generated from @openapi annotations in src/api/routes/. Source of truth is the code; regenerate with npm run docs:api.
Machine-readable spec: openapi.json.
DESIGN
- for every route we have a file in /src/api/routes
- that should loosly bound to services in /src/services
- for every service we have a CLI tester in /scripts/
- all DB SQL code shall be in /src/db
- with mssql staements in /src/db/mssql/
- API docs:
@openapiJSDoc on handlers →npm run docs:api→docs/api/