vr-commons 1.0.176 → 1.0.177
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/dist/constants/regex.constants.d.ts +19 -0
- package/dist/constants/regex.constants.js +24 -0
- package/dist/index.d.ts +0 -1
- package/dist/index.js +0 -3
- package/dist/middlewares/admin/admin.auth.middleware.js +60 -0
- package/dist/middlewares/index.d.ts +4 -5
- package/dist/middlewares/index.js +11 -14
- package/dist/middlewares/shared/auth.admin.middlewares.d.ts +3 -0
- package/dist/middlewares/{auth.admin.middlewares.js → shared/auth.admin.middlewares.js} +7 -7
- package/dist/middlewares/{account.shared.middlewares.js → shared/shared.account.middleware.js} +8 -8
- package/dist/middlewares/{errorHandler.middleware.js → shared/shared.errorHandler.middleware.js} +0 -1
- package/dist/middlewares/{auth.users.middlewares.js → users/users.auth.middleware.js} +10 -10
- package/dist/utils/{admin.devicePayment.utils.js → admin/admin.devicePayments.utils.js} +0 -1
- package/dist/utils/{admin.device.utils.d.ts → admin/admin.devices.utils.d.ts} +1 -1
- package/dist/utils/{admin.device.utils.js → admin/admin.devices.utils.js} +11 -12
- package/dist/utils/{eventlogs.admin.utils.js → admin/admin.eventLogs.utils.js} +0 -1
- package/dist/utils/{hierarchy.utils.js → admin/admin.hierarchy.utils.js} +0 -2
- package/dist/utils/{product.utils.d.ts → admin/admin.products.utils.d.ts} +1 -1
- package/dist/utils/{systemLog.utils.js → admin/admin.systemLogs.utils.js} +0 -1
- package/dist/utils/index.d.ts +16 -18
- package/dist/utils/index.js +88 -99
- package/dist/utils/{account.utils.js → shared/shared.accounts.utils.js} +0 -1
- package/dist/utils/{profiles.utils.d.ts → shared/shared.profiles.utils.d.ts} +2 -1
- package/dist/utils/{profiles.utils.js → shared/shared.profiles.utils.js} +3 -2
- package/dist/utils/{verification.utils.d.ts → users/users.verification.utils.d.ts} +1 -1
- package/dist/utils/{verification.utils.js → users/users.verification.utils.js} +3 -2
- package/dist/validations/{admin.devicePayment.validations.js → admin/admin.devicePayments.validations.js} +3 -2
- package/dist/validations/{admin.devices.validations.js → admin/admin.devices.validations.js} +4 -5
- package/dist/validations/{eventlogs.admin.validations.js → admin/admin.eventLogs.validations.js} +2 -2
- package/dist/validations/{admin.installment.validations.js → admin/admin.installments.validations.js} +4 -3
- package/dist/validations/{pricings.validations.js → admin/admin.pricings.validations.js} +5 -5
- package/dist/validations/{product.validations.js → admin/admin.products.validations.js} +4 -3
- package/dist/validations/{users.admin.validations.js → admin/admin.users.validations.js} +13 -13
- package/dist/validations/index.d.ts +16 -15
- package/dist/validations/index.js +132 -125
- package/dist/validations/{account.validations.js → shared/shared.account.validations.js} +7 -7
- package/dist/validations/{appSpecs.validations.js → shared/shared.appSpecs.validations.js} +0 -1
- package/dist/validations/{auth.validations.js → shared/shared.auth.validations.js} +6 -6
- package/dist/validations/{dateRange.validations.js → shared/shared.dateRanges.validations.js} +5 -5
- package/dist/validations/{moderation.validations.js → shared/shared.moderation.validations.js} +24 -25
- package/dist/validations/{profiles.validations.js → shared/shared.profiles.validations.js} +22 -21
- package/dist/validations/{devices.validations.js → users/users.devices.validations.js} +2 -1
- package/package.json +1 -1
- package/dist/middlewares/idempotency.middlewares.d.ts +0 -3
- package/dist/middlewares/idempotency.middlewares.js +0 -74
- package/dist/utils/deviceUtils.d.ts +0 -2
- package/dist/utils/deviceUtils.js +0 -21
- package/dist/utils/session.utils.d.ts +0 -6
- package/dist/utils/session.utils.js +0 -25
- package/dist/validations/appeals.validations.d.ts +0 -61
- package/dist/validations/appeals.validations.js +0 -31
- package/dist/validations/payinstallment.validations.d.ts +0 -56
- package/dist/validations/payinstallment.validations.js +0 -23
- package/dist/validations/pricing.validations.d.ts +0 -313
- package/dist/validations/pricing.validations.js +0 -376
- /package/dist/middlewares/{auth.admin.middlewares.d.ts → admin/admin.auth.middleware.d.ts} +0 -0
- /package/dist/middlewares/{account.shared.middlewares.d.ts → shared/shared.account.middleware.d.ts} +0 -0
- /package/dist/middlewares/{errorHandler.middleware.d.ts → shared/shared.errorHandler.middleware.d.ts} +0 -0
- /package/dist/middlewares/{auth.users.middlewares.d.ts → users/users.auth.middleware.d.ts} +0 -0
- /package/dist/utils/{bans.utils.d.ts → admin/admin.bans.utils.d.ts} +0 -0
- /package/dist/utils/{bans.utils.js → admin/admin.bans.utils.js} +0 -0
- /package/dist/utils/{admin.devicePayment.utils.d.ts → admin/admin.devicePayments.utils.d.ts} +0 -0
- /package/dist/utils/{eventlogs.admin.utils.d.ts → admin/admin.eventLogs.utils.d.ts} +0 -0
- /package/dist/utils/{hierarchy.utils.d.ts → admin/admin.hierarchy.utils.d.ts} +0 -0
- /package/dist/utils/{moderation.utils.d.ts → admin/admin.moderation.utils.d.ts} +0 -0
- /package/dist/utils/{moderation.utils.js → admin/admin.moderation.utils.js} +0 -0
- /package/dist/utils/{product.utils.js → admin/admin.products.utils.js} +0 -0
- /package/dist/utils/{suspension.utils.d.ts → admin/admin.suspensions.utils.d.ts} +0 -0
- /package/dist/utils/{suspension.utils.js → admin/admin.suspensions.utils.js} +0 -0
- /package/dist/utils/{systemLog.utils.d.ts → admin/admin.systemLogs.utils.d.ts} +0 -0
- /package/dist/utils/{account.utils.d.ts → shared/shared.accounts.utils.d.ts} +0 -0
- /package/dist/utils/{authTokens.utils.d.ts → shared/shared.authTokens.utils.d.ts} +0 -0
- /package/dist/utils/{authTokens.utils.js → shared/shared.authTokens.utils.js} +0 -0
- /package/dist/utils/{eventLog.utils.d.ts → shared/shared.eventLogs.utils.d.ts} +0 -0
- /package/dist/utils/{eventLog.utils.js → shared/shared.eventLogs.utils.js} +0 -0
- /package/dist/utils/{response.utils.d.ts → shared/shared.responses.utils.d.ts} +0 -0
- /package/dist/utils/{response.utils.js → shared/shared.responses.utils.js} +0 -0
- /package/dist/utils/{types.d.ts → shared/shared.types.d.ts} +0 -0
- /package/dist/utils/{types.js → shared/shared.types.js} +0 -0
- /package/dist/validations/{bans.validations.d.ts → admin/admin.bans.validations.d.ts} +0 -0
- /package/dist/validations/{bans.validations.js → admin/admin.bans.validations.js} +0 -0
- /package/dist/validations/{admin.devicePayment.validations.d.ts → admin/admin.devicePayments.validations.d.ts} +0 -0
- /package/dist/validations/{admin.devices.validations.d.ts → admin/admin.devices.validations.d.ts} +0 -0
- /package/dist/validations/{eventlogs.admin.validations.d.ts → admin/admin.eventLogs.validations.d.ts} +0 -0
- /package/dist/validations/{admin.installment.validations.d.ts → admin/admin.installments.validations.d.ts} +0 -0
- /package/dist/validations/{pricings.validations.d.ts → admin/admin.pricings.validations.d.ts} +0 -0
- /package/dist/validations/{product.validations.d.ts → admin/admin.products.validations.d.ts} +0 -0
- /package/dist/validations/{suspensions.validations.d.ts → admin/admin.suspensions.validations.d.ts} +0 -0
- /package/dist/validations/{suspensions.validations.js → admin/admin.suspensions.validations.js} +0 -0
- /package/dist/validations/{users.admin.validations.d.ts → admin/admin.users.validations.d.ts} +0 -0
- /package/dist/validations/{account.validations.d.ts → shared/shared.account.validations.d.ts} +0 -0
- /package/dist/validations/{appSpecs.validations.d.ts → shared/shared.appSpecs.validations.d.ts} +0 -0
- /package/dist/validations/{auth.validations.d.ts → shared/shared.auth.validations.d.ts} +0 -0
- /package/dist/validations/{dateRange.validations.d.ts → shared/shared.dateRanges.validations.d.ts} +0 -0
- /package/dist/validations/{moderation.validations.d.ts → shared/shared.moderation.validations.d.ts} +0 -0
- /package/dist/validations/{profiles.validations.d.ts → shared/shared.profiles.validations.d.ts} +0 -0
- /package/dist/validations/{validate.validations.d.ts → shared/shared.validate.validations.d.ts} +0 -0
- /package/dist/validations/{validate.validations.js → shared/shared.validate.validations.js} +0 -0
- /package/dist/validations/{devicePaymentPlan.validations.d.ts → users/users.devicePaymentPlans.validations.d.ts} +0 -0
- /package/dist/validations/{devicePaymentPlan.validations.js → users/users.devicePaymentPlans.validations.js} +0 -0
- /package/dist/validations/{devices.validations.d.ts → users/users.devices.validations.d.ts} +0 -0
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/** Shared regular expressions used across validation and utility modules. */
|
|
2
|
+
export declare const PHONE_NUMBER_REGEX: RegExp;
|
|
3
|
+
export declare const LOCAL_RWANDA_PHONE_NUMBER_REGEX: RegExp;
|
|
4
|
+
export declare const EMAIL_ADDRESS_REGEX: RegExp;
|
|
5
|
+
export declare const PASSWORD_REGEX: RegExp;
|
|
6
|
+
export declare const STRONG_PASSWORD_REGEX: RegExp;
|
|
7
|
+
export declare const RIDER_PIN_REGEX: RegExp;
|
|
8
|
+
export declare const FOUR_DIGIT_PIN_REGEX: RegExp;
|
|
9
|
+
export declare const JACKET_ID_REGEX: RegExp;
|
|
10
|
+
export declare const PLATE_NUMBER_REGEX: RegExp;
|
|
11
|
+
export declare const RWANDA_PLATE_NUMBER_REGEX: RegExp;
|
|
12
|
+
export declare const DEVICE_SERIAL_NUMBER_REGEX: RegExp;
|
|
13
|
+
export declare const DEVICE_PAIR_ID_REGEX: RegExp;
|
|
14
|
+
export declare const ISO_DATE_REGEX: RegExp;
|
|
15
|
+
export declare const DAY_MONTH_YEAR_REGEX: RegExp;
|
|
16
|
+
export declare const DAY_MONTH_YEAR_SLASH_REGEX: RegExp;
|
|
17
|
+
export declare const ISO_DATE_SLASH_REGEX: RegExp;
|
|
18
|
+
export declare const NUMERIC_STRING_REGEX: RegExp;
|
|
19
|
+
export declare const BEARER_TOKEN_PREFIX_REGEX: RegExp;
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.BEARER_TOKEN_PREFIX_REGEX = exports.NUMERIC_STRING_REGEX = exports.ISO_DATE_SLASH_REGEX = exports.DAY_MONTH_YEAR_SLASH_REGEX = exports.DAY_MONTH_YEAR_REGEX = exports.ISO_DATE_REGEX = exports.DEVICE_PAIR_ID_REGEX = exports.DEVICE_SERIAL_NUMBER_REGEX = exports.RWANDA_PLATE_NUMBER_REGEX = exports.PLATE_NUMBER_REGEX = exports.JACKET_ID_REGEX = exports.FOUR_DIGIT_PIN_REGEX = exports.RIDER_PIN_REGEX = exports.STRONG_PASSWORD_REGEX = exports.PASSWORD_REGEX = exports.EMAIL_ADDRESS_REGEX = exports.LOCAL_RWANDA_PHONE_NUMBER_REGEX = exports.PHONE_NUMBER_REGEX = void 0;
|
|
4
|
+
/** Shared regular expressions used across validation and utility modules. */
|
|
5
|
+
exports.PHONE_NUMBER_REGEX = /^\+250(78|79|73|72)[0-9]{7}$/;
|
|
6
|
+
exports.LOCAL_RWANDA_PHONE_NUMBER_REGEX = /^(078|079|072|073)\d{7}$/;
|
|
7
|
+
exports.EMAIL_ADDRESS_REGEX = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
|
|
8
|
+
exports.PASSWORD_REGEX = /^(?=.*[A-Za-z])(?=.*\d)[A-Za-z\d]{6,}$/;
|
|
9
|
+
exports.STRONG_PASSWORD_REGEX = /^(?=.*[A-Z])(?=.*\d)(?=.*[@$!%*?&#^()_\-+=])[A-Za-z\d@$!%*?&#^()_\-+=]{8,}$/;
|
|
10
|
+
exports.RIDER_PIN_REGEX = /^(?!(\d)\1{3})\d{4}$/;
|
|
11
|
+
exports.FOUR_DIGIT_PIN_REGEX = /^\d{4}$/;
|
|
12
|
+
exports.JACKET_ID_REGEX = /^JKT-\d{9}$/;
|
|
13
|
+
// These two existing rules express different accepted formats. Keep both
|
|
14
|
+
// centralized until the product requirements choose one canonical plate format.
|
|
15
|
+
exports.PLATE_NUMBER_REGEX = /^[A-Z0-9]{3,10}$/i;
|
|
16
|
+
exports.RWANDA_PLATE_NUMBER_REGEX = /^R[ABCDEFGHIJKLMNPQRSTUVWXYZ]\s?\d{3}\s?[ABCDEFGHIJKLMNPQRSTUVWXYZ]$/;
|
|
17
|
+
exports.DEVICE_SERIAL_NUMBER_REGEX = /^(VBRD|VIBERIDE)-(PASSENGER|RIDER)-([A-Z]{2}\d{3}[A-Z])$/;
|
|
18
|
+
exports.DEVICE_PAIR_ID_REGEX = /^[A-NP-Z]{2}[0-9]{3}[A-NP-Z]{1}$/;
|
|
19
|
+
exports.ISO_DATE_REGEX = /^\d{4}-\d{2}-\d{2}$/;
|
|
20
|
+
exports.DAY_MONTH_YEAR_REGEX = /^\d{2}-\d{2}-\d{4}$/;
|
|
21
|
+
exports.DAY_MONTH_YEAR_SLASH_REGEX = /^\d{2}\/\d{2}\/\d{4}$/;
|
|
22
|
+
exports.ISO_DATE_SLASH_REGEX = /^\d{4}\/\d{2}\/\d{2}$/;
|
|
23
|
+
exports.NUMERIC_STRING_REGEX = /^\d+$/;
|
|
24
|
+
exports.BEARER_TOKEN_PREFIX_REGEX = /^Bearer /;
|
package/dist/index.d.ts
CHANGED
package/dist/index.js
CHANGED
|
@@ -14,10 +14,7 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
|
14
14
|
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
15
|
};
|
|
16
16
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
-
exports.validate = void 0;
|
|
18
17
|
// Core Functionality
|
|
19
18
|
__exportStar(require("./middlewares"), exports);
|
|
20
19
|
__exportStar(require("./validations"), exports);
|
|
21
20
|
__exportStar(require("./utils"), exports);
|
|
22
|
-
var validate_validations_1 = require("./validations/validate.validations");
|
|
23
|
-
Object.defineProperty(exports, "validate", { enumerable: true, get: function () { return validate_validations_1.validate; } });
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.checkAdminAuthentication = void 0;
|
|
7
|
+
const jsonwebtoken_1 = __importDefault(require("jsonwebtoken"));
|
|
8
|
+
const vr_models_1 = require("vr-models");
|
|
9
|
+
const shared_responses_utils_1 = require("../../utils/shared/shared.responses.utils");
|
|
10
|
+
const checkAdminAuthentication = (allowedRoles) => async (req, res, next) => {
|
|
11
|
+
try {
|
|
12
|
+
const token = req.cookies?.access_token;
|
|
13
|
+
if (!token) {
|
|
14
|
+
return (0, shared_responses_utils_1.sendErrorResponse)(res, "Authentication required", 401);
|
|
15
|
+
}
|
|
16
|
+
let payload;
|
|
17
|
+
try {
|
|
18
|
+
payload = jsonwebtoken_1.default.verify(token, process.env.JWT_SECRET);
|
|
19
|
+
}
|
|
20
|
+
catch (error) {
|
|
21
|
+
if (error instanceof jsonwebtoken_1.default.TokenExpiredError) {
|
|
22
|
+
return (0, shared_responses_utils_1.sendErrorResponse)(res, "Session expired. Please login again.", 401);
|
|
23
|
+
}
|
|
24
|
+
return (0, shared_responses_utils_1.sendErrorResponse)(res, "Invalid session", 401);
|
|
25
|
+
}
|
|
26
|
+
const user = await vr_models_1.User.findOne({
|
|
27
|
+
where: { id: payload.userId },
|
|
28
|
+
include: [
|
|
29
|
+
{
|
|
30
|
+
model: vr_models_1.SecurityClearance,
|
|
31
|
+
as: "securityClearance",
|
|
32
|
+
},
|
|
33
|
+
],
|
|
34
|
+
});
|
|
35
|
+
if (!user || !user.securityClearance) {
|
|
36
|
+
return (0, shared_responses_utils_1.sendErrorResponse)(res, "User not found", 400);
|
|
37
|
+
}
|
|
38
|
+
// 🔐 Token versioning
|
|
39
|
+
if (user.tokenVersion !== payload.tokenVersion) {
|
|
40
|
+
return (0, shared_responses_utils_1.sendErrorResponse)(res, "Session expired", 401);
|
|
41
|
+
}
|
|
42
|
+
// 🧱 Role enforcement
|
|
43
|
+
if (!allowedRoles.includes(user.securityClearance.role)) {
|
|
44
|
+
return (0, shared_responses_utils_1.sendErrorResponse)(res, "Access denied", 403);
|
|
45
|
+
}
|
|
46
|
+
// Attach user to request (same as before)
|
|
47
|
+
req.userId = user.id;
|
|
48
|
+
req.firstName = user.firstName;
|
|
49
|
+
req.lastName = user.lastName;
|
|
50
|
+
req.scRole = user.securityClearance.role;
|
|
51
|
+
req.scLevel = user.securityClearance.level;
|
|
52
|
+
req.tokenVersion = user.tokenVersion;
|
|
53
|
+
next();
|
|
54
|
+
}
|
|
55
|
+
catch (error) {
|
|
56
|
+
console.error("Authentication error:", error);
|
|
57
|
+
next(error);
|
|
58
|
+
}
|
|
59
|
+
};
|
|
60
|
+
exports.checkAdminAuthentication = checkAdminAuthentication;
|
|
@@ -1,5 +1,4 @@
|
|
|
1
|
-
export { checkAdminAuthentication } from "./auth.
|
|
2
|
-
export { checkUserAuthentication } from "./auth.
|
|
3
|
-
export { checkIsUserBanned, checkIsUserSuspended, checkUserAccountStatus, } from "./account.
|
|
4
|
-
export {
|
|
5
|
-
export { errorHandler } from "./errorHandler.middleware";
|
|
1
|
+
export { checkAdminAuthentication } from "./admin/admin.auth.middleware";
|
|
2
|
+
export { checkUserAuthentication } from "./users/users.auth.middleware";
|
|
3
|
+
export { checkIsUserBanned, checkIsUserSuspended, checkUserAccountStatus, } from "./shared/shared.account.middleware";
|
|
4
|
+
export { errorHandler } from "./shared/shared.errorHandler.middleware";
|
|
@@ -1,16 +1,13 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.errorHandler = exports.
|
|
4
|
-
var
|
|
5
|
-
Object.defineProperty(exports, "checkAdminAuthentication", { enumerable: true, get: function () { return
|
|
6
|
-
var
|
|
7
|
-
Object.defineProperty(exports, "checkUserAuthentication", { enumerable: true, get: function () { return
|
|
8
|
-
var
|
|
9
|
-
Object.defineProperty(exports, "checkIsUserBanned", { enumerable: true, get: function () { return
|
|
10
|
-
Object.defineProperty(exports, "checkIsUserSuspended", { enumerable: true, get: function () { return
|
|
11
|
-
Object.defineProperty(exports, "checkUserAccountStatus", { enumerable: true, get: function () { return
|
|
12
|
-
var
|
|
13
|
-
Object.defineProperty(exports, "
|
|
14
|
-
Object.defineProperty(exports, "storeIdempotencyResponse", { enumerable: true, get: function () { return idempotency_middlewares_1.storeIdempotencyResponse; } });
|
|
15
|
-
var errorHandler_middleware_1 = require("./errorHandler.middleware");
|
|
16
|
-
Object.defineProperty(exports, "errorHandler", { enumerable: true, get: function () { return errorHandler_middleware_1.errorHandler; } });
|
|
3
|
+
exports.errorHandler = exports.checkUserAccountStatus = exports.checkIsUserSuspended = exports.checkIsUserBanned = exports.checkUserAuthentication = exports.checkAdminAuthentication = void 0;
|
|
4
|
+
var admin_auth_middleware_1 = require("./admin/admin.auth.middleware");
|
|
5
|
+
Object.defineProperty(exports, "checkAdminAuthentication", { enumerable: true, get: function () { return admin_auth_middleware_1.checkAdminAuthentication; } });
|
|
6
|
+
var users_auth_middleware_1 = require("./users/users.auth.middleware");
|
|
7
|
+
Object.defineProperty(exports, "checkUserAuthentication", { enumerable: true, get: function () { return users_auth_middleware_1.checkUserAuthentication; } });
|
|
8
|
+
var shared_account_middleware_1 = require("./shared/shared.account.middleware");
|
|
9
|
+
Object.defineProperty(exports, "checkIsUserBanned", { enumerable: true, get: function () { return shared_account_middleware_1.checkIsUserBanned; } });
|
|
10
|
+
Object.defineProperty(exports, "checkIsUserSuspended", { enumerable: true, get: function () { return shared_account_middleware_1.checkIsUserSuspended; } });
|
|
11
|
+
Object.defineProperty(exports, "checkUserAccountStatus", { enumerable: true, get: function () { return shared_account_middleware_1.checkUserAccountStatus; } });
|
|
12
|
+
var shared_errorHandler_middleware_1 = require("./shared/shared.errorHandler.middleware");
|
|
13
|
+
Object.defineProperty(exports, "errorHandler", { enumerable: true, get: function () { return shared_errorHandler_middleware_1.errorHandler; } });
|
|
@@ -6,12 +6,12 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
6
6
|
exports.checkAdminAuthentication = void 0;
|
|
7
7
|
const jsonwebtoken_1 = __importDefault(require("jsonwebtoken"));
|
|
8
8
|
const vr_models_1 = require("vr-models");
|
|
9
|
-
const
|
|
9
|
+
const shared_responses_utils_1 = require("../../utils/shared/shared.responses.utils");
|
|
10
10
|
const checkAdminAuthentication = (allowedRoles) => async (req, res, next) => {
|
|
11
11
|
try {
|
|
12
12
|
const token = req.cookies?.access_token;
|
|
13
13
|
if (!token) {
|
|
14
|
-
return (0,
|
|
14
|
+
return (0, shared_responses_utils_1.sendErrorResponse)(res, "Authentication required", 401);
|
|
15
15
|
}
|
|
16
16
|
let payload;
|
|
17
17
|
try {
|
|
@@ -19,9 +19,9 @@ const checkAdminAuthentication = (allowedRoles) => async (req, res, next) => {
|
|
|
19
19
|
}
|
|
20
20
|
catch (error) {
|
|
21
21
|
if (error instanceof jsonwebtoken_1.default.TokenExpiredError) {
|
|
22
|
-
return (0,
|
|
22
|
+
return (0, shared_responses_utils_1.sendErrorResponse)(res, "Session expired. Please login again.", 401);
|
|
23
23
|
}
|
|
24
|
-
return (0,
|
|
24
|
+
return (0, shared_responses_utils_1.sendErrorResponse)(res, "Invalid session", 401);
|
|
25
25
|
}
|
|
26
26
|
const user = await vr_models_1.User.findOne({
|
|
27
27
|
where: { id: payload.userId },
|
|
@@ -33,15 +33,15 @@ const checkAdminAuthentication = (allowedRoles) => async (req, res, next) => {
|
|
|
33
33
|
],
|
|
34
34
|
});
|
|
35
35
|
if (!user || !user.securityClearance) {
|
|
36
|
-
return (0,
|
|
36
|
+
return (0, shared_responses_utils_1.sendErrorResponse)(res, "User not found", 400);
|
|
37
37
|
}
|
|
38
38
|
// 🔐 Token versioning
|
|
39
39
|
if (user.tokenVersion !== payload.tokenVersion) {
|
|
40
|
-
return (0,
|
|
40
|
+
return (0, shared_responses_utils_1.sendErrorResponse)(res, "Session expired", 401);
|
|
41
41
|
}
|
|
42
42
|
// 🧱 Role enforcement
|
|
43
43
|
if (!allowedRoles.includes(user.securityClearance.role)) {
|
|
44
|
-
return (0,
|
|
44
|
+
return (0, shared_responses_utils_1.sendErrorResponse)(res, "Access denied", 403);
|
|
45
45
|
}
|
|
46
46
|
// Attach user to request (same as before)
|
|
47
47
|
req.userId = user.id;
|
package/dist/middlewares/{account.shared.middlewares.js → shared/shared.account.middleware.js}
RENAMED
|
@@ -3,8 +3,8 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
exports.checkIsUserBanned = checkIsUserBanned;
|
|
4
4
|
exports.checkIsUserSuspended = checkIsUserSuspended;
|
|
5
5
|
exports.checkUserAccountStatus = checkUserAccountStatus;
|
|
6
|
-
const
|
|
7
|
-
const
|
|
6
|
+
const shared_accounts_utils_1 = require("../../utils/shared/shared.accounts.utils");
|
|
7
|
+
const shared_responses_utils_1 = require("../../utils/shared/shared.responses.utils");
|
|
8
8
|
// Check if user is banned
|
|
9
9
|
async function checkIsUserBanned(req, res, next) {
|
|
10
10
|
try {
|
|
@@ -12,12 +12,12 @@ async function checkIsUserBanned(req, res, next) {
|
|
|
12
12
|
if (!userId) {
|
|
13
13
|
return next();
|
|
14
14
|
}
|
|
15
|
-
const { isBanned, banDetails } = await (0,
|
|
15
|
+
const { isBanned, banDetails } = await (0, shared_accounts_utils_1.checkBanStatus)(userId);
|
|
16
16
|
if (isBanned && banDetails && !banDetails.revokedAt) {
|
|
17
17
|
const message = banDetails.isPermanent
|
|
18
18
|
? "Your account has been permanently banned"
|
|
19
19
|
: `Your account was banned at: ${banDetails.bannedAt.toISOString()}`;
|
|
20
|
-
return (0,
|
|
20
|
+
return (0, shared_responses_utils_1.sendErrorResponse)(res, message, 403, banDetails);
|
|
21
21
|
}
|
|
22
22
|
next();
|
|
23
23
|
}
|
|
@@ -32,12 +32,12 @@ async function checkIsUserSuspended(req, res, next) {
|
|
|
32
32
|
if (!userId) {
|
|
33
33
|
return next();
|
|
34
34
|
}
|
|
35
|
-
const { isSuspended, suspensionDetails } = await (0,
|
|
35
|
+
const { isSuspended, suspensionDetails } = await (0, shared_accounts_utils_1.checkSuspensionStatus)(userId);
|
|
36
36
|
if (isSuspended && suspensionDetails) {
|
|
37
37
|
const daysRemaining = Math.ceil((new Date(suspensionDetails.endsAt).getTime() - new Date().getTime()) /
|
|
38
38
|
(1000 * 60 * 60 * 24));
|
|
39
39
|
const message = `Your account is suspended for ${daysRemaining} more day(s) until ${suspensionDetails.endsAt.toISOString()}`;
|
|
40
|
-
return (0,
|
|
40
|
+
return (0, shared_responses_utils_1.sendErrorResponse)(res, message, 403, suspensionDetails);
|
|
41
41
|
}
|
|
42
42
|
next();
|
|
43
43
|
}
|
|
@@ -52,9 +52,9 @@ async function checkUserAccountStatus(req, res, next) {
|
|
|
52
52
|
if (!userId) {
|
|
53
53
|
return next();
|
|
54
54
|
}
|
|
55
|
-
const result = await (0,
|
|
55
|
+
const result = await (0, shared_accounts_utils_1.checkIsUserBannedOrSuspended)(userId);
|
|
56
56
|
if (result.isRestricted) {
|
|
57
|
-
return (0,
|
|
57
|
+
return (0, shared_responses_utils_1.sendErrorResponse)(res, result.message, 403, result.details);
|
|
58
58
|
}
|
|
59
59
|
next();
|
|
60
60
|
}
|
|
@@ -6,13 +6,13 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
6
6
|
exports.checkUserAuthentication = void 0;
|
|
7
7
|
const jsonwebtoken_1 = __importDefault(require("jsonwebtoken"));
|
|
8
8
|
const vr_models_1 = require("vr-models");
|
|
9
|
-
const
|
|
10
|
-
const
|
|
9
|
+
const shared_responses_utils_1 = require("../../utils/shared/shared.responses.utils");
|
|
10
|
+
const shared_authTokens_utils_1 = require("../../utils/shared/shared.authTokens.utils");
|
|
11
11
|
const checkUserAuthentication = (allowedRoles) => async (req, res, next) => {
|
|
12
12
|
try {
|
|
13
13
|
const authHeader = req.headers.authorization;
|
|
14
14
|
if (!authHeader || !authHeader.startsWith("Bearer ")) {
|
|
15
|
-
return (0,
|
|
15
|
+
return (0, shared_responses_utils_1.sendErrorResponse)(res, "Missing or invalid token", 401);
|
|
16
16
|
}
|
|
17
17
|
const token = authHeader.split(" ")[1];
|
|
18
18
|
let payload;
|
|
@@ -21,9 +21,9 @@ const checkUserAuthentication = (allowedRoles) => async (req, res, next) => {
|
|
|
21
21
|
}
|
|
22
22
|
catch (error) {
|
|
23
23
|
if (error instanceof jsonwebtoken_1.default.TokenExpiredError) {
|
|
24
|
-
return (0,
|
|
24
|
+
return (0, shared_responses_utils_1.sendErrorResponse)(res, "Token expired. Please re-verify your Email/Phone", 401);
|
|
25
25
|
}
|
|
26
|
-
return (0,
|
|
26
|
+
return (0, shared_responses_utils_1.sendErrorResponse)(res, "Token invalid", 401);
|
|
27
27
|
}
|
|
28
28
|
const user = await vr_models_1.User.findOne({
|
|
29
29
|
where: { id: payload.userId },
|
|
@@ -36,15 +36,15 @@ const checkUserAuthentication = (allowedRoles) => async (req, res, next) => {
|
|
|
36
36
|
});
|
|
37
37
|
// Check if user exists
|
|
38
38
|
if (!user || !user.securityClearance) {
|
|
39
|
-
return (0,
|
|
39
|
+
return (0, shared_responses_utils_1.sendErrorResponse)(res, "User not found", 400);
|
|
40
40
|
}
|
|
41
41
|
// 🔐 Token versioning (logout all devices)
|
|
42
42
|
if (user.tokenVersion !== payload.tokenVersion) {
|
|
43
|
-
return (0,
|
|
43
|
+
return (0, shared_responses_utils_1.sendErrorResponse)(res, "Session expired. Please re-verify your Email/Phone", 401);
|
|
44
44
|
}
|
|
45
45
|
// 🧱 Role enforcement
|
|
46
46
|
if (!allowedRoles.includes(user.securityClearance.role)) {
|
|
47
|
-
return (0,
|
|
47
|
+
return (0, shared_responses_utils_1.sendErrorResponse)(res, "Access denied", 403);
|
|
48
48
|
}
|
|
49
49
|
// ✅ Extend req with user info
|
|
50
50
|
req.userId = user.id;
|
|
@@ -58,8 +58,8 @@ const checkUserAuthentication = (allowedRoles) => async (req, res, next) => {
|
|
|
58
58
|
req.sessionId = payload.sessionId;
|
|
59
59
|
}
|
|
60
60
|
// 🔄 Auto-refresh token if it's about to expire (within 5 days)
|
|
61
|
-
if ((0,
|
|
62
|
-
const newToken = (0,
|
|
61
|
+
if ((0, shared_authTokens_utils_1.shouldRefreshToken)(token)) {
|
|
62
|
+
const newToken = (0, shared_authTokens_utils_1.generateToken)(user.id, user.securityClearance.role, user.securityClearance.level, user.tokenVersion, payload.sessionId, // Preserve sessionId if exists
|
|
63
63
|
user.securityClearance.role === "ADMIN"
|
|
64
64
|
? "ADMIN"
|
|
65
65
|
: user.securityClearance.role === "RIDER"
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { Device, UserRole } from "vr-models";
|
|
2
2
|
import { Transaction } from "sequelize";
|
|
3
|
-
import { DeviceResetOptions, DeviceResetResult, StockChangeResult } from "
|
|
3
|
+
import { DeviceResetOptions, DeviceResetResult, StockChangeResult } from "../shared/shared.types";
|
|
4
4
|
export declare const stockUtil: {
|
|
5
5
|
/**
|
|
6
6
|
* Increment stock when devices are added/created
|
|
@@ -1,12 +1,11 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.stockUtil = void 0;
|
|
4
|
-
// src/utils/stock.util.ts
|
|
5
4
|
const vr_models_1 = require("vr-models");
|
|
6
5
|
const sequelize_1 = require("sequelize");
|
|
7
|
-
const
|
|
8
|
-
const admin_devices_validations_1 = require("
|
|
9
|
-
const
|
|
6
|
+
const shared_eventLogs_utils_1 = require("../shared/shared.eventLogs.utils");
|
|
7
|
+
const admin_devices_validations_1 = require("../../validations/admin/admin.devices.validations");
|
|
8
|
+
const admin_systemLogs_utils_1 = require("./admin.systemLogs.utils");
|
|
10
9
|
const isValidUUID = (str) => {
|
|
11
10
|
const uuidRegex = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;
|
|
12
11
|
return uuidRegex.test(str);
|
|
@@ -192,7 +191,7 @@ exports.stockUtil = {
|
|
|
192
191
|
}
|
|
193
192
|
// Log stock change
|
|
194
193
|
if (options?.actorId) {
|
|
195
|
-
await (0,
|
|
194
|
+
await (0, shared_eventLogs_utils_1.logEvent)({
|
|
196
195
|
actorId: options.actorId,
|
|
197
196
|
actorType: options.actorType,
|
|
198
197
|
action: "PRODUCT_STOCK_INCREMENTED",
|
|
@@ -241,7 +240,7 @@ exports.stockUtil = {
|
|
|
241
240
|
}
|
|
242
241
|
// Log stock change
|
|
243
242
|
if (options?.actorId) {
|
|
244
|
-
await (0,
|
|
243
|
+
await (0, shared_eventLogs_utils_1.logEvent)({
|
|
245
244
|
actorId: options.actorId,
|
|
246
245
|
actorType: options.actorType,
|
|
247
246
|
action: "PRODUCT_STOCK_DECREMENTED",
|
|
@@ -283,7 +282,7 @@ exports.stockUtil = {
|
|
|
283
282
|
await product.save({ transaction: options?.transaction });
|
|
284
283
|
// Log stock change
|
|
285
284
|
if (options?.actorId) {
|
|
286
|
-
await (0,
|
|
285
|
+
await (0, shared_eventLogs_utils_1.logEvent)({
|
|
287
286
|
actorId: options.actorId,
|
|
288
287
|
actorType: options.actorType,
|
|
289
288
|
action: "PRODUCT_STOCK_SET_MANUALLY",
|
|
@@ -627,7 +626,7 @@ exports.stockUtil = {
|
|
|
627
626
|
console.log(`📋 WHERE: ${whereClause}`);
|
|
628
627
|
console.log(`📝 SET: ${setClause}`);
|
|
629
628
|
// Log start - SystemLog only
|
|
630
|
-
await (0,
|
|
629
|
+
await (0, admin_systemLogs_utils_1.logInfo)(`Reset device pairs job started`, {
|
|
631
630
|
category: isSystem ? "CRONJOB" : "DEVICE",
|
|
632
631
|
source: isSystem ? "device-reset.cronjob" : "device-reset.manual",
|
|
633
632
|
details: { triggeredBy, batchSize, maxRetries, condition, update },
|
|
@@ -735,7 +734,7 @@ exports.stockUtil = {
|
|
|
735
734
|
};
|
|
736
735
|
console.log(`✅ Reset device pairs completed:`, result);
|
|
737
736
|
// Log completion - SystemLog only
|
|
738
|
-
await (0,
|
|
737
|
+
await (0, admin_systemLogs_utils_1.logInfo)(`Reset device pairs job completed`, {
|
|
739
738
|
category: isSystem ? "CRONJOB" : "DEVICE",
|
|
740
739
|
source: isSystem ? "device-reset.cronjob" : "device-reset.manual",
|
|
741
740
|
details: {
|
|
@@ -747,7 +746,7 @@ exports.stockUtil = {
|
|
|
747
746
|
},
|
|
748
747
|
});
|
|
749
748
|
if (result.errors.length > 0) {
|
|
750
|
-
await (0,
|
|
749
|
+
await (0, admin_systemLogs_utils_1.logError)(`Reset device pairs had ${result.errors.length} failures`, {
|
|
751
750
|
category: isSystem ? "CRONJOB" : "DEVICE",
|
|
752
751
|
source: isSystem ? "device-reset.cronjob" : "device-reset.manual",
|
|
753
752
|
details: {
|
|
@@ -758,7 +757,7 @@ exports.stockUtil = {
|
|
|
758
757
|
}
|
|
759
758
|
// Log EventLog ONLY for user-triggered actions
|
|
760
759
|
if (!isSystem && actorId && isValidUUID(actorId)) {
|
|
761
|
-
await (0,
|
|
760
|
+
await (0, shared_eventLogs_utils_1.logEvent)({
|
|
762
761
|
actorId: actorId,
|
|
763
762
|
actorType: actorRole,
|
|
764
763
|
action: "DEVICES_UPDATED",
|
|
@@ -804,7 +803,7 @@ exports.stockUtil = {
|
|
|
804
803
|
pairsProcessed: 0,
|
|
805
804
|
message: `Reset device pairs job failed: ${errorMessage}`,
|
|
806
805
|
};
|
|
807
|
-
await (0,
|
|
806
|
+
await (0, admin_systemLogs_utils_1.logError)(`Reset device pairs job failed`, {
|
|
808
807
|
category: isSystem ? "CRONJOB" : "DEVICE",
|
|
809
808
|
source: isSystem ? "device-reset.cronjob" : "device-reset.manual",
|
|
810
809
|
details: { error: errorMessage },
|
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.buildUserSearchConditions = exports.buildSearchConditions = exports.buildEventLogWhereClause = exports.formatEventLogs = exports.formatEventLog = exports.formatDeviceSession = void 0;
|
|
4
|
-
// src/modules/event-logs/utils/eventLogs.utils.ts
|
|
5
4
|
const sequelize_1 = require("sequelize");
|
|
6
5
|
/**
|
|
7
6
|
* Format device session for response
|
|
@@ -8,7 +8,6 @@ exports.isRankEqual = isRankEqual;
|
|
|
8
8
|
exports.isSubordinateOrEqual = isSubordinateOrEqual;
|
|
9
9
|
exports.isSuperiorOrEqual = isSuperiorOrEqual;
|
|
10
10
|
exports.validateHierarchy = validateHierarchy;
|
|
11
|
-
// src/utils/hierarchy.utils.ts
|
|
12
11
|
const vr_models_1 = require("vr-models");
|
|
13
12
|
/**
|
|
14
13
|
* Get user's security clearance level
|
|
@@ -93,7 +92,6 @@ function validateHierarchy(adminLevel, targetLevel, action, allowEqual = false)
|
|
|
93
92
|
}
|
|
94
93
|
return { allowed: false, message: `Cannot ${action} this user` };
|
|
95
94
|
}
|
|
96
|
-
// src/utils/hierarchical.util.ts
|
|
97
95
|
/**
|
|
98
96
|
* Filter users based on hierarchical permissions using security clearance levels
|
|
99
97
|
* Pure function - no database calls
|
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.logDebug = exports.logInfo = exports.logWarning = exports.logError = exports.logSystem = void 0;
|
|
4
|
-
// src/utils/systemLog.utils.ts
|
|
5
4
|
const vr_models_1 = require("vr-models");
|
|
6
5
|
const logSystem = async ({ level = "INFO", category = "SYSTEM", message, details = null, source = null, ipAddress = null, userAgent = null, timestamp, transaction, }) => {
|
|
7
6
|
try {
|
package/dist/utils/index.d.ts
CHANGED
|
@@ -1,18 +1,16 @@
|
|
|
1
|
-
export { checkAccountDependencies, hasActiveDependencies, checkBanStatus, checkIsUserBannedOrSuspended, checkSuspensionStatus, } from "./
|
|
2
|
-
export { generateAdminToken, generatePassengerToken, generateRiderToken, verifyToken, JWTPayload, shouldRefreshToken, generateToken, getTokenTimeRemaining, formatTimeRemaining, } from "./authTokens.utils";
|
|
3
|
-
export { logEvent } from "./
|
|
4
|
-
export { sendSuccessResponse, sendErrorResponse } from "./
|
|
5
|
-
export { formatUserProfile, formatUserListResponse, hasRole, hasPermission, hasAnyPermission, hasAllPermissions, canModifyAccount, isAccountAccessible, getUserById, getUsersByRole, findSecurityClearanceByRole, generateUserSearchConditions, generateEventSearchConditions, getSortOrder, generateJacketId, validateUniqueFields, validatePassword, hashPassword, softDeleteUser, } from "./profiles.utils";
|
|
6
|
-
export { canModerate, canModerateUser, getModeratableRoles, hasHigherAuthority, } from "./moderation.utils";
|
|
7
|
-
export { banUtil } from "./bans.utils";
|
|
8
|
-
export { suspensionUtil } from "./
|
|
9
|
-
export {
|
|
10
|
-
export {
|
|
11
|
-
export {
|
|
12
|
-
export {
|
|
13
|
-
export {
|
|
14
|
-
export {
|
|
15
|
-
export {
|
|
16
|
-
export {
|
|
17
|
-
export { extractDedicatedUserFromSerial } from "./deviceUtils";
|
|
18
|
-
export { logDebug, logError, logInfo, logSystem, logWarning, } from "./systemLog.utils";
|
|
1
|
+
export { checkAccountDependencies, hasActiveDependencies, checkBanStatus, checkIsUserBannedOrSuspended, checkSuspensionStatus, } from "./shared/shared.accounts.utils";
|
|
2
|
+
export { generateAdminToken, generatePassengerToken, generateRiderToken, verifyToken, JWTPayload, shouldRefreshToken, generateToken, getTokenTimeRemaining, formatTimeRemaining, } from "./shared/shared.authTokens.utils";
|
|
3
|
+
export { logEvent } from "./shared/shared.eventLogs.utils";
|
|
4
|
+
export { sendSuccessResponse, sendErrorResponse } from "./shared/shared.responses.utils";
|
|
5
|
+
export { formatUserProfile, formatUserListResponse, hasRole, hasPermission, hasAnyPermission, hasAllPermissions, canModifyAccount, isAccountAccessible, getUserById, getUsersByRole, findSecurityClearanceByRole, generateUserSearchConditions, generateEventSearchConditions, getSortOrder, generateJacketId, validateUniqueFields, validatePassword, hashPassword, softDeleteUser, } from "./shared/shared.profiles.utils";
|
|
6
|
+
export { canModerate, canModerateUser, getModeratableRoles, hasHigherAuthority, } from "./admin/admin.moderation.utils";
|
|
7
|
+
export { banUtil } from "./admin/admin.bans.utils";
|
|
8
|
+
export { suspensionUtil } from "./admin/admin.suspensions.utils";
|
|
9
|
+
export { getUserLevel, isRankEqual, isSubordinate, isSubordinateOrEqual, isSuperior, isSuperiorOrEqual, validateHierarchy, hierarchicalView, } from "./admin/admin.hierarchy.utils";
|
|
10
|
+
export { stockUtil } from "./admin/admin.devices.utils";
|
|
11
|
+
export { cloudinaryUtil } from "./admin/admin.products.utils";
|
|
12
|
+
export { DPP_OperationsUtil } from "./admin/admin.devicePayments.utils";
|
|
13
|
+
export { formatDeviceSession, formatEventLog, formatEventLogs, buildEventLogWhereClause, buildSearchConditions, buildUserSearchConditions, } from "./admin/admin.eventLogs.utils";
|
|
14
|
+
export { logDebug, logError, logInfo, logSystem, logWarning, } from "./admin/admin.systemLogs.utils";
|
|
15
|
+
export { generateOTP, getOTPExpiry, getVerificationMethod, sendEmail, sendSMS, sendVerificationCode, detectContactType, validateContactValue, } from "./users/users.verification.utils";
|
|
16
|
+
export { PendingRegistration, VerificationMethod, ConfirmResponse, UploadResult, StockChangeResult, DeviceResetResult, DeviceResetOptions, } from "./shared/shared.types";
|