fiberx-backend-toolkit 0.1.20 → 1.0.1
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 +207 -139
- package/dist/code_templates/sequelize_code_template.d.ts +1 -1
- package/dist/code_templates/sequelize_code_template.js +127 -74
- package/dist/config/constants.d.ts +1 -0
- package/dist/config/constants.js +82 -15
- package/dist/database/connectors/sequelize_connector.d.ts +2 -0
- package/dist/database/connectors/sequelize_connector.js +43 -21
- package/dist/database/main.d.ts +3 -2
- package/dist/database/main.js +4 -2
- package/dist/database/schema/schema_diff_util.d.ts +0 -1
- package/dist/database/schema/schema_diff_util.js +7 -15
- package/dist/database/scripts/create_schema_script.js +6 -3
- package/dist/database/scripts/make_migrations_script.js +17 -10
- package/dist/database/scripts/migration_runner_script.d.ts +3 -1
- package/dist/database/scripts/migration_runner_script.js +58 -23
- package/dist/database/scripts/seeder_runner_script.d.ts +3 -1
- package/dist/database/scripts/seeder_runner_script.js +49 -17
- package/dist/database/scripts/sequelize_model_generator_script.d.ts +2 -2
- package/dist/database/scripts/sequelize_model_generator_script.js +11 -5
- package/dist/index.d.ts +7 -0
- package/dist/index.js +7 -0
- package/dist/mailer/main.d.ts +1 -1
- package/dist/mailer/processors/email_delivery_processor.js +45 -13
- package/dist/mailer/processors/email_enqueue_processor.js +23 -7
- package/dist/mailer/utils/mailer_data_loader_util.d.ts +4 -4
- package/dist/mailer/utils/mailer_data_loader_util.js +5 -5
- package/dist/middle_ware/authentication_middle_ware.d.ts +3 -3
- package/dist/middle_ware/authentication_middle_ware.js +27 -25
- package/dist/middle_ware/cookie_manager_middle_ware.js +1 -1
- package/dist/middle_ware/main.d.ts +3 -2
- package/dist/middle_ware/main.js +4 -2
- package/dist/middle_ware/rate_limiter_middle_ware.js +0 -1
- package/dist/middle_ware/request_logger_middle_ware.js +2 -1
- package/dist/middle_ware/response_formatter_middle_ware.js +5 -4
- package/dist/middle_ware/secure_headers_middle_ware.js +2 -1
- package/dist/rbac/rbac_loader_util.js +2 -2
- package/dist/storage/drivers/gcs_storage_driver.js +5 -5
- package/dist/storage/drivers/local_storage_driver.js +2 -2
- package/dist/storage/main.d.ts +1 -1
- package/dist/storage/processors/file_upload_processor.js +4 -4
- package/dist/storage/utils/storage_driver_util.d.ts +1 -1
- package/dist/storage/utils/storage_driver_util.js +12 -10
- package/dist/types/express_decelaration.d.ts +1 -1
- package/dist/types/express_decelaration.js +0 -1
- package/dist/types/middle_ware_type.d.ts +14 -12
- package/dist/types/middle_ware_type.js +0 -2
- package/dist/types/schema_type.js +0 -1
- package/dist/types/util_type.js +0 -1
- package/dist/utils/content_manager_util.js +11 -9
- package/dist/utils/crypto_key_util.js +9 -10
- package/dist/utils/encryptor_decryptor_util.js +19 -9
- package/dist/utils/env_manager_util.d.ts +1 -0
- package/dist/utils/env_manager_util.js +10 -2
- package/dist/utils/fs_actions_util.js +1 -1
- package/dist/utils/input_transformer_util.js +11 -25
- package/dist/utils/input_validator_util.d.ts +1 -1
- package/dist/utils/input_validator_util.js +78 -27
- package/dist/utils/logger_util.d.ts +2 -2
- package/dist/utils/logger_util.js +23 -9
- package/dist/utils/main.d.ts +1 -1
- package/dist/utils/safe_execute_util.js +21 -11
- package/dist/utils/sql_formatter_util.js +1 -5
- package/dist/utils/totp_service_util.js +3 -7
- package/dist/utils/uuid_gen_util.js +6 -2
- package/dist/validators/file_validator_util.js +2 -2
- package/dist/validators/query_validator_util.js +3 -3
- package/package.json +68 -2
|
@@ -18,13 +18,17 @@ class EmailDeliveryProcessor {
|
|
|
18
18
|
this.adapter = adapter;
|
|
19
19
|
this.options = options || {};
|
|
20
20
|
}
|
|
21
|
-
// EMial Render method
|
|
21
|
+
// EMial Render method
|
|
22
22
|
async render(template, payload) {
|
|
23
23
|
try {
|
|
24
24
|
return await main_1.EJSRenderUtil.safeRenderString(template, payload);
|
|
25
25
|
}
|
|
26
26
|
catch (error) {
|
|
27
|
-
this.logger.error(`Failed to render string with given payload`, {
|
|
27
|
+
this.logger.error(`Failed to render string with given payload`, {
|
|
28
|
+
template,
|
|
29
|
+
payload,
|
|
30
|
+
error,
|
|
31
|
+
});
|
|
28
32
|
return null;
|
|
29
33
|
}
|
|
30
34
|
}
|
|
@@ -57,7 +61,7 @@ class EmailDeliveryProcessor {
|
|
|
57
61
|
};
|
|
58
62
|
});
|
|
59
63
|
this.logger.info(`Done preparing ${email_attachments?.length} Email attachments for Record with ID ${record_id}`);
|
|
60
|
-
const { from_email_address, reply_to_email_address, host, port, username, decrypted_password, tls_reject_unauthorized = false } = await this.adapter.getMailerTransporterConfig(record, mailer_config);
|
|
64
|
+
const { from_email_address, reply_to_email_address, host, port, username, decrypted_password, tls_reject_unauthorized = false, } = await this.adapter.getMailerTransporterConfig(record, mailer_config);
|
|
61
65
|
const transporter = nodemailer_1.default.createTransport({
|
|
62
66
|
host,
|
|
63
67
|
port,
|
|
@@ -66,7 +70,7 @@ class EmailDeliveryProcessor {
|
|
|
66
70
|
user: username,
|
|
67
71
|
pass: decrypted_password,
|
|
68
72
|
},
|
|
69
|
-
tls: { rejectUnauthorized: tls_reject_unauthorized }
|
|
73
|
+
tls: { rejectUnauthorized: tls_reject_unauthorized },
|
|
70
74
|
});
|
|
71
75
|
this.logger.info(`Mailer transporter Config has been set for Record with ID ${record_id}`);
|
|
72
76
|
await transporter.sendMail({
|
|
@@ -107,20 +111,35 @@ class EmailDeliveryProcessor {
|
|
|
107
111
|
async processSingleRecord(record) {
|
|
108
112
|
const { id: record_id, recipient_email } = this.adapter.getEmailRecordIdAndRecipient(record);
|
|
109
113
|
try {
|
|
110
|
-
this.logger.info(`Processing email queue Record ${record_id}`, {
|
|
114
|
+
this.logger.info(`Processing email queue Record ${record_id}`, {
|
|
115
|
+
record_id,
|
|
116
|
+
recipient_email,
|
|
117
|
+
});
|
|
111
118
|
const template = await this.adapter.getEmailRecordTemplate(record);
|
|
112
119
|
if (!template) {
|
|
113
|
-
this.logger.error(`Missing Email Template for Record ${record_id}`, {
|
|
120
|
+
this.logger.error(`Missing Email Template for Record ${record_id}`, {
|
|
121
|
+
record_id,
|
|
122
|
+
recipient_email,
|
|
123
|
+
template,
|
|
124
|
+
});
|
|
114
125
|
throw new Error(`Missing Email Template for Record ${record_id}`);
|
|
115
126
|
}
|
|
116
127
|
const base_template = await this.adapter.getEmailRecordBaseTemplate(record, template);
|
|
117
128
|
if (!base_template) {
|
|
118
|
-
this.logger.error(`Missing Base Email Template for Record ${record_id}`, {
|
|
129
|
+
this.logger.error(`Missing Base Email Template for Record ${record_id}`, {
|
|
130
|
+
record_id,
|
|
131
|
+
recipient_email,
|
|
132
|
+
base_template,
|
|
133
|
+
});
|
|
119
134
|
throw new Error(`Missing Base Email Template for Record ${record_id}`);
|
|
120
135
|
}
|
|
121
136
|
const mailer_config = await this.adapter.getEmailRecordMailerConfig(record, base_template);
|
|
122
137
|
if (!mailer_config) {
|
|
123
|
-
this.logger.error(`Missing Mailer Config for Record ${record_id}`, {
|
|
138
|
+
this.logger.error(`Missing Mailer Config for Record ${record_id}`, {
|
|
139
|
+
record_id,
|
|
140
|
+
recipient_email,
|
|
141
|
+
mailer_config,
|
|
142
|
+
});
|
|
124
143
|
throw new Error(`Missing Mailer Config for Record ${record_id}`);
|
|
125
144
|
}
|
|
126
145
|
const subject_value = this.adapter.getEmailRecordSubjectValue(record);
|
|
@@ -136,7 +155,11 @@ class EmailDeliveryProcessor {
|
|
|
136
155
|
const full_email_payload = await this.adapter.getFullEmailPayload(record, rendered_subject, rendered_body, email_payload);
|
|
137
156
|
const full_email_render = await this.render(base_email_value, full_email_payload);
|
|
138
157
|
if (!full_email_render) {
|
|
139
|
-
this.logger.error(`Failed to render Full Email for Record ${record_id}`, {
|
|
158
|
+
this.logger.error(`Failed to render Full Email for Record ${record_id}`, {
|
|
159
|
+
base_email_value,
|
|
160
|
+
full_email_render,
|
|
161
|
+
full_email_payload,
|
|
162
|
+
});
|
|
140
163
|
throw new Error(`Failed to render Full Email for Record ${record_id}`);
|
|
141
164
|
}
|
|
142
165
|
let email_sent = false;
|
|
@@ -147,16 +170,25 @@ class EmailDeliveryProcessor {
|
|
|
147
170
|
email_sent = await this.sendEmail(record, mailer_config, rendered_subject, full_email_render, email_payload?.attachments);
|
|
148
171
|
}
|
|
149
172
|
if (!email_sent) {
|
|
150
|
-
this.logger.error(`Failed to Send email for Record ${record_id}`, {
|
|
173
|
+
this.logger.error(`Failed to Send email for Record ${record_id}`, {
|
|
174
|
+
email_sent,
|
|
175
|
+
recipient_email,
|
|
176
|
+
});
|
|
151
177
|
throw new Error(`Failed to Send email for Record ${record_id}`);
|
|
152
178
|
}
|
|
153
179
|
await this.adapter.updateEmailRecordAsCompleted(record, rendered_subject, rendered_body);
|
|
154
|
-
this.logger.success(`Completed Processing email queue Record ${record_id}`, {
|
|
180
|
+
this.logger.success(`Completed Processing email queue Record ${record_id}`, {
|
|
181
|
+
record_id,
|
|
182
|
+
recipient_email,
|
|
183
|
+
});
|
|
155
184
|
}
|
|
156
185
|
catch (error) {
|
|
157
186
|
const message = error?.message ?? "Unknown error";
|
|
158
187
|
await this.adapter.updateEmailRecordAsFailed(record, message);
|
|
159
|
-
this.logger.error(`Failed to Process email queue Record ${record_id}`, {
|
|
188
|
+
this.logger.error(`Failed to Process email queue Record ${record_id}`, {
|
|
189
|
+
record_id,
|
|
190
|
+
recipient_email,
|
|
191
|
+
});
|
|
160
192
|
}
|
|
161
193
|
}
|
|
162
194
|
// ==============================
|
|
@@ -170,7 +202,7 @@ class EmailDeliveryProcessor {
|
|
|
170
202
|
const concurrency = this.options?.concurrency ?? 5;
|
|
171
203
|
for (let i = 0; i < records.length; i += concurrency) {
|
|
172
204
|
const batch = records.slice(i, i + concurrency);
|
|
173
|
-
await Promise.all(batch.map(r => this.processSingleRecord(r)));
|
|
205
|
+
await Promise.all(batch.map((r) => this.processSingleRecord(r)));
|
|
174
206
|
}
|
|
175
207
|
this.logger.info(`Done Processing ${records.length} queued email(s)`);
|
|
176
208
|
}
|
|
@@ -67,8 +67,12 @@ class EmailEnqueueProcessor {
|
|
|
67
67
|
// ==============================
|
|
68
68
|
async enqueue(input) {
|
|
69
69
|
try {
|
|
70
|
-
const { notification_code, payload: data_payload, recipient_email, created_by, scheduled_at = null, attachments = [] } = input;
|
|
71
|
-
this.logger.info("Enqueue email request received", {
|
|
70
|
+
const { notification_code, payload: data_payload, recipient_email, created_by, scheduled_at = null, attachments = [], } = input;
|
|
71
|
+
this.logger.info("Enqueue email request received", {
|
|
72
|
+
notification_code,
|
|
73
|
+
recipient_email,
|
|
74
|
+
scheduled_at,
|
|
75
|
+
});
|
|
72
76
|
// 1️⃣ Resolve notification
|
|
73
77
|
const template = await this.provider.fetchActiveTemplate(notification_code);
|
|
74
78
|
if (!template) {
|
|
@@ -78,12 +82,18 @@ class EmailEnqueueProcessor {
|
|
|
78
82
|
this.logger.info("Template record resolved", { notification_code });
|
|
79
83
|
const notification = this.provider.getNotificationFromTemplate(template);
|
|
80
84
|
if (!template) {
|
|
81
|
-
this.logger.error("Failed to fetch notification record from template", {
|
|
85
|
+
this.logger.error("Failed to fetch notification record from template", {
|
|
86
|
+
notification,
|
|
87
|
+
});
|
|
82
88
|
throw new Error("Failed to fetch notification record from template");
|
|
83
89
|
}
|
|
84
90
|
this.logger.info("Notification record resolved", { notification_code });
|
|
85
91
|
const content_payload = await this.LoadEmailContentPayload(`${notification_code}_email`);
|
|
86
|
-
const full_payload = {
|
|
92
|
+
const full_payload = {
|
|
93
|
+
static_content: content_payload,
|
|
94
|
+
db_content: data_payload,
|
|
95
|
+
attachments,
|
|
96
|
+
};
|
|
87
97
|
// 4️⃣ Validate
|
|
88
98
|
this.validate(this.provider.getRequiredPlaceholders(template), full_payload);
|
|
89
99
|
// 5️⃣ Resolve mailer config
|
|
@@ -101,13 +111,19 @@ class EmailEnqueueProcessor {
|
|
|
101
111
|
recipient_email,
|
|
102
112
|
payload: full_payload,
|
|
103
113
|
scheduled_at,
|
|
104
|
-
created_by
|
|
114
|
+
created_by,
|
|
105
115
|
});
|
|
106
116
|
if (!queue_entity) {
|
|
107
|
-
this.logger.error("Failed to enqueue email", {
|
|
117
|
+
this.logger.error("Failed to enqueue email", {
|
|
118
|
+
notification_code,
|
|
119
|
+
recipient_email,
|
|
120
|
+
});
|
|
108
121
|
throw new Error("Failed to enqueue email");
|
|
109
122
|
}
|
|
110
|
-
this.logger.info("✅ Email successfully enqueued", {
|
|
123
|
+
this.logger.info("✅ Email successfully enqueued", {
|
|
124
|
+
notification_code,
|
|
125
|
+
recipient_email,
|
|
126
|
+
});
|
|
111
127
|
return queue_entity;
|
|
112
128
|
}
|
|
113
129
|
catch (error) {
|
|
@@ -23,10 +23,10 @@ declare class MailerDataLoaderUtil<TMailerConfig, TBaseTemplate, TNotificationTy
|
|
|
23
23
|
*/
|
|
24
24
|
load(force_refresh?: boolean): Promise<void>;
|
|
25
25
|
/**
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
26
|
+
* ===============================
|
|
27
|
+
* ACCESSORS
|
|
28
|
+
* ===============================
|
|
29
|
+
*/
|
|
30
30
|
private getSnapshot;
|
|
31
31
|
getMailerConfig(): Promise<TMailerConfig | null>;
|
|
32
32
|
getBaseTemplate(): Promise<TBaseTemplate | null>;
|
|
@@ -42,7 +42,7 @@ class MailerDataLoaderUtil {
|
|
|
42
42
|
notification_types,
|
|
43
43
|
email_contents,
|
|
44
44
|
notification_by_code,
|
|
45
|
-
templates_by_notification_code
|
|
45
|
+
templates_by_notification_code,
|
|
46
46
|
};
|
|
47
47
|
}
|
|
48
48
|
// Method to Initialize singleton (MUST be called once)
|
|
@@ -88,10 +88,10 @@ class MailerDataLoaderUtil {
|
|
|
88
88
|
return this.loading_promise;
|
|
89
89
|
}
|
|
90
90
|
/**
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
91
|
+
* ===============================
|
|
92
|
+
* ACCESSORS
|
|
93
|
+
* ===============================
|
|
94
|
+
*/
|
|
95
95
|
async getSnapshot() {
|
|
96
96
|
let snapshot = this.cache.get(this.CACHE_KEY);
|
|
97
97
|
// ✅ If exists → return immediately
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { Model } from "sequelize";
|
|
2
2
|
import { Request, Response, NextFunction, RequestHandler } from "express";
|
|
3
3
|
import { AuthenticatorOptions, DefaultRequestInfo, DefaultAccessTokenPayload, DefaultRefreshTokenPayload } from "../types/middle_ware_type";
|
|
4
|
-
declare class
|
|
4
|
+
declare class AuthenticationMiddleWare<TRequestInfo extends DefaultRequestInfo = DefaultRequestInfo, TAccessPayload extends DefaultAccessTokenPayload = DefaultAccessTokenPayload, TRefreshPayload extends DefaultRefreshTokenPayload = DefaultRefreshTokenPayload, TSessionModel extends Model = Model, TLoginChallengeModel extends Model = Model, TActorModel extends Model = Model> {
|
|
5
5
|
private name;
|
|
6
6
|
private logger;
|
|
7
7
|
private readonly options;
|
|
@@ -14,11 +14,11 @@ declare class AuthenicationMiddleWare<TRequestInfo extends DefaultRequestInfo =
|
|
|
14
14
|
protected loadMemberSession(member_id: number | string, session_id: number | string, request_info?: TRequestInfo, is_2fa_validated?: boolean): Promise<Model | null>;
|
|
15
15
|
protected loadMemberLoginChallenge(member_id: number | string, challenge_id: number | string, request_info?: TRequestInfo, is_2fa_validated?: boolean): Promise<Model | null>;
|
|
16
16
|
protected getActorPermissions(actor_id: number | string, role_ids: (number | string)[]): Promise<string[]>;
|
|
17
|
-
protected validateHasPermission(request_info: TRequestInfo): Promise<boolean>;
|
|
17
|
+
protected validateHasPermission(request_info: TRequestInfo, req?: Request): Promise<boolean>;
|
|
18
18
|
setPermissionName: (permission_name: string) => RequestHandler;
|
|
19
19
|
requireNoAuth(req: Request, res: Response, next: NextFunction): Promise<void | Response>;
|
|
20
20
|
requirePartialAuth(req: Request, res: Response, next: NextFunction): Promise<void | Response>;
|
|
21
21
|
requireFullAuth(req: Request, res: Response, next: NextFunction): Promise<void | Response>;
|
|
22
22
|
requireAppAuthMiddleWareMethod(req: Request, res: Response, next: NextFunction): Promise<void | Response>;
|
|
23
23
|
}
|
|
24
|
-
export default
|
|
24
|
+
export default AuthenticationMiddleWare;
|
|
@@ -10,7 +10,7 @@ var __metadata = (this && this.__metadata) || function (k, v) {
|
|
|
10
10
|
};
|
|
11
11
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
12
|
const main_1 = require("../utils/main");
|
|
13
|
-
class
|
|
13
|
+
class AuthenticationMiddleWare {
|
|
14
14
|
name = "authentication_middle_ware";
|
|
15
15
|
logger = new main_1.LoggerUtil(this.name);
|
|
16
16
|
options;
|
|
@@ -55,10 +55,12 @@ class AuthenicationMiddleWare {
|
|
|
55
55
|
}
|
|
56
56
|
// Method to load member login challenge
|
|
57
57
|
async loadMemberLoginChallenge(member_id, challenge_id, request_info, is_2fa_validated = true) {
|
|
58
|
-
|
|
58
|
+
const load_challenge_method = this.options?.loadMemberLoginChallengeMethod ??
|
|
59
|
+
this.options?.loadMemberLoginChallenegeMethod;
|
|
60
|
+
if (!load_challenge_method) {
|
|
59
61
|
return null;
|
|
60
62
|
}
|
|
61
|
-
return
|
|
63
|
+
return load_challenge_method(member_id, challenge_id, request_info, is_2fa_validated);
|
|
62
64
|
}
|
|
63
65
|
// Method to load member login challenge
|
|
64
66
|
async getActorPermissions(actor_id, role_ids) {
|
|
@@ -68,11 +70,11 @@ class AuthenicationMiddleWare {
|
|
|
68
70
|
return this.options?.getActorPermissionsMethod(actor_id, role_ids);
|
|
69
71
|
}
|
|
70
72
|
// Method to validate refresh token payload
|
|
71
|
-
async validateHasPermission(request_info) {
|
|
73
|
+
async validateHasPermission(request_info, req) {
|
|
72
74
|
if (!this.options?.validateActorHasPermissionMethod) {
|
|
73
75
|
return false;
|
|
74
76
|
}
|
|
75
|
-
return this.options?.validateActorHasPermissionMethod(request_info);
|
|
77
|
+
return this.options?.validateActorHasPermissionMethod(request_info, req);
|
|
76
78
|
}
|
|
77
79
|
// -----------------------------------
|
|
78
80
|
// GENERIC MIDDLEWARES
|
|
@@ -81,8 +83,12 @@ class AuthenicationMiddleWare {
|
|
|
81
83
|
return async (req, res, next) => {
|
|
82
84
|
req.permission_name = permission_name;
|
|
83
85
|
this.logger.info(`[${this.name}] 🔐 Route permission set as ${permission_name} for request ${req.request_id}`);
|
|
84
|
-
const request_info = await this.extractRequestInfo(req) || req;
|
|
85
|
-
|
|
86
|
+
const request_info = (await this.extractRequestInfo(req)) || req;
|
|
87
|
+
if (request_info && typeof request_info === "object") {
|
|
88
|
+
request_info.permission_name =
|
|
89
|
+
permission_name;
|
|
90
|
+
}
|
|
91
|
+
const has_permission = await this.validateHasPermission(request_info, req);
|
|
86
92
|
if (!has_permission) {
|
|
87
93
|
this.logger.info(`[${this.name}] ⛔ Permission denied for request ${req.request_id} with required permission ${permission_name}`);
|
|
88
94
|
return res.errResponse(403, "unauthorized_access_permission");
|
|
@@ -97,99 +103,95 @@ class AuthenicationMiddleWare {
|
|
|
97
103
|
}
|
|
98
104
|
return this.options?.requireNoAuthMiddleWareMethod(req, res, next);
|
|
99
105
|
}
|
|
100
|
-
;
|
|
101
106
|
async requirePartialAuth(req, res, next) {
|
|
102
107
|
if (!this.options?.requirePartialAuthMiddleWareMethod) {
|
|
103
108
|
return next();
|
|
104
109
|
}
|
|
105
110
|
return this.options?.requirePartialAuthMiddleWareMethod(req, res, next);
|
|
106
111
|
}
|
|
107
|
-
;
|
|
108
112
|
async requireFullAuth(req, res, next) {
|
|
109
113
|
if (!this.options?.requireFullAuthMiddleWareMethod) {
|
|
110
114
|
return next();
|
|
111
115
|
}
|
|
112
116
|
return this.options?.requireFullAuthMiddleWareMethod(req, res, next);
|
|
113
117
|
}
|
|
114
|
-
;
|
|
115
118
|
async requireAppAuthMiddleWareMethod(req, res, next) {
|
|
116
119
|
if (!this.options?.requireAppAuthMiddleWareMethod) {
|
|
117
120
|
return next();
|
|
118
121
|
}
|
|
119
122
|
return this.options?.requireAppAuthMiddleWareMethod(req, res, next);
|
|
120
123
|
}
|
|
121
|
-
;
|
|
122
124
|
}
|
|
123
125
|
__decorate([
|
|
124
126
|
main_1.SafeExecuteUtil.safeExecuteReturn("authentication_middle_ware", null),
|
|
125
127
|
__metadata("design:type", Function),
|
|
126
128
|
__metadata("design:paramtypes", [Object]),
|
|
127
129
|
__metadata("design:returntype", Promise)
|
|
128
|
-
],
|
|
130
|
+
], AuthenticationMiddleWare.prototype, "extractRequestInfo", null);
|
|
129
131
|
__decorate([
|
|
130
132
|
main_1.SafeExecuteUtil.safeExecuteReturn("authentication_middle_ware", null),
|
|
131
133
|
__metadata("design:type", Function),
|
|
132
134
|
__metadata("design:paramtypes", [String, Object]),
|
|
133
135
|
__metadata("design:returntype", Promise)
|
|
134
|
-
],
|
|
136
|
+
], AuthenticationMiddleWare.prototype, "validateAccessToken", null);
|
|
135
137
|
__decorate([
|
|
136
138
|
main_1.SafeExecuteUtil.safeExecuteReturn("authentication_middle_ware", null),
|
|
137
139
|
__metadata("design:type", Function),
|
|
138
140
|
__metadata("design:paramtypes", [String, Object]),
|
|
139
141
|
__metadata("design:returntype", Promise)
|
|
140
|
-
],
|
|
142
|
+
], AuthenticationMiddleWare.prototype, "validateRefreshToken", null);
|
|
141
143
|
__decorate([
|
|
142
144
|
main_1.SafeExecuteUtil.safeExecuteReturn("authentication_middle_ware", null),
|
|
143
145
|
__metadata("design:type", Function),
|
|
144
146
|
__metadata("design:paramtypes", [String, Object, Object]),
|
|
145
147
|
__metadata("design:returntype", Promise)
|
|
146
|
-
],
|
|
148
|
+
], AuthenticationMiddleWare.prototype, "LoadActor", null);
|
|
147
149
|
__decorate([
|
|
148
150
|
main_1.SafeExecuteUtil.safeExecuteReturn("authentication_middle_ware", null),
|
|
149
151
|
__metadata("design:type", Function),
|
|
150
152
|
__metadata("design:paramtypes", [Object, Object, Object, Boolean]),
|
|
151
153
|
__metadata("design:returntype", Promise)
|
|
152
|
-
],
|
|
154
|
+
], AuthenticationMiddleWare.prototype, "loadMemberSession", null);
|
|
153
155
|
__decorate([
|
|
154
156
|
main_1.SafeExecuteUtil.safeExecuteReturn("authentication_middle_ware", null),
|
|
155
157
|
__metadata("design:type", Function),
|
|
156
158
|
__metadata("design:paramtypes", [Object, Object, Object, Boolean]),
|
|
157
159
|
__metadata("design:returntype", Promise)
|
|
158
|
-
],
|
|
160
|
+
], AuthenticationMiddleWare.prototype, "loadMemberLoginChallenge", null);
|
|
159
161
|
__decorate([
|
|
160
162
|
main_1.SafeExecuteUtil.safeExecuteReturn("authentication_middle_ware", []),
|
|
161
163
|
__metadata("design:type", Function),
|
|
162
164
|
__metadata("design:paramtypes", [Object, Array]),
|
|
163
165
|
__metadata("design:returntype", Promise)
|
|
164
|
-
],
|
|
166
|
+
], AuthenticationMiddleWare.prototype, "getActorPermissions", null);
|
|
165
167
|
__decorate([
|
|
166
168
|
main_1.SafeExecuteUtil.safeExecuteReturn("authentication_middle_ware", false),
|
|
167
169
|
__metadata("design:type", Function),
|
|
168
|
-
__metadata("design:paramtypes", [Object]),
|
|
170
|
+
__metadata("design:paramtypes", [Object, Object]),
|
|
169
171
|
__metadata("design:returntype", Promise)
|
|
170
|
-
],
|
|
172
|
+
], AuthenticationMiddleWare.prototype, "validateHasPermission", null);
|
|
171
173
|
__decorate([
|
|
172
174
|
main_1.SafeExecuteUtil.safeExecuteThrow("authentication_middle_ware"),
|
|
173
175
|
__metadata("design:type", Function),
|
|
174
176
|
__metadata("design:paramtypes", [Object, Object, Function]),
|
|
175
177
|
__metadata("design:returntype", Promise)
|
|
176
|
-
],
|
|
178
|
+
], AuthenticationMiddleWare.prototype, "requireNoAuth", null);
|
|
177
179
|
__decorate([
|
|
178
180
|
main_1.SafeExecuteUtil.safeExecuteThrow("authentication_middle_ware"),
|
|
179
181
|
__metadata("design:type", Function),
|
|
180
182
|
__metadata("design:paramtypes", [Object, Object, Function]),
|
|
181
183
|
__metadata("design:returntype", Promise)
|
|
182
|
-
],
|
|
184
|
+
], AuthenticationMiddleWare.prototype, "requirePartialAuth", null);
|
|
183
185
|
__decorate([
|
|
184
186
|
main_1.SafeExecuteUtil.safeExecuteThrow("authentication_middle_ware"),
|
|
185
187
|
__metadata("design:type", Function),
|
|
186
188
|
__metadata("design:paramtypes", [Object, Object, Function]),
|
|
187
189
|
__metadata("design:returntype", Promise)
|
|
188
|
-
],
|
|
190
|
+
], AuthenticationMiddleWare.prototype, "requireFullAuth", null);
|
|
189
191
|
__decorate([
|
|
190
192
|
main_1.SafeExecuteUtil.safeExecuteThrow("authentication_middle_ware"),
|
|
191
193
|
__metadata("design:type", Function),
|
|
192
194
|
__metadata("design:paramtypes", [Object, Object, Function]),
|
|
193
195
|
__metadata("design:returntype", Promise)
|
|
194
|
-
],
|
|
195
|
-
exports.default =
|
|
196
|
+
], AuthenticationMiddleWare.prototype, "requireAppAuthMiddleWareMethod", null);
|
|
197
|
+
exports.default = AuthenticationMiddleWare;
|
|
@@ -82,7 +82,7 @@ class CookieManagerMiddleWare {
|
|
|
82
82
|
}
|
|
83
83
|
/** Set cookie with enforced defaults */
|
|
84
84
|
set(res, name, value, options = {}) {
|
|
85
|
-
const cookie_options = { ...this.default_cookie_options, maxAge: options.max_age
|
|
85
|
+
const cookie_options = { ...this.default_cookie_options, maxAge: options.max_age };
|
|
86
86
|
res.cookie(name, value, cookie_options);
|
|
87
87
|
}
|
|
88
88
|
/** Clear cookie */
|
|
@@ -5,5 +5,6 @@ import HTTPSEnforcementMiddleWare from "./https_enforcement_middle_ware";
|
|
|
5
5
|
import SecureHeadersMiddleWare from "./secure_headers_middle_ware";
|
|
6
6
|
import RequestLoggerMiddleWare from "./request_logger_middle_ware";
|
|
7
7
|
import ResponseFormatterMiddleWare from "./response_formatter_middle_ware";
|
|
8
|
-
import
|
|
9
|
-
|
|
8
|
+
import AuthenticationMiddleWare from "./authentication_middle_ware";
|
|
9
|
+
declare const AuthenicationMiddleWare: typeof AuthenticationMiddleWare;
|
|
10
|
+
export { CookieManagerMiddleWare, CorsMiddleWare, RateLimiterMiddleWare, HTTPSEnforcementMiddleWare, SecureHeadersMiddleWare, RequestLoggerMiddleWare, ResponseFormatterMiddleWare, AuthenticationMiddleWare, AuthenicationMiddleWare, };
|
package/dist/middle_ware/main.js
CHANGED
|
@@ -3,7 +3,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
3
3
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
4
|
};
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
-
exports.AuthenicationMiddleWare = exports.ResponseFormatterMiddleWare = exports.RequestLoggerMiddleWare = exports.SecureHeadersMiddleWare = exports.HTTPSEnforcementMiddleWare = exports.RateLimiterMiddleWare = exports.CorsMiddleWare = exports.CookieManagerMiddleWare = void 0;
|
|
6
|
+
exports.AuthenicationMiddleWare = exports.AuthenticationMiddleWare = exports.ResponseFormatterMiddleWare = exports.RequestLoggerMiddleWare = exports.SecureHeadersMiddleWare = exports.HTTPSEnforcementMiddleWare = exports.RateLimiterMiddleWare = exports.CorsMiddleWare = exports.CookieManagerMiddleWare = void 0;
|
|
7
7
|
const cookie_manager_middle_ware_1 = __importDefault(require("./cookie_manager_middle_ware"));
|
|
8
8
|
exports.CookieManagerMiddleWare = cookie_manager_middle_ware_1.default;
|
|
9
9
|
const cors_middle_ware_1 = __importDefault(require("./cors_middle_ware"));
|
|
@@ -19,4 +19,6 @@ exports.RequestLoggerMiddleWare = request_logger_middle_ware_1.default;
|
|
|
19
19
|
const response_formatter_middle_ware_1 = __importDefault(require("./response_formatter_middle_ware"));
|
|
20
20
|
exports.ResponseFormatterMiddleWare = response_formatter_middle_ware_1.default;
|
|
21
21
|
const authentication_middle_ware_1 = __importDefault(require("./authentication_middle_ware"));
|
|
22
|
-
exports.
|
|
22
|
+
exports.AuthenticationMiddleWare = authentication_middle_ware_1.default;
|
|
23
|
+
const AuthenicationMiddleWare = authentication_middle_ware_1.default;
|
|
24
|
+
exports.AuthenicationMiddleWare = AuthenicationMiddleWare;
|
|
@@ -20,7 +20,8 @@ class RequestLoggerMiddleWare {
|
|
|
20
20
|
// Middleware
|
|
21
21
|
// -------------------------
|
|
22
22
|
async middleWare(req, res, next) {
|
|
23
|
-
const origin = req.headers.origin ||
|
|
23
|
+
const origin = req.headers.origin ||
|
|
24
|
+
(req.headers.referer ? new URL(req.headers.referer).origin : "unknown");
|
|
24
25
|
const device_id = req.cookies?.device_id || req.headers["x-device-id"] || "unknown";
|
|
25
26
|
const device_name = req.headers["x-device-name"] || "unknown";
|
|
26
27
|
const user_agent = req.headers["user-agent"] || "unknown";
|
|
@@ -13,7 +13,6 @@ const main_1 = require("../utils/main");
|
|
|
13
13
|
class ResponseFormatterMiddleWare {
|
|
14
14
|
name = "response_formatter_middle_ware";
|
|
15
15
|
logger = new main_1.LoggerUtil(this.name);
|
|
16
|
-
;
|
|
17
16
|
include_request_id;
|
|
18
17
|
default_success_message;
|
|
19
18
|
default_error_message;
|
|
@@ -24,7 +23,8 @@ class ResponseFormatterMiddleWare {
|
|
|
24
23
|
this.default_success_message = options.default_success_message ?? "operation_successful";
|
|
25
24
|
this.default_error_message = options.default_error_message ?? "server_error";
|
|
26
25
|
this.default_info_message = options.default_info_message ?? "operation_information";
|
|
27
|
-
this.default_not_found_message =
|
|
26
|
+
this.default_not_found_message =
|
|
27
|
+
options.default_not_found_message ?? "invalid_request_resource_not_found";
|
|
28
28
|
main_1.SafeExecuteUtil.setNamedInstance(this.name, this);
|
|
29
29
|
}
|
|
30
30
|
// Method to handle 404 error
|
|
@@ -42,9 +42,10 @@ class ResponseFormatterMiddleWare {
|
|
|
42
42
|
res.locals.message = error_message;
|
|
43
43
|
res.locals.error = is_development ? error : {};
|
|
44
44
|
this.logger.error(`[${this.name}] Unhandled error for request ${request_id} Message ${error_message}`, { error_stack, error });
|
|
45
|
-
return res
|
|
45
|
+
return res
|
|
46
|
+
.status(500)
|
|
47
|
+
.json({ status: "error", code: 500, msg: this.default_error_message });
|
|
46
48
|
}
|
|
47
|
-
;
|
|
48
49
|
// -------------------------
|
|
49
50
|
// Middleware
|
|
50
51
|
// -------------------------
|
|
@@ -35,7 +35,8 @@ class SecureHeadersMiddleWare {
|
|
|
35
35
|
this.xss_protection = options.xss_protection ?? true;
|
|
36
36
|
this.content_type_options = options.content_type_options ?? true;
|
|
37
37
|
this.referrer_policy = options.referrer_policy ?? "no-referrer-when-downgrade";
|
|
38
|
-
this.content_security_policy =
|
|
38
|
+
this.content_security_policy =
|
|
39
|
+
options.content_security_policy ?? this.getDefaultContentSecurityPolicy();
|
|
39
40
|
this.cors_policy = options.cors_policy ?? "same-origin";
|
|
40
41
|
this.cors_opener_policy = options.cors_opener_policy ?? "same-origin";
|
|
41
42
|
this.headers_key_name = options.headers_key_name ?? constants_1.HEADERS_KEY_NAME;
|
|
@@ -101,7 +101,7 @@ class RBACLoaderUtil {
|
|
|
101
101
|
role_by_id,
|
|
102
102
|
role_by_symbol,
|
|
103
103
|
permission_by_id,
|
|
104
|
-
permissions_by_role_id
|
|
104
|
+
permissions_by_role_id,
|
|
105
105
|
};
|
|
106
106
|
}
|
|
107
107
|
/**
|
|
@@ -137,7 +137,7 @@ class RBACLoaderUtil {
|
|
|
137
137
|
}
|
|
138
138
|
async roleHasPermission(role_id, permission_key) {
|
|
139
139
|
const snapshot = await this.getSnapshot();
|
|
140
|
-
return
|
|
140
|
+
return snapshot.permissions_by_role_id.get(role_id)?.has(permission_key) ?? false;
|
|
141
141
|
}
|
|
142
142
|
async refresh() {
|
|
143
143
|
await this.load(true);
|
|
@@ -14,7 +14,7 @@ class GCSStorageDriver extends base_storage_driver_1.default {
|
|
|
14
14
|
}
|
|
15
15
|
const storage = new storage_1.Storage({
|
|
16
16
|
projectId: config.project_id,
|
|
17
|
-
credentials: config.credentials
|
|
17
|
+
credentials: config.credentials,
|
|
18
18
|
});
|
|
19
19
|
this.bucket_name = config.bucket_name;
|
|
20
20
|
this.bucket = storage.bucket(config.bucket_name);
|
|
@@ -32,7 +32,7 @@ class GCSStorageDriver extends base_storage_driver_1.default {
|
|
|
32
32
|
const bucket = this.getBucket();
|
|
33
33
|
const file_ref = bucket.file(key);
|
|
34
34
|
await file_ref.save(file, {
|
|
35
|
-
contentType: mime_type
|
|
35
|
+
contentType: mime_type,
|
|
36
36
|
});
|
|
37
37
|
if (is_public) {
|
|
38
38
|
await file_ref.makePublic();
|
|
@@ -41,7 +41,7 @@ class GCSStorageDriver extends base_storage_driver_1.default {
|
|
|
41
41
|
key,
|
|
42
42
|
url: this.getPublicUrl(key),
|
|
43
43
|
mime_type,
|
|
44
|
-
size: file.length
|
|
44
|
+
size: file.length,
|
|
45
45
|
};
|
|
46
46
|
}
|
|
47
47
|
getPublicUrl(key) {
|
|
@@ -62,7 +62,7 @@ class GCSStorageDriver extends base_storage_driver_1.default {
|
|
|
62
62
|
return null;
|
|
63
63
|
return {
|
|
64
64
|
key,
|
|
65
|
-
url: this.getPublicUrl(key)
|
|
65
|
+
url: this.getPublicUrl(key),
|
|
66
66
|
};
|
|
67
67
|
}
|
|
68
68
|
async list(prefix = "") {
|
|
@@ -70,7 +70,7 @@ class GCSStorageDriver extends base_storage_driver_1.default {
|
|
|
70
70
|
const [files] = await bucket.getFiles({ prefix });
|
|
71
71
|
return files.map((f) => ({
|
|
72
72
|
key: f.name,
|
|
73
|
-
url: this.getPublicUrl(f.name)
|
|
73
|
+
url: this.getPublicUrl(f.name),
|
|
74
74
|
}));
|
|
75
75
|
}
|
|
76
76
|
}
|
|
@@ -25,7 +25,7 @@ class LocalStorageDriver extends base_storage_driver_1.default {
|
|
|
25
25
|
key,
|
|
26
26
|
url: this.getPublicUrl(key),
|
|
27
27
|
mime_type,
|
|
28
|
-
size: file.length
|
|
28
|
+
size: file.length,
|
|
29
29
|
};
|
|
30
30
|
}
|
|
31
31
|
async exists(key) {
|
|
@@ -46,7 +46,7 @@ class LocalStorageDriver extends base_storage_driver_1.default {
|
|
|
46
46
|
return null;
|
|
47
47
|
return {
|
|
48
48
|
key,
|
|
49
|
-
url: this.getPublicUrl(key)
|
|
49
|
+
url: this.getPublicUrl(key),
|
|
50
50
|
};
|
|
51
51
|
}
|
|
52
52
|
async delete(key) {
|
package/dist/storage/main.d.ts
CHANGED
|
@@ -3,4 +3,4 @@ import GCSStorageDriver from "./drivers/gcs_storage_driver";
|
|
|
3
3
|
import LocalStorageDriver from "./drivers/local_storage_driver";
|
|
4
4
|
import FileUploadProcessor from "./processors/file_upload_processor";
|
|
5
5
|
import StorageDriverUtil from "./utils/storage_driver_util";
|
|
6
|
-
export { BaseStorageDriver, GCSStorageDriver, LocalStorageDriver, FileUploadProcessor, StorageDriverUtil };
|
|
6
|
+
export { BaseStorageDriver, GCSStorageDriver, LocalStorageDriver, FileUploadProcessor, StorageDriverUtil, };
|
|
@@ -70,12 +70,12 @@ class FileUploadProcessor {
|
|
|
70
70
|
size: input.size,
|
|
71
71
|
url: stored.url,
|
|
72
72
|
provider: this.driver.constructor.name,
|
|
73
|
-
bucket_name: this.driver?.bucket_name || null
|
|
73
|
+
bucket_name: this.driver?.bucket_name || null,
|
|
74
74
|
};
|
|
75
75
|
this.logger.info("File uploaded successfully", {
|
|
76
76
|
key,
|
|
77
77
|
category,
|
|
78
|
-
size: input.size
|
|
78
|
+
size: input.size,
|
|
79
79
|
});
|
|
80
80
|
return { status: true, msg: "file_uploaded_successfully", data: result };
|
|
81
81
|
}
|
|
@@ -85,8 +85,8 @@ class FileUploadProcessor {
|
|
|
85
85
|
input_meta: {
|
|
86
86
|
name: input.original_name,
|
|
87
87
|
size: input.size,
|
|
88
|
-
mime: input.mime_type
|
|
89
|
-
}
|
|
88
|
+
mime: input.mime_type,
|
|
89
|
+
},
|
|
90
90
|
});
|
|
91
91
|
return { status: false, msg: "file_upload_error_occured" };
|
|
92
92
|
}
|
|
@@ -2,7 +2,7 @@ import BaseStorageDriver from "../../storage/drivers/base_storage_driver";
|
|
|
2
2
|
declare class StorageDriverUtil {
|
|
3
3
|
private static instance;
|
|
4
4
|
private static logger;
|
|
5
|
-
private static env_manager;
|
|
5
|
+
private static get env_manager();
|
|
6
6
|
/**
|
|
7
7
|
* Get initialized storage driver (singleton)
|
|
8
8
|
*/
|