db-model-router 1.0.6 → 1.0.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +150 -11
- package/TODO.md +0 -15
- package/db-manager/.dbmanager.sqlite +0 -0
- package/db-manager/README.md +223 -0
- package/db-manager/adapter-proxy.js +361 -0
- package/db-manager/demo/cockroachdb.env +6 -0
- package/db-manager/demo/demo.sqlite +0 -0
- package/db-manager/demo/dynamodb.env +7 -0
- package/db-manager/demo/mongodb.env +4 -0
- package/db-manager/demo/mssql.env +6 -0
- package/db-manager/demo/mysql.env +6 -0
- package/db-manager/demo/oracle.env +6 -0
- package/db-manager/demo/postgres.env +6 -0
- package/db-manager/demo/redis.env +4 -0
- package/db-manager/demo/seeds/cockroachdb.sql +32 -0
- package/db-manager/demo/seeds/mssql.sql +32 -0
- package/db-manager/demo/seeds/mysql.sql +32 -0
- package/db-manager/demo/seeds/oracle.sql +43 -0
- package/db-manager/demo/seeds/postgres.sql +32 -0
- package/db-manager/demo/seeds/sqlite3.sql +32 -0
- package/db-manager/demo/sqlite3.env +2 -0
- package/db-manager/metadata-db.js +170 -0
- package/db-manager/public/.gitkeep +1 -0
- package/db-manager/public/css/style.css +1413 -0
- package/db-manager/public/js/app.js +1370 -0
- package/db-manager/routes/api.js +388 -0
- package/db-manager/routes/views.js +61 -0
- package/db-manager/server.js +39 -0
- package/db-manager/utils/build-filter-config.js +18 -0
- package/db-manager/utils/csv-export.js +59 -0
- package/db-manager/utils/export-filename.js +39 -0
- package/db-manager/utils/filter-tables.js +20 -0
- package/db-manager/utils/parse-filters.js +93 -0
- package/db-manager/utils/sort-state.js +35 -0
- package/db-manager/views/.gitkeep +1 -0
- package/db-manager/views/dashboard.ejs +53 -0
- package/db-manager/views/history.ejs +52 -0
- package/db-manager/views/index.ejs +35 -0
- package/db-manager/views/layout.ejs +31 -0
- package/db-manager/views/partials/data-panel.ejs +74 -0
- package/db-manager/views/partials/header.ejs +36 -0
- package/db-manager/views/partials/sidebar.ejs +30 -0
- package/db-manager/views/query.ejs +58 -0
- package/dbmr.schema.json +22 -44
- package/demo/.dockerignore +7 -0
- package/demo/.env.example +14 -0
- package/demo/Dockerfile +20 -0
- package/demo/app.js +39 -0
- package/demo/commons/add_migration.js +43 -0
- package/demo/commons/db.js +28 -0
- package/demo/commons/migrate.js +68 -0
- package/demo/commons/modules.js +18 -0
- package/demo/commons/password.js +36 -0
- package/demo/commons/security.js +30 -0
- package/demo/commons/session.js +13 -0
- package/demo/commons/webhook.js +81 -0
- package/demo/dbmr.schema.json +338 -0
- package/demo/middleware/authenticate.js +14 -0
- package/demo/middleware/hasPermission.js +30 -0
- package/demo/middleware/logger.js +67 -0
- package/demo/middleware/tenantIsolation.js +17 -0
- package/demo/migrations/20260509170349_create_migrations_table.sql +6 -0
- package/demo/migrations/20260509170349_create_saas_tables.sql +69 -0
- package/demo/migrations/20260509170349_create_tables.sql +193 -0
- package/demo/models/addresses.js +24 -0
- package/demo/models/cart_items.js +20 -0
- package/demo/models/carts.js +18 -0
- package/demo/models/categories.js +22 -0
- package/demo/models/coupons.js +25 -0
- package/demo/models/index.js +43 -0
- package/demo/models/order_items.js +23 -0
- package/demo/models/orders.js +27 -0
- package/demo/models/payments.js +23 -0
- package/demo/models/product_images.js +20 -0
- package/demo/models/product_reviews.js +22 -0
- package/demo/models/product_variants.js +22 -0
- package/demo/models/products.js +32 -0
- package/demo/models/role_permissions.js +17 -0
- package/demo/models/roles.js +17 -0
- package/demo/models/shipments.js +21 -0
- package/demo/models/tenants.js +18 -0
- package/demo/models/users.js +23 -0
- package/demo/models/webhook_logs.js +22 -0
- package/demo/models/webhooks.js +19 -0
- package/demo/models/wishlists.js +17 -0
- package/demo/openapi.json +7000 -0
- package/demo/package-lock.json +2810 -0
- package/demo/package.json +43 -0
- package/demo/routes/addresses/index.js +6 -0
- package/demo/routes/auth/index.js +55 -0
- package/demo/routes/carts/cart_items/index.js +7 -0
- package/demo/routes/carts/index.js +6 -0
- package/demo/routes/categories/index.js +6 -0
- package/demo/routes/coupons/index.js +6 -0
- package/demo/routes/docs.js +18 -0
- package/demo/routes/health.js +35 -0
- package/demo/routes/index.js +54 -0
- package/demo/routes/orders/index.js +6 -0
- package/demo/routes/orders/order_items/index.js +7 -0
- package/demo/routes/orders/payments/index.js +7 -0
- package/demo/routes/orders/shipments/index.js +7 -0
- package/demo/routes/products/index.js +6 -0
- package/demo/routes/products/product_images/index.js +7 -0
- package/demo/routes/products/product_reviews/index.js +7 -0
- package/demo/routes/products/product_variants/index.js +7 -0
- package/demo/routes/roles/index.js +75 -0
- package/demo/routes/roles/permissions/index.js +47 -0
- package/demo/routes/tenants/index.js +45 -0
- package/demo/routes/users/index.js +45 -0
- package/demo/routes/wishlists/index.js +6 -0
- package/demo/seeds/saas-seed.js +329 -0
- package/docker-compose.yml +61 -0
- package/package.json +120 -113
- package/scripts/demo-create.js +1 -1
- package/skill/SKILL.md +119 -3
- package/src/cli/commands/db-manager.js +134 -0
- package/src/cli/commands/generate.js +106 -60
- package/src/cli/commands/help.js +0 -1
- package/src/cli/generate-route.js +60 -21
- package/src/cli/generate-saas-structure.js +122 -0
- package/src/cli/init/generators.js +6 -0
- package/src/cli/init.js +8 -0
- package/src/cli/main.js +8 -1
- package/src/cli/saas/generate-saas-middleware.js +108 -0
- package/src/cli/saas/generate-saas-migrations.js +480 -0
- package/src/cli/saas/generate-saas-models.js +211 -0
- package/src/cli/saas/generate-saas-openapi.js +419 -0
- package/src/cli/saas/generate-saas-routes.js +435 -0
- package/src/cli/saas/generate-saas-seeds.js +243 -0
- package/src/cli/saas/generate-saas-utils.js +176 -0
- package/src/commons/kafka.js +139 -0
- package/src/commons/model.js +29 -9
- package/src/index.js +2 -0
- package/src/mssql/db.js +41 -3
- package/src/mysql/db.js +3 -0
- package/src/postgres/db.js +6 -0
- package/src/cli/generate-db-manager.js +0 -1573
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "demo",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"description": "",
|
|
5
|
+
"main": "index.js",
|
|
6
|
+
"scripts": {
|
|
7
|
+
"test": "echo \"Error: no test specified\" && exit 1",
|
|
8
|
+
"start": "node app.js",
|
|
9
|
+
"dev": "nodemon app.js",
|
|
10
|
+
"migrate": "node commons/migrate.js",
|
|
11
|
+
"add_migration": "node commons/add_migration.js",
|
|
12
|
+
"docker:build": "docker build -t app .",
|
|
13
|
+
"docker:up": "docker compose up -d",
|
|
14
|
+
"docker:down": "docker compose down"
|
|
15
|
+
},
|
|
16
|
+
"keywords": [],
|
|
17
|
+
"author": "",
|
|
18
|
+
"license": "ISC",
|
|
19
|
+
"type": "module",
|
|
20
|
+
"imports": {
|
|
21
|
+
"#root/*.js": "./*.js",
|
|
22
|
+
"#models": "./models/index.js",
|
|
23
|
+
"#models/*.js": "./models/*.js",
|
|
24
|
+
"#routes/*.js": "./routes/*.js",
|
|
25
|
+
"#commons/*.js": "./commons/*.js",
|
|
26
|
+
"#middleware/*.js": "./middleware/*.js"
|
|
27
|
+
},
|
|
28
|
+
"dependencies": {
|
|
29
|
+
"db-model-router": "latest",
|
|
30
|
+
"dotenv": "latest",
|
|
31
|
+
"express": "latest",
|
|
32
|
+
"express-session": "latest",
|
|
33
|
+
"better-sqlite3": "latest",
|
|
34
|
+
"express-rate-limit": "latest",
|
|
35
|
+
"helmet": "latest",
|
|
36
|
+
"kafkajs": "latest",
|
|
37
|
+
"winston": "latest",
|
|
38
|
+
"swagger-ui-express": "latest"
|
|
39
|
+
},
|
|
40
|
+
"devDependencies": {
|
|
41
|
+
"nodemon": "latest"
|
|
42
|
+
}
|
|
43
|
+
}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import express from "express";
|
|
2
|
+
import authenticate from "#middleware/authenticate.js";
|
|
3
|
+
import { verifyPassword } from "#commons/password.js";
|
|
4
|
+
import { users, roles, role_permissions } from "#models";
|
|
5
|
+
|
|
6
|
+
const router = express.Router();
|
|
7
|
+
|
|
8
|
+
// POST /api/auth/login - Authenticate user and create session
|
|
9
|
+
router.post("/login", async (req, res) => {
|
|
10
|
+
try {
|
|
11
|
+
const { email, password } = req.body;
|
|
12
|
+
|
|
13
|
+
if (!email || !password) {
|
|
14
|
+
return res.status(401).json({ message: "Invalid credentials" });
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
const userResults = await users.findAll({ email });
|
|
18
|
+
const user = Array.isArray(userResults) ? userResults[0] : (userResults?.data?.[0] ?? null);
|
|
19
|
+
|
|
20
|
+
if (!user) {
|
|
21
|
+
return res.status(401).json({ message: "Invalid credentials" });
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
const isValid = await verifyPassword(password, user.password_hash);
|
|
25
|
+
if (!isValid) {
|
|
26
|
+
return res.status(401).json({ message: "Invalid credentials" });
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
const role = await roles.findById(user.role_id);
|
|
30
|
+
const permsResult = await role_permissions.findAll({ role_id: user.role_id });
|
|
31
|
+
const permissionList = Array.isArray(permsResult) ? permsResult : (permsResult?.data ?? []);
|
|
32
|
+
|
|
33
|
+
req.session.user = user;
|
|
34
|
+
req.session.role = role;
|
|
35
|
+
req.session.permission = permissionList.map((p) =>
|
|
36
|
+
typeof p.permission === "string" ? JSON.parse(p.permission) : p.permission
|
|
37
|
+
);
|
|
38
|
+
|
|
39
|
+
res.json({ message: "Login successful", user: { id: user.user_id, email: user.email, name: user.name } });
|
|
40
|
+
} catch (err) {
|
|
41
|
+
res.status(500).json({ message: err.message });
|
|
42
|
+
}
|
|
43
|
+
});
|
|
44
|
+
|
|
45
|
+
// POST /api/auth/logout - Destroy session
|
|
46
|
+
router.post("/logout", authenticate, (req, res) => {
|
|
47
|
+
req.session.destroy((err) => {
|
|
48
|
+
if (err) {
|
|
49
|
+
return res.status(500).json({ message: "Failed to destroy session" });
|
|
50
|
+
}
|
|
51
|
+
res.json({ message: "Logout successful" });
|
|
52
|
+
});
|
|
53
|
+
});
|
|
54
|
+
|
|
55
|
+
export default router;
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import express from "express";
|
|
2
|
+
import swaggerUi from "swagger-ui-express";
|
|
3
|
+
import { readFileSync } from "fs";
|
|
4
|
+
import { dirname, join } from "path";
|
|
5
|
+
import { fileURLToPath } from "url";
|
|
6
|
+
|
|
7
|
+
const __dirname = dirname(fileURLToPath(import.meta.url));
|
|
8
|
+
const spec = JSON.parse(readFileSync(join(__dirname, "../openapi.json"), "utf8"));
|
|
9
|
+
|
|
10
|
+
const router = express.Router();
|
|
11
|
+
|
|
12
|
+
router.use("/", swaggerUi.serve);
|
|
13
|
+
router.get("/", swaggerUi.setup(spec, {
|
|
14
|
+
customSiteTitle: "API Documentation",
|
|
15
|
+
customCss: ".swagger-ui .topbar { display: none }",
|
|
16
|
+
}));
|
|
17
|
+
|
|
18
|
+
export default router;
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import express from "express";
|
|
2
|
+
|
|
3
|
+
const router = express.Router();
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* GET /health
|
|
7
|
+
* Returns server health status, uptime, memory, and database connectivity.
|
|
8
|
+
*/
|
|
9
|
+
router.get("/", async (req, res) => {
|
|
10
|
+
const health = {
|
|
11
|
+
status: "ok",
|
|
12
|
+
timestamp: new Date().toISOString(),
|
|
13
|
+
uptime: process.uptime(),
|
|
14
|
+
memory: process.memoryUsage(),
|
|
15
|
+
db: { connected: false },
|
|
16
|
+
};
|
|
17
|
+
|
|
18
|
+
try {
|
|
19
|
+
if (global.db && typeof global.db.query === "function") {
|
|
20
|
+
await global.db.query("SELECT NOW()");
|
|
21
|
+
health.db.connected = true;
|
|
22
|
+
} else if (global.db && typeof global.db.get === "function") {
|
|
23
|
+
// NoSQL adapters (mongodb, redis, dynamodb)
|
|
24
|
+
health.db.connected = true;
|
|
25
|
+
}
|
|
26
|
+
} catch (err) {
|
|
27
|
+
health.status = "degraded";
|
|
28
|
+
health.db.error = err.message;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
const statusCode = health.status === "ok" ? 200 : 503;
|
|
32
|
+
res.status(statusCode).json(health);
|
|
33
|
+
});
|
|
34
|
+
|
|
35
|
+
export default router;
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import express from "express";
|
|
2
|
+
|
|
3
|
+
const router = express.Router();
|
|
4
|
+
|
|
5
|
+
// SaaS auth & CRUD routes
|
|
6
|
+
import authRoute from "#routes/auth/index.js";
|
|
7
|
+
import saasUsersRoute from "#routes/users/index.js";
|
|
8
|
+
import saasTenantsRoute from "#routes/tenants/index.js";
|
|
9
|
+
import saasRolesRoute from "#routes/roles/index.js";
|
|
10
|
+
import saasPermissionsRoute from "#routes/roles/permissions/index.js";
|
|
11
|
+
|
|
12
|
+
// Schema-generated routes
|
|
13
|
+
import addressesRoute from "#routes/addresses/index.js";
|
|
14
|
+
import cartsRoute from "#routes/carts/index.js";
|
|
15
|
+
import categoriesRoute from "#routes/categories/index.js";
|
|
16
|
+
import couponsRoute from "#routes/coupons/index.js";
|
|
17
|
+
import ordersRoute from "#routes/orders/index.js";
|
|
18
|
+
import productsRoute from "#routes/products/index.js";
|
|
19
|
+
import wishlistsRoute from "#routes/wishlists/index.js";
|
|
20
|
+
import product_imagesChildRoute from "#routes/products/product_images/index.js";
|
|
21
|
+
import product_variantsChildRoute from "#routes/products/product_variants/index.js";
|
|
22
|
+
import product_reviewsChildRoute from "#routes/products/product_reviews/index.js";
|
|
23
|
+
import cart_itemsChildRoute from "#routes/carts/cart_items/index.js";
|
|
24
|
+
import order_itemsChildRoute from "#routes/orders/order_items/index.js";
|
|
25
|
+
import paymentsChildRoute from "#routes/orders/payments/index.js";
|
|
26
|
+
import shipmentsChildRoute from "#routes/orders/shipments/index.js";
|
|
27
|
+
import docsRoute from "#routes/docs.js";
|
|
28
|
+
|
|
29
|
+
// SaaS routes
|
|
30
|
+
router.use("/auth", authRoute);
|
|
31
|
+
router.use("/users", saasUsersRoute);
|
|
32
|
+
router.use("/tenants", saasTenantsRoute);
|
|
33
|
+
router.use("/roles", saasRolesRoute);
|
|
34
|
+
router.use("/roles/:role_id/permissions", saasPermissionsRoute);
|
|
35
|
+
|
|
36
|
+
router.use("/docs", docsRoute);
|
|
37
|
+
router.use("/products/:product_id/product_images", product_imagesChildRoute);
|
|
38
|
+
router.use("/products/:product_id/product_variants", product_variantsChildRoute);
|
|
39
|
+
router.use("/products/:product_id/product_reviews", product_reviewsChildRoute);
|
|
40
|
+
router.use("/carts/:cart_id/cart_items", cart_itemsChildRoute);
|
|
41
|
+
router.use("/orders/:order_id/order_items", order_itemsChildRoute);
|
|
42
|
+
router.use("/orders/:order_id/payments", paymentsChildRoute);
|
|
43
|
+
router.use("/orders/:order_id/shipments", shipmentsChildRoute);
|
|
44
|
+
|
|
45
|
+
// Schema-generated routes
|
|
46
|
+
router.use("/addresses", addressesRoute);
|
|
47
|
+
router.use("/carts", cartsRoute);
|
|
48
|
+
router.use("/categories", categoriesRoute);
|
|
49
|
+
router.use("/coupons", couponsRoute);
|
|
50
|
+
router.use("/orders", ordersRoute);
|
|
51
|
+
router.use("/products", productsRoute);
|
|
52
|
+
router.use("/wishlists", wishlistsRoute);
|
|
53
|
+
|
|
54
|
+
export default router;
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
import express from "express";
|
|
2
|
+
import authenticate from "#middleware/authenticate.js";
|
|
3
|
+
import tenantIsolation from "#middleware/tenantIsolation.js";
|
|
4
|
+
import hasPermission from "#middleware/hasPermission.js";
|
|
5
|
+
import { roles } from "#models";
|
|
6
|
+
|
|
7
|
+
const router = express.Router();
|
|
8
|
+
|
|
9
|
+
function userHasGlobalPermission(req) {
|
|
10
|
+
return req.session.permission.some((p) => p.scope === "global");
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
function guardSystemRole(req, res, role) {
|
|
14
|
+
if (role.tenant_id === null && !userHasGlobalPermission(req)) {
|
|
15
|
+
res.status(403).json({ message: "Cannot modify system roles" });
|
|
16
|
+
return true;
|
|
17
|
+
}
|
|
18
|
+
return false;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
function guardGlobalPermissionEscalation(req, res) {
|
|
22
|
+
const permissions = req.body.permissions || [];
|
|
23
|
+
const hasGlobalEntry = permissions.some((p) => p.scope === "global");
|
|
24
|
+
if (hasGlobalEntry && !userHasGlobalPermission(req)) {
|
|
25
|
+
res.status(403).json({ message: "Cannot assign global permissions" });
|
|
26
|
+
return true;
|
|
27
|
+
}
|
|
28
|
+
return false;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
router.get("/", authenticate, tenantIsolation, hasPermission("roles", "read"), async (req, res) => {
|
|
32
|
+
try {
|
|
33
|
+
const results = await roles.findAll(req.query);
|
|
34
|
+
res.json(results);
|
|
35
|
+
} catch (err) {
|
|
36
|
+
res.status(500).json({ message: err.message });
|
|
37
|
+
}
|
|
38
|
+
});
|
|
39
|
+
|
|
40
|
+
router.post("/", authenticate, tenantIsolation, hasPermission("roles", "write"), async (req, res) => {
|
|
41
|
+
try {
|
|
42
|
+
if (guardGlobalPermissionEscalation(req, res)) return;
|
|
43
|
+
const result = await roles.create(req.body);
|
|
44
|
+
res.status(201).json(result);
|
|
45
|
+
} catch (err) {
|
|
46
|
+
res.status(500).json({ message: err.message });
|
|
47
|
+
}
|
|
48
|
+
});
|
|
49
|
+
|
|
50
|
+
router.put("/:id", authenticate, tenantIsolation, hasPermission("roles", "update"), async (req, res) => {
|
|
51
|
+
try {
|
|
52
|
+
const role = await roles.findById(req.params.id);
|
|
53
|
+
if (!role) return res.status(404).json({ message: "Role not found" });
|
|
54
|
+
if (guardSystemRole(req, res, role)) return;
|
|
55
|
+
if (guardGlobalPermissionEscalation(req, res)) return;
|
|
56
|
+
const result = await roles.update(req.params.id, req.body);
|
|
57
|
+
res.json(result);
|
|
58
|
+
} catch (err) {
|
|
59
|
+
res.status(500).json({ message: err.message });
|
|
60
|
+
}
|
|
61
|
+
});
|
|
62
|
+
|
|
63
|
+
router.delete("/:id", authenticate, tenantIsolation, hasPermission("roles", "delete"), async (req, res) => {
|
|
64
|
+
try {
|
|
65
|
+
const role = await roles.findById(req.params.id);
|
|
66
|
+
if (!role) return res.status(404).json({ message: "Role not found" });
|
|
67
|
+
if (guardSystemRole(req, res, role)) return;
|
|
68
|
+
const result = await roles.delete(req.params.id);
|
|
69
|
+
res.json(result);
|
|
70
|
+
} catch (err) {
|
|
71
|
+
res.status(500).json({ message: err.message });
|
|
72
|
+
}
|
|
73
|
+
});
|
|
74
|
+
|
|
75
|
+
export default router;
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import express from "express";
|
|
2
|
+
import authenticate from "#middleware/authenticate.js";
|
|
3
|
+
import tenantIsolation from "#middleware/tenantIsolation.js";
|
|
4
|
+
import hasPermission from "#middleware/hasPermission.js";
|
|
5
|
+
import { role_permissions } from "#models";
|
|
6
|
+
|
|
7
|
+
const router = express.Router({ mergeParams: true });
|
|
8
|
+
|
|
9
|
+
router.get("/", authenticate, tenantIsolation, hasPermission("permissions", "read"), async (req, res) => {
|
|
10
|
+
try {
|
|
11
|
+
const query = { ...req.query, role_id: req.params.role_id };
|
|
12
|
+
const results = await role_permissions.findAll(query);
|
|
13
|
+
res.json(results);
|
|
14
|
+
} catch (err) {
|
|
15
|
+
res.status(500).json({ message: err.message });
|
|
16
|
+
}
|
|
17
|
+
});
|
|
18
|
+
|
|
19
|
+
router.post("/", authenticate, tenantIsolation, hasPermission("permissions", "write"), async (req, res) => {
|
|
20
|
+
try {
|
|
21
|
+
const data = { ...req.body, role_id: req.params.role_id };
|
|
22
|
+
const result = await role_permissions.create(data);
|
|
23
|
+
res.status(201).json(result);
|
|
24
|
+
} catch (err) {
|
|
25
|
+
res.status(500).json({ message: err.message });
|
|
26
|
+
}
|
|
27
|
+
});
|
|
28
|
+
|
|
29
|
+
router.put("/:permission_id", authenticate, tenantIsolation, hasPermission("permissions", "update"), async (req, res) => {
|
|
30
|
+
try {
|
|
31
|
+
const result = await role_permissions.update(req.params.permission_id, req.body);
|
|
32
|
+
res.json(result);
|
|
33
|
+
} catch (err) {
|
|
34
|
+
res.status(500).json({ message: err.message });
|
|
35
|
+
}
|
|
36
|
+
});
|
|
37
|
+
|
|
38
|
+
router.delete("/:permission_id", authenticate, tenantIsolation, hasPermission("permissions", "delete"), async (req, res) => {
|
|
39
|
+
try {
|
|
40
|
+
const result = await role_permissions.delete(req.params.permission_id);
|
|
41
|
+
res.json(result);
|
|
42
|
+
} catch (err) {
|
|
43
|
+
res.status(500).json({ message: err.message });
|
|
44
|
+
}
|
|
45
|
+
});
|
|
46
|
+
|
|
47
|
+
export default router;
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import express from "express";
|
|
2
|
+
import authenticate from "#middleware/authenticate.js";
|
|
3
|
+
import tenantIsolation from "#middleware/tenantIsolation.js";
|
|
4
|
+
import hasPermission from "#middleware/hasPermission.js";
|
|
5
|
+
import { tenants } from "#models";
|
|
6
|
+
|
|
7
|
+
const router = express.Router();
|
|
8
|
+
|
|
9
|
+
router.get("/", authenticate, tenantIsolation, hasPermission("tenants", "read"), async (req, res) => {
|
|
10
|
+
try {
|
|
11
|
+
const results = await tenants.findAll(req.query);
|
|
12
|
+
res.json(results);
|
|
13
|
+
} catch (err) {
|
|
14
|
+
res.status(500).json({ message: err.message });
|
|
15
|
+
}
|
|
16
|
+
});
|
|
17
|
+
|
|
18
|
+
router.post("/", authenticate, tenantIsolation, hasPermission("tenants", "write"), async (req, res) => {
|
|
19
|
+
try {
|
|
20
|
+
const result = await tenants.create(req.body);
|
|
21
|
+
res.status(201).json(result);
|
|
22
|
+
} catch (err) {
|
|
23
|
+
res.status(500).json({ message: err.message });
|
|
24
|
+
}
|
|
25
|
+
});
|
|
26
|
+
|
|
27
|
+
router.put("/:id", authenticate, tenantIsolation, hasPermission("tenants", "update"), async (req, res) => {
|
|
28
|
+
try {
|
|
29
|
+
const result = await tenants.update(req.params.id, req.body);
|
|
30
|
+
res.json(result);
|
|
31
|
+
} catch (err) {
|
|
32
|
+
res.status(500).json({ message: err.message });
|
|
33
|
+
}
|
|
34
|
+
});
|
|
35
|
+
|
|
36
|
+
router.delete("/:id", authenticate, tenantIsolation, hasPermission("tenants", "delete"), async (req, res) => {
|
|
37
|
+
try {
|
|
38
|
+
const result = await tenants.delete(req.params.id);
|
|
39
|
+
res.json(result);
|
|
40
|
+
} catch (err) {
|
|
41
|
+
res.status(500).json({ message: err.message });
|
|
42
|
+
}
|
|
43
|
+
});
|
|
44
|
+
|
|
45
|
+
export default router;
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import express from "express";
|
|
2
|
+
import authenticate from "#middleware/authenticate.js";
|
|
3
|
+
import tenantIsolation from "#middleware/tenantIsolation.js";
|
|
4
|
+
import hasPermission from "#middleware/hasPermission.js";
|
|
5
|
+
import { users } from "#models";
|
|
6
|
+
|
|
7
|
+
const router = express.Router();
|
|
8
|
+
|
|
9
|
+
router.get("/", authenticate, tenantIsolation, hasPermission("users", "read"), async (req, res) => {
|
|
10
|
+
try {
|
|
11
|
+
const results = await users.findAll(req.query);
|
|
12
|
+
res.json(results);
|
|
13
|
+
} catch (err) {
|
|
14
|
+
res.status(500).json({ message: err.message });
|
|
15
|
+
}
|
|
16
|
+
});
|
|
17
|
+
|
|
18
|
+
router.post("/", authenticate, tenantIsolation, hasPermission("users", "write"), async (req, res) => {
|
|
19
|
+
try {
|
|
20
|
+
const result = await users.create(req.body);
|
|
21
|
+
res.status(201).json(result);
|
|
22
|
+
} catch (err) {
|
|
23
|
+
res.status(500).json({ message: err.message });
|
|
24
|
+
}
|
|
25
|
+
});
|
|
26
|
+
|
|
27
|
+
router.put("/:id", authenticate, tenantIsolation, hasPermission("users", "update"), async (req, res) => {
|
|
28
|
+
try {
|
|
29
|
+
const result = await users.update(req.params.id, req.body);
|
|
30
|
+
res.json(result);
|
|
31
|
+
} catch (err) {
|
|
32
|
+
res.status(500).json({ message: err.message });
|
|
33
|
+
}
|
|
34
|
+
});
|
|
35
|
+
|
|
36
|
+
router.delete("/:id", authenticate, tenantIsolation, hasPermission("users", "delete"), async (req, res) => {
|
|
37
|
+
try {
|
|
38
|
+
const result = await users.delete(req.params.id);
|
|
39
|
+
res.json(result);
|
|
40
|
+
} catch (err) {
|
|
41
|
+
res.status(500).json({ message: err.message });
|
|
42
|
+
}
|
|
43
|
+
});
|
|
44
|
+
|
|
45
|
+
export default router;
|