Routing
access-router gives you three router classes:
RootRouterfor batch requestsModelRouterfor Mongoose modelsDataRouterfor in-memory collections
The main factory is acl.createRouter(...).
Router Factories
import mongoose from 'mongoose';
import acl from '@web-ts-toolkit/access-router';
const modelRouter = acl.createRouter('User', { basePath: '/users' });
const dataRouter = acl.createDataRouter('fruit', { basePath: '/fruit', data: [] });
const rootRouter = acl.createRouter({ basePath: '/batch', operationAccess: true });
const typedRouter = acl.createRouter(
mongoose.model('User', new mongoose.Schema({ name: String })),
{ basePath: '/users' },
);
createAccessRuntime() returns a fresh acl instance with isolated runtime state.
Mounting
Each router exposes:
routerfor the internal JsonRouter instanceroutesfor the underlying Express routerfullBasePathfor the normalized mounted path
Use combineRoutes(...) to mount several routers at once.
import express from 'express';
import acl, { combineRoutes } from '@web-ts-toolkit/access-router';
app.use(combineRoutes(fruitRouter, userRouter, rootRouter));
app.use(acl.combineRoutes(fruitRouter, userRouter, rootRouter));
combineRoutes(...) accepts ModelRouter, DataRouter, RootRouter, or a plain Express Router.
Model Router Routes
Default route segments are __query and __mutation.
GET /basefor simple listPOST /base/__queryfor advanced listPOST /basefor createPOST /base/__mutationfor advanced createGET /base/newfor a new-document templateGET /base/:idfor read by idPOST /base/__query/__filterfor advanced read by filterPOST /base/__query/:idfor advanced read by idPATCH /base/:idfor updatePATCH /base/__mutation/:idfor advanced updatePUT /basefor upsertPUT /base/__mutationfor advanced upsertDELETE /base/:idfor deleteGET /base/countfor countPOST /base/countfor filtered countGET /base/distinct/:fieldfor distinct valuesPOST /base/distinct/:fieldfor filtered distinct values
Sub-document routes are generated for every referenced subpath discovered on the model schema.
For each subdocument path sub, these routes are added:
GET /base/:id/subPOST /base/:id/sub/__queryPATCH /base/:id/subGET /base/:id/sub/:subIdPOST /base/:id/sub/:subId/__queryPATCH /base/:id/sub/:subIdPOST /base/:id/subDELETE /base/:id/sub/:subId
That gives you generated list, advanced list, bulk update, read, advanced read, update, create, and delete operations for each discovered subdocument collection.
Data Router Routes
Default route segment is __query.
GET /basePOST /base/__queryGET /base/:idPOST /base/__query/__filterPOST /base/__query/:id
Root Router
RootRouter handles batch payloads that dispatch to model or data operations.
Use it when you want a single request to run multiple operations in order.
Each batch item uses:
target:modelordataname: the model or data router nameop: the operation nameorder: optional execution bucket
Operation-specific fields are kept at the top level:
idfor single-document operationssubandsubIdfor sub-document operationsfieldfordistinctfilterfor query-based lookupsdatafor writesargsfor selection, populate, paging, and task inputsoptionsfor behavior switches such as permissions and counts
The response wraps each operation as:
{
index: number;
target: 'model' | 'data';
name: string;
op: string;
statusCode: number;
message: string;
result: unknown;
}
result keeps the underlying service response instead of flattening it into a second batch-only format.
OpenAPI Router
access-router can also mount a separate documentation router:
app.use(acl.createOpenApiRouter());
By default this exposes:
GET /openapi.jsonGET /docs
You can customize those paths with jsonPath and docsPath, or disable Swagger UI entirely with docsPath: false.
Mutability
Build-time route-shape options are immutable after router construction.
Model router build-time options:
basePathparentPathidParamqueryRouteSegmentmutationRouteSegment
Data router build-time options:
basePathparentPathidParamqueryRouteSegment
Behavior options such as filters, hooks, permissions, and defaults can be changed later with set(...), setOption(...), or setOptions(...).