@modular-rest/server 1.11.13 → 1.12.0
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/.nvmrc +1 -0
- package/.prettierrc.json +9 -0
- package/.releaserc.json +24 -0
- package/README.md +79 -94
- package/dist/application.d.ts +29 -0
- package/dist/application.js +217 -0
- package/dist/class/cms_trigger.d.ts +61 -0
- package/dist/class/cms_trigger.js +47 -0
- package/dist/class/collection_definition.d.ts +112 -0
- package/dist/class/collection_definition.js +87 -0
- package/dist/class/combinator.d.ts +43 -0
- package/dist/class/combinator.js +174 -0
- package/dist/class/database_trigger.d.ts +84 -0
- package/dist/class/database_trigger.js +64 -0
- package/dist/class/db_schemas.d.ts +25 -0
- package/dist/class/db_schemas.js +28 -0
- package/dist/class/directory.d.ts +20 -0
- package/dist/class/directory.js +87 -0
- package/dist/class/paginator.d.ts +31 -0
- package/dist/class/paginator.js +43 -0
- package/dist/class/reply.d.ts +29 -0
- package/dist/class/reply.js +44 -0
- package/dist/class/security.d.ts +186 -0
- package/dist/class/security.js +178 -0
- package/dist/class/trigger_operator.d.ts +92 -0
- package/dist/class/trigger_operator.js +99 -0
- package/dist/class/user.d.ts +81 -0
- package/dist/class/user.js +151 -0
- package/dist/class/validator.d.ts +19 -0
- package/dist/class/validator.js +101 -0
- package/dist/config.d.ts +112 -0
- package/dist/config.js +26 -0
- package/dist/defult-permissions.d.ts +2 -0
- package/dist/defult-permissions.js +31 -0
- package/dist/events.d.ts +23 -0
- package/dist/events.js +47 -0
- package/dist/helper/data_insertion.d.ts +38 -0
- package/dist/helper/data_insertion.js +110 -0
- package/dist/helper/presetup_services.d.ts +60 -0
- package/dist/helper/presetup_services.js +108 -0
- package/dist/index.d.ts +118 -0
- package/dist/index.js +79 -0
- package/dist/middlewares.d.ts +53 -0
- package/dist/middlewares.js +106 -0
- package/dist/play-test.d.ts +1 -0
- package/dist/play-test.js +9 -0
- package/dist/services/data_provider/router.d.ts +4 -0
- package/dist/services/data_provider/router.js +187 -0
- package/dist/services/data_provider/service.d.ts +131 -0
- package/dist/services/data_provider/service.js +252 -0
- package/dist/services/data_provider/typeCasters.d.ts +9 -0
- package/dist/services/data_provider/typeCasters.js +18 -0
- package/dist/services/file/db.d.ts +1 -0
- package/dist/services/file/db.js +31 -0
- package/dist/services/file/router.d.ts +4 -0
- package/dist/services/file/router.js +115 -0
- package/dist/services/file/service.d.ts +204 -0
- package/dist/services/file/service.js +341 -0
- package/dist/services/functions/router.d.ts +4 -0
- package/dist/services/functions/router.js +67 -0
- package/dist/services/functions/service.d.ts +132 -0
- package/dist/services/functions/service.js +159 -0
- package/dist/services/jwt/router.d.ts +4 -0
- package/dist/services/jwt/router.js +99 -0
- package/dist/services/jwt/service.d.ts +97 -0
- package/dist/services/jwt/service.js +135 -0
- package/dist/services/user_manager/db.d.ts +1 -0
- package/dist/services/user_manager/db.js +75 -0
- package/dist/services/user_manager/permissionManager.d.ts +19 -0
- package/dist/services/user_manager/permissionManager.js +42 -0
- package/dist/services/user_manager/router.d.ts +4 -0
- package/dist/services/user_manager/router.js +195 -0
- package/dist/services/user_manager/service.d.ts +317 -0
- package/dist/services/user_manager/service.js +628 -0
- package/docs/.keep +0 -0
- package/docs/system-access-type.md +26 -0
- package/package.json +58 -45
- package/src/application.ts +206 -0
- package/src/class/cms_trigger.ts +68 -0
- package/src/class/collection_definition.ts +134 -0
- package/src/class/combinator.ts +176 -0
- package/src/class/database_trigger.ts +99 -0
- package/src/class/db_schemas.ts +44 -0
- package/src/class/{directory.js → directory.ts} +40 -18
- package/src/class/paginator.ts +51 -0
- package/src/class/reply.ts +59 -0
- package/src/class/security.ts +250 -0
- package/src/class/trigger_operator.ts +142 -0
- package/src/class/user.ts +199 -0
- package/src/class/validator.ts +123 -0
- package/src/config.ts +121 -0
- package/src/defult-permissions.ts +31 -0
- package/src/events.ts +59 -0
- package/src/helper/data_insertion.ts +94 -0
- package/src/helper/presetup_services.ts +96 -0
- package/src/index.ts +146 -0
- package/src/middlewares.ts +75 -0
- package/src/play-test.ts +8 -0
- package/src/services/data_provider/router.ts +191 -0
- package/src/services/data_provider/service.ts +305 -0
- package/src/services/data_provider/typeCasters.ts +15 -0
- package/src/services/file/db.ts +29 -0
- package/src/services/file/router.ts +88 -0
- package/src/services/file/service.ts +387 -0
- package/src/services/functions/router.ts +34 -0
- package/src/services/functions/service.ts +203 -0
- package/src/services/jwt/router.ts +73 -0
- package/src/services/jwt/service.ts +139 -0
- package/src/services/user_manager/db.ts +87 -0
- package/src/services/user_manager/permissionManager.ts +49 -0
- package/src/services/user_manager/router.ts +193 -0
- package/src/services/user_manager/service.ts +698 -0
- package/tsconfig.json +16 -9
- package/typedoc.mjs +41 -0
- package/LICENSE +0 -21
- package/package-lock.json +0 -1373
- package/src/application.js +0 -239
- package/src/class/cms_trigger.js +0 -20
- package/src/class/collection_definition.js +0 -33
- package/src/class/combinator.js +0 -133
- package/src/class/database_trigger.js +0 -20
- package/src/class/db_schemas.js +0 -18
- package/src/class/paginator.js +0 -31
- package/src/class/reply.js +0 -37
- package/src/class/security.js +0 -141
- package/src/class/trigger_operator.js +0 -39
- package/src/class/user.js +0 -112
- package/src/class/validator.js +0 -91
- package/src/config.js +0 -67
- package/src/events.js +0 -15
- package/src/helper/data_insertion.js +0 -64
- package/src/helper/presetup_services.js +0 -31
- package/src/index.js +0 -66
- package/src/middlewares.js +0 -44
- package/src/services/data_provider/router.js +0 -552
- package/src/services/data_provider/service.js +0 -262
- package/src/services/data_provider/typeCasters.js +0 -10
- package/src/services/file/db.js +0 -29
- package/src/services/file/router.js +0 -92
- package/src/services/file/service.js +0 -231
- package/src/services/functions/router.js +0 -37
- package/src/services/functions/service.js +0 -74
- package/src/services/jwt/router.js +0 -82
- package/src/services/jwt/service.js +0 -37
- package/src/services/user_manager/db.js +0 -83
- package/src/services/user_manager/permissionManager.js +0 -43
- package/src/services/user_manager/router.js +0 -176
- package/src/services/user_manager/service.js +0 -377
- package/types/application.d.ts +0 -97
- package/types/class/cms_trigger.d.ts +0 -24
- package/types/class/collection_definition.d.ts +0 -36
- package/types/class/combinator.d.ts +0 -30
- package/types/class/database_trigger.d.ts +0 -28
- package/types/class/db_schemas.d.ts +0 -2
- package/types/class/directory.d.ts +0 -2
- package/types/class/paginator.d.ts +0 -8
- package/types/class/reply.d.ts +0 -8
- package/types/class/security.d.ts +0 -109
- package/types/class/trigger_operator.d.ts +0 -19
- package/types/class/user.d.ts +0 -24
- package/types/class/validator.d.ts +0 -9
- package/types/config.d.ts +0 -101
- package/types/events.d.ts +0 -7
- package/types/helper/data_insertion.d.ts +0 -4
- package/types/helper/presetup_services.d.ts +0 -5
- package/types/index.d.ts +0 -72
- package/types/middlewares.d.ts +0 -10
- package/types/services/data_provider/router.d.ts +0 -3
- package/types/services/data_provider/service.d.ts +0 -40
- package/types/services/data_provider/typeCasters.d.ts +0 -3
- package/types/services/file/db.d.ts +0 -3
- package/types/services/file/router.d.ts +0 -3
- package/types/services/file/service.d.ts +0 -81
- package/types/services/functions/router.d.ts +0 -3
- package/types/services/functions/service.d.ts +0 -23
- package/types/services/jwt/router.d.ts +0 -3
- package/types/services/jwt/service.d.ts +0 -10
- package/types/services/user_manager/db.d.ts +0 -3
- package/types/services/user_manager/permissionManager.d.ts +0 -3
- package/types/services/user_manager/router.d.ts +0 -3
- package/types/services/user_manager/service.d.ts +0 -131
package/dist/events.js
ADDED
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.registerEventCallback = registerEventCallback;
|
|
4
|
+
exports.getEventCallbacks = getEventCallbacks;
|
|
5
|
+
exports.triggerEvent = triggerEvent;
|
|
6
|
+
/**
|
|
7
|
+
* Array to store all registered event callbacks
|
|
8
|
+
*/
|
|
9
|
+
const eventCallbacks = [];
|
|
10
|
+
/**
|
|
11
|
+
* Supported event types:
|
|
12
|
+
* - onBeforeInit: (koaApp: Koa) => void; // A callback called before initializing the Koa server.
|
|
13
|
+
* - onAfterInit: (koaApp: Koa) => void; // A callback called after server initialization.
|
|
14
|
+
* - onNewUser: (user: any) => void; // A callback called when a new user is created.
|
|
15
|
+
*
|
|
16
|
+
* @param event - The event name to register
|
|
17
|
+
* @param callback - The callback function to be called when the event is triggered
|
|
18
|
+
* @throws Error if event is not a string or callback is not a function
|
|
19
|
+
*/
|
|
20
|
+
function registerEventCallback(event, callback) {
|
|
21
|
+
if (typeof event !== "string")
|
|
22
|
+
throw new Error("Event must be a string");
|
|
23
|
+
if (typeof callback !== "function")
|
|
24
|
+
throw new Error("Callback must be a function");
|
|
25
|
+
eventCallbacks.push({ event, callback });
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Get all registered callbacks for a specific event
|
|
29
|
+
* @param event - The event name to get callbacks for
|
|
30
|
+
* @returns Array of callbacks registered for the event
|
|
31
|
+
*/
|
|
32
|
+
function getEventCallbacks(event) {
|
|
33
|
+
return eventCallbacks
|
|
34
|
+
.filter((cb) => cb.event === event)
|
|
35
|
+
.map((cb) => cb.callback);
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Trigger an event with arguments
|
|
39
|
+
* @param event - The event name to trigger
|
|
40
|
+
* @param args - Arguments to pass to the callback functions
|
|
41
|
+
*/
|
|
42
|
+
function triggerEvent(event, ...args) {
|
|
43
|
+
const callbacks = getEventCallbacks(event);
|
|
44
|
+
for (const callback of callbacks) {
|
|
45
|
+
callback(...args);
|
|
46
|
+
}
|
|
47
|
+
}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Admin user credentials interface
|
|
3
|
+
* @interface AdminCredentials
|
|
4
|
+
* @property {string} email - Admin user email address
|
|
5
|
+
* @property {string} password - Admin user password
|
|
6
|
+
*/
|
|
7
|
+
interface AdminCredentials {
|
|
8
|
+
email: string;
|
|
9
|
+
password: string;
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* Creates default system users if they don't exist
|
|
13
|
+
* @function createAdminUser
|
|
14
|
+
* @param {AdminCredentials} credentials - Admin user credentials
|
|
15
|
+
* @returns {Promise<void>} A promise that resolves when the operation is complete
|
|
16
|
+
* @throws {Error} If admin credentials are invalid or if the operation fails
|
|
17
|
+
* @description
|
|
18
|
+
* This function performs the following operations:
|
|
19
|
+
* 1. Checks if an anonymous user exists, creates one if it doesn't
|
|
20
|
+
* 2. Checks if an administrator user exists, creates one if it doesn't
|
|
21
|
+
* 3. Uses the provided credentials for the administrator user
|
|
22
|
+
*
|
|
23
|
+
* @example
|
|
24
|
+
* ```typescript
|
|
25
|
+
* // Create default system users
|
|
26
|
+
* await createAdminUser({
|
|
27
|
+
* email: 'admin@example.com',
|
|
28
|
+
* password: 'secure-password'
|
|
29
|
+
* });
|
|
30
|
+
*
|
|
31
|
+
* // The function will:
|
|
32
|
+
* // 1. Create an anonymous user if it doesn't exist
|
|
33
|
+
* // 2. Create an admin user with the provided credentials if it doesn't exist
|
|
34
|
+
* // 3. Do nothing if both users already exist
|
|
35
|
+
* ```
|
|
36
|
+
*/
|
|
37
|
+
export declare function createAdminUser({ email, password }: AdminCredentials): Promise<void>;
|
|
38
|
+
export {};
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.createAdminUser = createAdminUser;
|
|
37
|
+
const DataProvider = __importStar(require("../services/data_provider/service"));
|
|
38
|
+
const permissionManager_1 = require("../services/user_manager/permissionManager");
|
|
39
|
+
const userManager = __importStar(require("../services/user_manager/service"));
|
|
40
|
+
/**
|
|
41
|
+
* Creates default system users if they don't exist
|
|
42
|
+
* @function createAdminUser
|
|
43
|
+
* @param {AdminCredentials} credentials - Admin user credentials
|
|
44
|
+
* @returns {Promise<void>} A promise that resolves when the operation is complete
|
|
45
|
+
* @throws {Error} If admin credentials are invalid or if the operation fails
|
|
46
|
+
* @description
|
|
47
|
+
* This function performs the following operations:
|
|
48
|
+
* 1. Checks if an anonymous user exists, creates one if it doesn't
|
|
49
|
+
* 2. Checks if an administrator user exists, creates one if it doesn't
|
|
50
|
+
* 3. Uses the provided credentials for the administrator user
|
|
51
|
+
*
|
|
52
|
+
* @example
|
|
53
|
+
* ```typescript
|
|
54
|
+
* // Create default system users
|
|
55
|
+
* await createAdminUser({
|
|
56
|
+
* email: 'admin@example.com',
|
|
57
|
+
* password: 'secure-password'
|
|
58
|
+
* });
|
|
59
|
+
*
|
|
60
|
+
* // The function will:
|
|
61
|
+
* // 1. Create an anonymous user if it doesn't exist
|
|
62
|
+
* // 2. Create an admin user with the provided credentials if it doesn't exist
|
|
63
|
+
* // 3. Do nothing if both users already exist
|
|
64
|
+
* ```
|
|
65
|
+
*/
|
|
66
|
+
async function createAdminUser({ email, password }) {
|
|
67
|
+
const authModel = DataProvider.getCollection('cms', 'auth');
|
|
68
|
+
try {
|
|
69
|
+
const isAnonymousExisted = await authModel.countDocuments({ type: 'anonymous' }).exec();
|
|
70
|
+
const isAdministratorExisted = await authModel
|
|
71
|
+
.countDocuments({ type: 'user', email: email })
|
|
72
|
+
.exec();
|
|
73
|
+
if (isAnonymousExisted === 0) {
|
|
74
|
+
await userManager.main.registerUser({
|
|
75
|
+
permissionGroup: (0, permissionManager_1.getDefaultAnonymousPermissionGroup)().title,
|
|
76
|
+
email: '',
|
|
77
|
+
phone: '',
|
|
78
|
+
password: '',
|
|
79
|
+
type: 'anonymous',
|
|
80
|
+
});
|
|
81
|
+
// await new authModel({
|
|
82
|
+
// permission: getDefaultAnonymousPermissionGroup().title,
|
|
83
|
+
// email: "",
|
|
84
|
+
// phone: "",
|
|
85
|
+
// password: "",
|
|
86
|
+
// type: "anonymous",
|
|
87
|
+
// }).save();
|
|
88
|
+
}
|
|
89
|
+
if (isAdministratorExisted === 0) {
|
|
90
|
+
if (!email || !password) {
|
|
91
|
+
return Promise.reject('Invalid email or password for admin user.');
|
|
92
|
+
}
|
|
93
|
+
await userManager.main.registerUser({
|
|
94
|
+
permissionGroup: (0, permissionManager_1.getDefaultAdministratorPermissionGroup)().title,
|
|
95
|
+
email: email,
|
|
96
|
+
password: password,
|
|
97
|
+
type: 'user',
|
|
98
|
+
});
|
|
99
|
+
// await new authModel({
|
|
100
|
+
// permission: getDefaultAdministratorPermissionGroup().title,
|
|
101
|
+
// email: email,
|
|
102
|
+
// password: password,
|
|
103
|
+
// type: "user",
|
|
104
|
+
// }).save();
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
catch (e) {
|
|
108
|
+
return Promise.reject(e);
|
|
109
|
+
}
|
|
110
|
+
}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Setup options interface for initializing required services
|
|
3
|
+
* @interface SetupOptions
|
|
4
|
+
* @property {Object} [keypair] - JWT keypair configuration
|
|
5
|
+
* @property {string} keypair.private - Private key for JWT signing
|
|
6
|
+
* @property {string} keypair.public - Public key for JWT verification
|
|
7
|
+
* @property {Object} adminUser - Admin user configuration
|
|
8
|
+
* @property {string} adminUser.email - Admin user email address
|
|
9
|
+
* @property {string} adminUser.password - Admin user password
|
|
10
|
+
* @property {string} [uploadDirectory] - Directory for file uploads
|
|
11
|
+
*/
|
|
12
|
+
interface SetupOptions {
|
|
13
|
+
keypair?: {
|
|
14
|
+
private: string;
|
|
15
|
+
public: string;
|
|
16
|
+
};
|
|
17
|
+
adminUser: {
|
|
18
|
+
email: string;
|
|
19
|
+
password: string;
|
|
20
|
+
};
|
|
21
|
+
uploadDirectory?: string;
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Sets up required services for the application to run
|
|
25
|
+
* @function setup
|
|
26
|
+
* @param {SetupOptions} options - Setup configuration options
|
|
27
|
+
* @returns {Promise<void>} A promise that resolves when setup is complete
|
|
28
|
+
* @throws {Error} If admin user configuration is missing or if setup fails
|
|
29
|
+
* @description
|
|
30
|
+
* This function performs the following setup operations:
|
|
31
|
+
* 1. Configures JWT with provided or generated keypair
|
|
32
|
+
* 2. Creates default system users (admin and anonymous)
|
|
33
|
+
* 3. Configures file upload directory if specified
|
|
34
|
+
*
|
|
35
|
+
* @example
|
|
36
|
+
* ```typescript
|
|
37
|
+
* // Setup with custom keypair
|
|
38
|
+
* await setup({
|
|
39
|
+
* keypair: {
|
|
40
|
+
* private: 'your-private-key',
|
|
41
|
+
* public: 'your-public-key'
|
|
42
|
+
* },
|
|
43
|
+
* adminUser: {
|
|
44
|
+
* email: 'admin@example.com',
|
|
45
|
+
* password: 'secure-password'
|
|
46
|
+
* },
|
|
47
|
+
* uploadDirectory: './uploads'
|
|
48
|
+
* });
|
|
49
|
+
*
|
|
50
|
+
* // Setup with auto-generated keypair
|
|
51
|
+
* await setup({
|
|
52
|
+
* adminUser: {
|
|
53
|
+
* email: 'admin@example.com',
|
|
54
|
+
* password: 'secure-password'
|
|
55
|
+
* }
|
|
56
|
+
* });
|
|
57
|
+
* ```
|
|
58
|
+
*/
|
|
59
|
+
export declare function setup({ keypair, adminUser, uploadDirectory }: SetupOptions): Promise<void>;
|
|
60
|
+
export {};
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
36
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
37
|
+
};
|
|
38
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
39
|
+
exports.setup = setup;
|
|
40
|
+
const DataInsertion = __importStar(require("./data_insertion"));
|
|
41
|
+
const JWT = __importStar(require("../services/jwt/service"));
|
|
42
|
+
const FileService = __importStar(require("../services/file/service"));
|
|
43
|
+
const keypair_1 = __importDefault(require("keypair"));
|
|
44
|
+
/**
|
|
45
|
+
* Sets up required services for the application to run
|
|
46
|
+
* @function setup
|
|
47
|
+
* @param {SetupOptions} options - Setup configuration options
|
|
48
|
+
* @returns {Promise<void>} A promise that resolves when setup is complete
|
|
49
|
+
* @throws {Error} If admin user configuration is missing or if setup fails
|
|
50
|
+
* @description
|
|
51
|
+
* This function performs the following setup operations:
|
|
52
|
+
* 1. Configures JWT with provided or generated keypair
|
|
53
|
+
* 2. Creates default system users (admin and anonymous)
|
|
54
|
+
* 3. Configures file upload directory if specified
|
|
55
|
+
*
|
|
56
|
+
* @example
|
|
57
|
+
* ```typescript
|
|
58
|
+
* // Setup with custom keypair
|
|
59
|
+
* await setup({
|
|
60
|
+
* keypair: {
|
|
61
|
+
* private: 'your-private-key',
|
|
62
|
+
* public: 'your-public-key'
|
|
63
|
+
* },
|
|
64
|
+
* adminUser: {
|
|
65
|
+
* email: 'admin@example.com',
|
|
66
|
+
* password: 'secure-password'
|
|
67
|
+
* },
|
|
68
|
+
* uploadDirectory: './uploads'
|
|
69
|
+
* });
|
|
70
|
+
*
|
|
71
|
+
* // Setup with auto-generated keypair
|
|
72
|
+
* await setup({
|
|
73
|
+
* adminUser: {
|
|
74
|
+
* email: 'admin@example.com',
|
|
75
|
+
* password: 'secure-password'
|
|
76
|
+
* }
|
|
77
|
+
* });
|
|
78
|
+
* ```
|
|
79
|
+
*/
|
|
80
|
+
async function setup({ keypair, adminUser, uploadDirectory }) {
|
|
81
|
+
/**
|
|
82
|
+
* Json web Token
|
|
83
|
+
*
|
|
84
|
+
* Setup private and public keys for JWT module
|
|
85
|
+
*/
|
|
86
|
+
let keyPairToUse = keypair;
|
|
87
|
+
if (!keyPairToUse) {
|
|
88
|
+
// generate new keypair
|
|
89
|
+
keyPairToUse = (0, keypair_1.default)();
|
|
90
|
+
}
|
|
91
|
+
JWT.main.setKies(keyPairToUse.private, keyPairToUse.public);
|
|
92
|
+
if (!adminUser) {
|
|
93
|
+
throw new Error('Admin user is not supported in TypeScript version');
|
|
94
|
+
}
|
|
95
|
+
/**
|
|
96
|
+
* Data Insertion
|
|
97
|
+
*
|
|
98
|
+
* Insert admin user
|
|
99
|
+
* for the first time
|
|
100
|
+
*/
|
|
101
|
+
await DataInsertion.createAdminUser(adminUser);
|
|
102
|
+
/**
|
|
103
|
+
* File Service
|
|
104
|
+
*/
|
|
105
|
+
if (uploadDirectory) {
|
|
106
|
+
FileService.main.setUploadDirectory(uploadDirectory);
|
|
107
|
+
}
|
|
108
|
+
}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
import { createRest } from './application';
|
|
2
|
+
import { Schema } from 'mongoose';
|
|
3
|
+
import * as paginator from './class/paginator';
|
|
4
|
+
import * as reply from './class/reply';
|
|
5
|
+
import { validator } from './class/validator';
|
|
6
|
+
import { getCollection } from './services/data_provider/service';
|
|
7
|
+
import { defineFunction } from './services/functions/service';
|
|
8
|
+
import TypeCasters from './services/data_provider/typeCasters';
|
|
9
|
+
import { main as userManager } from './services/user_manager/service';
|
|
10
|
+
import { main as fileService } from './services/file/service';
|
|
11
|
+
import { CollectionDefinition, defineCollection } from './class/collection_definition';
|
|
12
|
+
import { schemas } from './class/db_schemas';
|
|
13
|
+
import DatabaseTrigger from './class/database_trigger';
|
|
14
|
+
import CmsTrigger from './class/cms_trigger';
|
|
15
|
+
import { AccessDefinition, Permission, PermissionTypes, PermissionGroup, AccessTypes } from './class/security';
|
|
16
|
+
import * as middleware from './middlewares';
|
|
17
|
+
/**
|
|
18
|
+
* @description Creates a new REST API instance
|
|
19
|
+
* @example
|
|
20
|
+
* ```typescript
|
|
21
|
+
* const rest = createRest();
|
|
22
|
+
* ```
|
|
23
|
+
* @returns A new REST API instance
|
|
24
|
+
*/
|
|
25
|
+
export { createRest };
|
|
26
|
+
export { CollectionDefinition, defineCollection };
|
|
27
|
+
/**
|
|
28
|
+
* @description Provides predefined database schemas
|
|
29
|
+
* @example
|
|
30
|
+
* ```typescript
|
|
31
|
+
* const userSchema = new Schema({
|
|
32
|
+
* name: String,
|
|
33
|
+
* avatar: Schemas.file
|
|
34
|
+
* });
|
|
35
|
+
* ```
|
|
36
|
+
*/
|
|
37
|
+
export { schemas };
|
|
38
|
+
/**
|
|
39
|
+
* @description Mongoose Schema class for defining data models
|
|
40
|
+
*/
|
|
41
|
+
export { Schema };
|
|
42
|
+
/**
|
|
43
|
+
* @description Handles database triggers and events
|
|
44
|
+
* @example
|
|
45
|
+
* ```typescript
|
|
46
|
+
* const trigger = new DatabaseTrigger('insert-one', (data) => {
|
|
47
|
+
* // Handle insert event
|
|
48
|
+
* });
|
|
49
|
+
* ```
|
|
50
|
+
*/
|
|
51
|
+
export { DatabaseTrigger };
|
|
52
|
+
/**
|
|
53
|
+
* @description Handles CMS triggers and events
|
|
54
|
+
*/
|
|
55
|
+
export { CmsTrigger };
|
|
56
|
+
/**
|
|
57
|
+
* @description Security and access control definitions
|
|
58
|
+
* @example
|
|
59
|
+
* ```typescript
|
|
60
|
+
* const permission = new Permission({
|
|
61
|
+
* type: 'user_access',
|
|
62
|
+
* read: true,
|
|
63
|
+
* write: true
|
|
64
|
+
* });
|
|
65
|
+
* ```
|
|
66
|
+
*/
|
|
67
|
+
export { AccessDefinition, Permission, PermissionTypes, PermissionGroup, AccessTypes };
|
|
68
|
+
/**
|
|
69
|
+
* @description Defines custom functions for the API
|
|
70
|
+
* @example
|
|
71
|
+
* ```typescript
|
|
72
|
+
* defineFunction('sendEmail', async (data) => {
|
|
73
|
+
* // Send email logic
|
|
74
|
+
* });
|
|
75
|
+
* ```
|
|
76
|
+
*/
|
|
77
|
+
export { defineFunction };
|
|
78
|
+
/**
|
|
79
|
+
* @description Type casting utilities for data transformation
|
|
80
|
+
*/
|
|
81
|
+
export { TypeCasters };
|
|
82
|
+
/**
|
|
83
|
+
* @description Input validation utilities
|
|
84
|
+
*/
|
|
85
|
+
export { validator };
|
|
86
|
+
/**
|
|
87
|
+
* @description Response handling utilities
|
|
88
|
+
*/
|
|
89
|
+
export { reply };
|
|
90
|
+
/**
|
|
91
|
+
* @description Pagination utilities
|
|
92
|
+
*/
|
|
93
|
+
export { paginator };
|
|
94
|
+
/**
|
|
95
|
+
* @description Database collection access utilities
|
|
96
|
+
*/
|
|
97
|
+
export { getCollection };
|
|
98
|
+
/**
|
|
99
|
+
* @description File handling utilities
|
|
100
|
+
* @example
|
|
101
|
+
* ```typescript
|
|
102
|
+
* const file = await fileService.getFile('fileId');
|
|
103
|
+
* const link = fileService.getFileLink('fileId');
|
|
104
|
+
* ```
|
|
105
|
+
*/
|
|
106
|
+
export { fileService };
|
|
107
|
+
/**
|
|
108
|
+
* @description Middleware utilities
|
|
109
|
+
*/
|
|
110
|
+
export { middleware };
|
|
111
|
+
/**
|
|
112
|
+
* @description User management utilities
|
|
113
|
+
* @example
|
|
114
|
+
* ```typescript
|
|
115
|
+
* const user = await userManager.getUserById('userId');
|
|
116
|
+
* ```
|
|
117
|
+
*/
|
|
118
|
+
export { userManager };
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
36
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
37
|
+
};
|
|
38
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
39
|
+
exports.userManager = exports.middleware = exports.fileService = exports.getCollection = exports.paginator = exports.reply = exports.validator = exports.TypeCasters = exports.defineFunction = exports.AccessTypes = exports.PermissionGroup = exports.PermissionTypes = exports.Permission = exports.AccessDefinition = exports.CmsTrigger = exports.DatabaseTrigger = exports.Schema = exports.schemas = exports.defineCollection = exports.CollectionDefinition = exports.createRest = void 0;
|
|
40
|
+
// Application
|
|
41
|
+
const application_1 = require("./application");
|
|
42
|
+
Object.defineProperty(exports, "createRest", { enumerable: true, get: function () { return application_1.createRest; } });
|
|
43
|
+
const mongoose_1 = require("mongoose");
|
|
44
|
+
Object.defineProperty(exports, "Schema", { enumerable: true, get: function () { return mongoose_1.Schema; } });
|
|
45
|
+
// Utilities
|
|
46
|
+
const paginator = __importStar(require("./class/paginator"));
|
|
47
|
+
exports.paginator = paginator;
|
|
48
|
+
const reply = __importStar(require("./class/reply"));
|
|
49
|
+
exports.reply = reply;
|
|
50
|
+
const validator_1 = require("./class/validator");
|
|
51
|
+
Object.defineProperty(exports, "validator", { enumerable: true, get: function () { return validator_1.validator; } });
|
|
52
|
+
const service_1 = require("./services/data_provider/service");
|
|
53
|
+
Object.defineProperty(exports, "getCollection", { enumerable: true, get: function () { return service_1.getCollection; } });
|
|
54
|
+
const service_2 = require("./services/functions/service");
|
|
55
|
+
Object.defineProperty(exports, "defineFunction", { enumerable: true, get: function () { return service_2.defineFunction; } });
|
|
56
|
+
const typeCasters_1 = __importDefault(require("./services/data_provider/typeCasters"));
|
|
57
|
+
exports.TypeCasters = typeCasters_1.default;
|
|
58
|
+
const service_3 = require("./services/user_manager/service");
|
|
59
|
+
Object.defineProperty(exports, "userManager", { enumerable: true, get: function () { return service_3.main; } });
|
|
60
|
+
const service_4 = require("./services/file/service");
|
|
61
|
+
Object.defineProperty(exports, "fileService", { enumerable: true, get: function () { return service_4.main; } });
|
|
62
|
+
// Base class
|
|
63
|
+
const collection_definition_1 = require("./class/collection_definition");
|
|
64
|
+
Object.defineProperty(exports, "CollectionDefinition", { enumerable: true, get: function () { return collection_definition_1.CollectionDefinition; } });
|
|
65
|
+
Object.defineProperty(exports, "defineCollection", { enumerable: true, get: function () { return collection_definition_1.defineCollection; } });
|
|
66
|
+
const db_schemas_1 = require("./class/db_schemas");
|
|
67
|
+
Object.defineProperty(exports, "schemas", { enumerable: true, get: function () { return db_schemas_1.schemas; } });
|
|
68
|
+
const database_trigger_1 = __importDefault(require("./class/database_trigger"));
|
|
69
|
+
exports.DatabaseTrigger = database_trigger_1.default;
|
|
70
|
+
const cms_trigger_1 = __importDefault(require("./class/cms_trigger"));
|
|
71
|
+
exports.CmsTrigger = cms_trigger_1.default;
|
|
72
|
+
const security_1 = require("./class/security");
|
|
73
|
+
Object.defineProperty(exports, "AccessDefinition", { enumerable: true, get: function () { return security_1.AccessDefinition; } });
|
|
74
|
+
Object.defineProperty(exports, "Permission", { enumerable: true, get: function () { return security_1.Permission; } });
|
|
75
|
+
Object.defineProperty(exports, "PermissionTypes", { enumerable: true, get: function () { return security_1.PermissionTypes; } });
|
|
76
|
+
Object.defineProperty(exports, "PermissionGroup", { enumerable: true, get: function () { return security_1.PermissionGroup; } });
|
|
77
|
+
Object.defineProperty(exports, "AccessTypes", { enumerable: true, get: function () { return security_1.AccessTypes; } });
|
|
78
|
+
const middleware = __importStar(require("./middlewares"));
|
|
79
|
+
exports.middleware = middleware;
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import { Context, Next } from 'koa';
|
|
2
|
+
/**
|
|
3
|
+
* Authentication middleware that secures routes by validating user tokens and managing access control.
|
|
4
|
+
*
|
|
5
|
+
* This middleware performs several key functions:
|
|
6
|
+
* 1. Validates that the incoming request contains an authorization token in the header
|
|
7
|
+
* 2. Verifies the token is valid by checking against the user management service
|
|
8
|
+
* 3. Retrieves the associated user object if the token is valid
|
|
9
|
+
* 4. Attaches the authenticated {@link User} object on ctx.state.user for use in subsequent middleware/routes
|
|
10
|
+
* 5. Throws appropriate HTTP errors (401, 412) if authentication fails
|
|
11
|
+
*
|
|
12
|
+
* The middleware integrates with the permission system to enable role-based access control.
|
|
13
|
+
* The attached user object provides methods like hasPermission() to check specific permissions.
|
|
14
|
+
*
|
|
15
|
+
* Common usage patterns:
|
|
16
|
+
* - Protecting sensitive API endpoints
|
|
17
|
+
* - Implementing role-based access control
|
|
18
|
+
* - Getting the current authenticated user
|
|
19
|
+
* - Validating user permissions before allowing actions
|
|
20
|
+
*
|
|
21
|
+
* @throws {Error} 401 - If no authorization header is present
|
|
22
|
+
* @throws {Error} 412 - If token validation fails
|
|
23
|
+
* @param ctx - Koa Context object containing request/response data
|
|
24
|
+
* @param next - Function to invoke next middleware
|
|
25
|
+
*
|
|
26
|
+
* @example
|
|
27
|
+
* ```typescript
|
|
28
|
+
* // Inside the router.ts file
|
|
29
|
+
* import { auth } from '@modular-rest/server';
|
|
30
|
+
* import { Router } from 'koa-router';
|
|
31
|
+
*
|
|
32
|
+
* const name = 'flowers';
|
|
33
|
+
*
|
|
34
|
+
* const flowerRouter = new Router();
|
|
35
|
+
*
|
|
36
|
+
* flowerRouter.get('/list', auth, (ctx) => {
|
|
37
|
+
* // Get the authenticated user
|
|
38
|
+
* const user = ctx.state.user;
|
|
39
|
+
*
|
|
40
|
+
* // Then you can check the user's role and permission
|
|
41
|
+
* if(user.hasPermission('get_flower')) {
|
|
42
|
+
* ctx.body = 'This is a list of flowers: Rose, Lily, Tulip';
|
|
43
|
+
* } else {
|
|
44
|
+
* ctx.status = 403;
|
|
45
|
+
* ctx.body = 'You are not authorized to access this resource';
|
|
46
|
+
* }
|
|
47
|
+
* });
|
|
48
|
+
*
|
|
49
|
+
* module.exports.name = name;
|
|
50
|
+
* module.exports.main = flowerRouter;
|
|
51
|
+
* ```
|
|
52
|
+
*/
|
|
53
|
+
export declare function auth(ctx: Context, next: Next): Promise<void>;
|