@modular-rest/server 1.11.13 → 1.11.15

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.
Files changed (181) hide show
  1. package/.nvmrc +1 -0
  2. package/.prettierrc.json +9 -0
  3. package/.releaserc.json +24 -0
  4. package/README.md +79 -94
  5. package/dist/application.d.ts +29 -0
  6. package/dist/application.js +217 -0
  7. package/dist/class/cms_trigger.d.ts +52 -0
  8. package/dist/class/cms_trigger.js +47 -0
  9. package/dist/class/collection_definition.d.ts +112 -0
  10. package/dist/class/collection_definition.js +87 -0
  11. package/dist/class/combinator.d.ts +43 -0
  12. package/dist/class/combinator.js +174 -0
  13. package/dist/class/database_trigger.d.ts +90 -0
  14. package/dist/class/database_trigger.js +64 -0
  15. package/dist/class/db_schemas.d.ts +25 -0
  16. package/dist/class/db_schemas.js +28 -0
  17. package/dist/class/directory.d.ts +20 -0
  18. package/dist/class/directory.js +87 -0
  19. package/dist/class/paginator.d.ts +31 -0
  20. package/dist/class/paginator.js +43 -0
  21. package/dist/class/reply.d.ts +29 -0
  22. package/dist/class/reply.js +44 -0
  23. package/dist/class/security.d.ts +186 -0
  24. package/dist/class/security.js +178 -0
  25. package/dist/class/trigger_operator.d.ts +92 -0
  26. package/dist/class/trigger_operator.js +99 -0
  27. package/dist/class/user.d.ts +81 -0
  28. package/dist/class/user.js +151 -0
  29. package/dist/class/validator.d.ts +19 -0
  30. package/dist/class/validator.js +101 -0
  31. package/dist/config.d.ts +113 -0
  32. package/dist/config.js +26 -0
  33. package/dist/defult-permissions.d.ts +2 -0
  34. package/dist/defult-permissions.js +31 -0
  35. package/dist/events.d.ts +23 -0
  36. package/dist/events.js +47 -0
  37. package/dist/helper/data_insertion.d.ts +38 -0
  38. package/dist/helper/data_insertion.js +110 -0
  39. package/dist/helper/presetup_services.d.ts +60 -0
  40. package/dist/helper/presetup_services.js +108 -0
  41. package/dist/index.d.ts +118 -0
  42. package/dist/index.js +79 -0
  43. package/dist/middlewares.d.ts +53 -0
  44. package/dist/middlewares.js +106 -0
  45. package/dist/play-test.d.ts +1 -0
  46. package/dist/play-test.js +9 -0
  47. package/dist/services/data_provider/router.d.ts +4 -0
  48. package/dist/services/data_provider/router.js +412 -0
  49. package/dist/services/data_provider/service.d.ts +132 -0
  50. package/dist/services/data_provider/service.js +253 -0
  51. package/dist/services/data_provider/typeCasters.d.ts +9 -0
  52. package/dist/services/data_provider/typeCasters.js +18 -0
  53. package/dist/services/file/db.d.ts +1 -0
  54. package/dist/services/file/db.js +31 -0
  55. package/dist/services/file/router.d.ts +4 -0
  56. package/dist/services/file/router.js +115 -0
  57. package/dist/services/file/service.d.ts +204 -0
  58. package/dist/services/file/service.js +341 -0
  59. package/dist/services/functions/router.d.ts +4 -0
  60. package/dist/services/functions/router.js +68 -0
  61. package/dist/services/functions/service.d.ts +132 -0
  62. package/dist/services/functions/service.js +159 -0
  63. package/dist/services/jwt/router.d.ts +4 -0
  64. package/dist/services/jwt/router.js +99 -0
  65. package/dist/services/jwt/service.d.ts +97 -0
  66. package/dist/services/jwt/service.js +135 -0
  67. package/dist/services/user_manager/db.d.ts +1 -0
  68. package/dist/services/user_manager/db.js +75 -0
  69. package/dist/services/user_manager/permissionManager.d.ts +19 -0
  70. package/dist/services/user_manager/permissionManager.js +42 -0
  71. package/dist/services/user_manager/router.d.ts +4 -0
  72. package/dist/services/user_manager/router.js +195 -0
  73. package/dist/services/user_manager/service.d.ts +317 -0
  74. package/dist/services/user_manager/service.js +632 -0
  75. package/docs/.keep +0 -0
  76. package/docs/system-access-type.md +26 -0
  77. package/package.json +59 -46
  78. package/src/application.ts +206 -0
  79. package/src/class/cms_trigger.ts +62 -0
  80. package/src/class/collection_definition.ts +134 -0
  81. package/src/class/combinator.ts +176 -0
  82. package/src/class/database_trigger.ts +105 -0
  83. package/src/class/db_schemas.ts +44 -0
  84. package/src/class/{directory.js → directory.ts} +40 -18
  85. package/src/class/paginator.ts +51 -0
  86. package/src/class/reply.ts +59 -0
  87. package/src/class/security.ts +250 -0
  88. package/src/class/trigger_operator.ts +142 -0
  89. package/src/class/user.ts +199 -0
  90. package/src/class/validator.ts +123 -0
  91. package/src/config.ts +122 -0
  92. package/src/defult-permissions.ts +31 -0
  93. package/src/events.ts +59 -0
  94. package/src/helper/data_insertion.ts +94 -0
  95. package/src/helper/presetup_services.ts +96 -0
  96. package/src/index.ts +146 -0
  97. package/src/middlewares.ts +75 -0
  98. package/src/play-test.ts +8 -0
  99. package/src/services/data_provider/router.ts +484 -0
  100. package/src/services/data_provider/service.ts +306 -0
  101. package/src/services/data_provider/typeCasters.ts +15 -0
  102. package/src/services/file/db.ts +29 -0
  103. package/src/services/file/router.ts +88 -0
  104. package/src/services/file/service.ts +387 -0
  105. package/src/services/functions/router.ts +35 -0
  106. package/src/services/functions/service.ts +203 -0
  107. package/src/services/jwt/router.ts +73 -0
  108. package/src/services/jwt/service.ts +139 -0
  109. package/src/services/user_manager/db.ts +87 -0
  110. package/src/services/user_manager/permissionManager.ts +49 -0
  111. package/src/services/user_manager/router.ts +193 -0
  112. package/src/services/user_manager/service.ts +703 -0
  113. package/tsconfig.json +16 -9
  114. package/typedoc.mjs +41 -0
  115. package/LICENSE +0 -21
  116. package/package-lock.json +0 -1373
  117. package/src/application.js +0 -239
  118. package/src/class/cms_trigger.js +0 -20
  119. package/src/class/collection_definition.js +0 -33
  120. package/src/class/combinator.js +0 -133
  121. package/src/class/database_trigger.js +0 -20
  122. package/src/class/db_schemas.js +0 -18
  123. package/src/class/paginator.js +0 -31
  124. package/src/class/reply.js +0 -37
  125. package/src/class/security.js +0 -141
  126. package/src/class/trigger_operator.js +0 -39
  127. package/src/class/user.js +0 -112
  128. package/src/class/validator.js +0 -91
  129. package/src/config.js +0 -67
  130. package/src/events.js +0 -15
  131. package/src/helper/data_insertion.js +0 -64
  132. package/src/helper/presetup_services.js +0 -31
  133. package/src/index.js +0 -66
  134. package/src/middlewares.js +0 -44
  135. package/src/services/data_provider/router.js +0 -552
  136. package/src/services/data_provider/service.js +0 -262
  137. package/src/services/data_provider/typeCasters.js +0 -10
  138. package/src/services/file/db.js +0 -29
  139. package/src/services/file/router.js +0 -92
  140. package/src/services/file/service.js +0 -231
  141. package/src/services/functions/router.js +0 -37
  142. package/src/services/functions/service.js +0 -74
  143. package/src/services/jwt/router.js +0 -82
  144. package/src/services/jwt/service.js +0 -37
  145. package/src/services/user_manager/db.js +0 -83
  146. package/src/services/user_manager/permissionManager.js +0 -43
  147. package/src/services/user_manager/router.js +0 -176
  148. package/src/services/user_manager/service.js +0 -377
  149. package/types/application.d.ts +0 -97
  150. package/types/class/cms_trigger.d.ts +0 -24
  151. package/types/class/collection_definition.d.ts +0 -36
  152. package/types/class/combinator.d.ts +0 -30
  153. package/types/class/database_trigger.d.ts +0 -28
  154. package/types/class/db_schemas.d.ts +0 -2
  155. package/types/class/directory.d.ts +0 -2
  156. package/types/class/paginator.d.ts +0 -8
  157. package/types/class/reply.d.ts +0 -8
  158. package/types/class/security.d.ts +0 -109
  159. package/types/class/trigger_operator.d.ts +0 -19
  160. package/types/class/user.d.ts +0 -24
  161. package/types/class/validator.d.ts +0 -9
  162. package/types/config.d.ts +0 -101
  163. package/types/events.d.ts +0 -7
  164. package/types/helper/data_insertion.d.ts +0 -4
  165. package/types/helper/presetup_services.d.ts +0 -5
  166. package/types/index.d.ts +0 -72
  167. package/types/middlewares.d.ts +0 -10
  168. package/types/services/data_provider/router.d.ts +0 -3
  169. package/types/services/data_provider/service.d.ts +0 -40
  170. package/types/services/data_provider/typeCasters.d.ts +0 -3
  171. package/types/services/file/db.d.ts +0 -3
  172. package/types/services/file/router.d.ts +0 -3
  173. package/types/services/file/service.d.ts +0 -81
  174. package/types/services/functions/router.d.ts +0 -3
  175. package/types/services/functions/service.d.ts +0 -23
  176. package/types/services/jwt/router.d.ts +0 -3
  177. package/types/services/jwt/service.d.ts +0 -10
  178. package/types/services/user_manager/db.d.ts +0 -3
  179. package/types/services/user_manager/permissionManager.d.ts +0 -3
  180. package/types/services/user_manager/router.d.ts +0 -3
  181. 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
+ }
@@ -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>;