forked from tsai/budibase
9 changed files with 115 additions and 76 deletions
@ -1,22 +1,55 @@ |
|||||
const appRoute = require("./applications") |
const appEndpoints = require("./applications") |
||||
const queryRoute = require("./queries") |
const queryEndpoints = require("./queries") |
||||
const tableRoute = require("./tables") |
const tableEndpoints = require("./tables") |
||||
const rowRoute = require("./rows") |
const rowEndpoints = require("./rows") |
||||
const userRoute = require("./users") |
const userEndpoints = require("./users") |
||||
const Router = require("@koa/router") |
const Router = require("@koa/router") |
||||
const usage = require("../../../middleware/usageQuota") |
const usage = require("../../../middleware/usageQuota") |
||||
|
const authorized = require("../../../middleware/authorized") |
||||
|
const { |
||||
|
paramResource, |
||||
|
paramSubResource, |
||||
|
} = require("../../../middleware/resourceId") |
||||
|
const { |
||||
|
PermissionLevels, |
||||
|
PermissionTypes, |
||||
|
} = require("@budibase/backend-core/permissions") |
||||
|
|
||||
const PREFIX = "/api/public/v1" |
const PREFIX = "/api/public/v1" |
||||
const ROUTES = [appRoute, queryRoute, tableRoute, rowRoute, userRoute] |
|
||||
|
|
||||
const router = new Router({ |
const publicRouter = new Router({ |
||||
prefix: PREFIX, |
prefix: PREFIX, |
||||
}) |
}) |
||||
for (let route of ROUTES) { |
|
||||
// apply usage to everything, middleware will work out whats needs it
|
function addMiddleware(endpoints, middleware) { |
||||
route.use(usage) |
for (let endpoint of endpoints) { |
||||
router.use(route.routes()) |
endpoint.addMiddleware(middleware) |
||||
router.use(route.allowedMethods()) |
} |
||||
|
} |
||||
|
|
||||
|
function addToRouter(endpoints) { |
||||
|
for (let endpoint of endpoints) { |
||||
|
endpoint.apply(publicRouter) |
||||
|
} |
||||
} |
} |
||||
|
|
||||
module.exports = router |
function applyRoutes(endpoints, permType, resource, subResource = null) { |
||||
|
const paramMiddleware = subResource |
||||
|
? paramSubResource(resource, subResource) |
||||
|
: paramResource(resource) |
||||
|
addMiddleware(endpoints.read, paramMiddleware) |
||||
|
addMiddleware(endpoints.write, paramMiddleware) |
||||
|
addMiddleware(endpoints.read, authorized(permType, PermissionLevels.READ)) |
||||
|
addMiddleware(endpoints.write, authorized(permType, PermissionLevels.WRITE)) |
||||
|
addMiddleware(endpoints.write, usage) |
||||
|
addToRouter(endpoints.read) |
||||
|
addToRouter(endpoints.write) |
||||
|
} |
||||
|
|
||||
|
applyRoutes(rowEndpoints, PermissionTypes.TABLE, "tableId", "rowId") |
||||
|
applyRoutes(appEndpoints, PermissionTypes.APP, "appId") |
||||
|
applyRoutes(tableEndpoints, PermissionTypes.TABLE, "tableId") |
||||
|
applyRoutes(userEndpoints, PermissionTypes.USER, "userId") |
||||
|
applyRoutes(queryEndpoints, PermissionTypes.QUERY, "queryId") |
||||
|
|
||||
|
module.exports = publicRouter |
||||
|
|||||
@ -0,0 +1,23 @@ |
|||||
|
class Endpoint { |
||||
|
constructor(method, url, controller) { |
||||
|
this.method = method |
||||
|
this.url = url |
||||
|
this.controller = controller |
||||
|
this.middlewares = [] |
||||
|
} |
||||
|
|
||||
|
addMiddleware(middleware) { |
||||
|
this.middlewares.push(middleware) |
||||
|
} |
||||
|
|
||||
|
apply(router) { |
||||
|
const method = this.method, |
||||
|
url = this.url |
||||
|
const middlewares = this.middlewares, |
||||
|
controller = this.controller |
||||
|
const params = [url, ...middlewares, controller] |
||||
|
router[method](...params) |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
module.exports = Endpoint |
||||
Loading…
Reference in new issue