vr-commons 1.0.99 → 1.0.100

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.
@@ -0,0 +1,3 @@
1
+ import { Request, Response, NextFunction } from "express";
2
+ import { UserRole } from "vr-models";
3
+ export declare const checkAdminAuthentication: (allowedRoles: UserRole[]) => (req: Request, res: Response, next: NextFunction) => Promise<void>;
@@ -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 response_utils_1 = require("../../utils/response.utils");
10
+ const checkAdminAuthentication = (allowedRoles) => async (req, res, next) => {
11
+ try {
12
+ const token = req.cookies?.access_token;
13
+ if (!token) {
14
+ return (0, response_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, response_utils_1.sendErrorResponse)(res, "Session expired. Please login again.", 401);
23
+ }
24
+ return (0, response_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, response_utils_1.sendErrorResponse)(res, "User not found", 400);
37
+ }
38
+ // 🔐 Token versioning
39
+ if (user.tokenVersion !== payload.tokenVersion) {
40
+ return (0, response_utils_1.sendErrorResponse)(res, "Session expired", 401);
41
+ }
42
+ // 🧱 Role enforcement
43
+ if (!allowedRoles.includes(user.securityClearance.role)) {
44
+ return (0, response_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;
@@ -0,0 +1 @@
1
+ export { checkAdminAuthentication } from "./auth.admin.middlewares";
@@ -0,0 +1,5 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.checkAdminAuthentication = void 0;
4
+ var auth_admin_middlewares_1 = require("./auth.admin.middlewares");
5
+ Object.defineProperty(exports, "checkAdminAuthentication", { enumerable: true, get: function () { return auth_admin_middlewares_1.checkAdminAuthentication; } });
@@ -1,2 +1,3 @@
1
- export { checkUserAuthentication, checkAdminAuthentication, } from "./auth.middlewares";
2
- export { checkUserAccountStatus, checkIsUserBanned, checkIsUserSuspended, } from "./account.middlewares";
1
+ export * from "./admin";
2
+ export * from "./shared";
3
+ export * from "./users";
@@ -1,10 +1,19 @@
1
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 __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
2
16
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.checkIsUserSuspended = exports.checkIsUserBanned = exports.checkUserAccountStatus = exports.checkAdminAuthentication = exports.checkUserAuthentication = void 0;
4
- var auth_middlewares_1 = require("./auth.middlewares");
5
- Object.defineProperty(exports, "checkUserAuthentication", { enumerable: true, get: function () { return auth_middlewares_1.checkUserAuthentication; } });
6
- Object.defineProperty(exports, "checkAdminAuthentication", { enumerable: true, get: function () { return auth_middlewares_1.checkAdminAuthentication; } });
7
- var account_middlewares_1 = require("./account.middlewares");
8
- Object.defineProperty(exports, "checkUserAccountStatus", { enumerable: true, get: function () { return account_middlewares_1.checkUserAccountStatus; } });
9
- Object.defineProperty(exports, "checkIsUserBanned", { enumerable: true, get: function () { return account_middlewares_1.checkIsUserBanned; } });
10
- Object.defineProperty(exports, "checkIsUserSuspended", { enumerable: true, get: function () { return account_middlewares_1.checkIsUserSuspended; } });
17
+ __exportStar(require("./admin"), exports);
18
+ __exportStar(require("./shared"), exports);
19
+ __exportStar(require("./users"), exports);
@@ -0,0 +1,4 @@
1
+ import { Request, Response, NextFunction } from "express";
2
+ export declare function checkIsUserBanned(req: Request, res: Response, next: NextFunction): Promise<void>;
3
+ export declare function checkIsUserSuspended(req: Request, res: Response, next: NextFunction): Promise<void>;
4
+ export declare function checkUserAccountStatus(req: Request, res: Response, next: NextFunction): Promise<void>;
@@ -0,0 +1,64 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.checkIsUserBanned = checkIsUserBanned;
4
+ exports.checkIsUserSuspended = checkIsUserSuspended;
5
+ exports.checkUserAccountStatus = checkUserAccountStatus;
6
+ const account_utils_1 = require("../../utils/account.utils");
7
+ const response_utils_1 = require("../../utils/response.utils");
8
+ // Check if user is banned
9
+ async function checkIsUserBanned(req, res, next) {
10
+ try {
11
+ const userId = req.userId;
12
+ if (!userId) {
13
+ return next();
14
+ }
15
+ const { isBanned, banDetails } = await (0, account_utils_1.checkBanStatus)(userId);
16
+ if (isBanned && banDetails && !banDetails.revokedAt) {
17
+ const message = banDetails.isPermanent
18
+ ? "Your account has been permanently banned"
19
+ : `Your account was banned at: ${banDetails.bannedAt.toISOString()}`;
20
+ return (0, response_utils_1.sendErrorResponse)(res, message, 403, banDetails);
21
+ }
22
+ next();
23
+ }
24
+ catch (error) {
25
+ next(error);
26
+ }
27
+ }
28
+ // Check if user is suspended
29
+ async function checkIsUserSuspended(req, res, next) {
30
+ try {
31
+ const userId = req.userId;
32
+ if (!userId) {
33
+ return next();
34
+ }
35
+ const { isSuspended, suspensionDetails } = await (0, account_utils_1.checkSuspensionStatus)(userId);
36
+ if (isSuspended && suspensionDetails) {
37
+ const daysRemaining = Math.ceil((new Date(suspensionDetails.endsAt).getTime() - new Date().getTime()) /
38
+ (1000 * 60 * 60 * 24));
39
+ const message = `Your account is suspended for ${daysRemaining} more day(s) until ${suspensionDetails.endsAt.toISOString()}`;
40
+ return (0, response_utils_1.sendErrorResponse)(res, message, 403, suspensionDetails);
41
+ }
42
+ next();
43
+ }
44
+ catch (error) {
45
+ next(error);
46
+ }
47
+ }
48
+ // Combined check for both ban and suspension
49
+ async function checkUserAccountStatus(req, res, next) {
50
+ try {
51
+ const userId = req.userId;
52
+ if (!userId) {
53
+ return next();
54
+ }
55
+ const result = await (0, account_utils_1.checkIsUserBannedOrSuspended)(userId);
56
+ if (result.isRestricted) {
57
+ return (0, response_utils_1.sendErrorResponse)(res, result.message, 403, result.details);
58
+ }
59
+ next();
60
+ }
61
+ catch (error) {
62
+ next(error);
63
+ }
64
+ }
@@ -0,0 +1 @@
1
+ export { checkIsUserBanned, checkIsUserSuspended, checkUserAccountStatus, } from "./account.shared.middlewares";
@@ -0,0 +1,7 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.checkUserAccountStatus = exports.checkIsUserSuspended = exports.checkIsUserBanned = void 0;
4
+ var account_shared_middlewares_1 = require("./account.shared.middlewares");
5
+ Object.defineProperty(exports, "checkIsUserBanned", { enumerable: true, get: function () { return account_shared_middlewares_1.checkIsUserBanned; } });
6
+ Object.defineProperty(exports, "checkIsUserSuspended", { enumerable: true, get: function () { return account_shared_middlewares_1.checkIsUserSuspended; } });
7
+ Object.defineProperty(exports, "checkUserAccountStatus", { enumerable: true, get: function () { return account_shared_middlewares_1.checkUserAccountStatus; } });
@@ -0,0 +1,4 @@
1
+ import { Request, Response, NextFunction } from "express";
2
+ import { UserRole } from "vr-models";
3
+ export declare const checkUserAuthentication: (allowedRoles: UserRole[]) => (req: Request, res: Response, next: NextFunction) => Promise<void>;
4
+ export declare const checkAdminAuthentication: (allowedRoles: UserRole[]) => (req: Request, res: Response, next: NextFunction) => Promise<void>;
@@ -0,0 +1,131 @@
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 = exports.checkUserAuthentication = void 0;
7
+ const jsonwebtoken_1 = __importDefault(require("jsonwebtoken"));
8
+ const vr_models_1 = require("vr-models");
9
+ const response_utils_1 = require("../../utils/response.utils");
10
+ const authTokens_utils_1 = require("../../utils/authTokens.utils");
11
+ const checkUserAuthentication = (allowedRoles) => async (req, res, next) => {
12
+ try {
13
+ const authHeader = req.headers.authorization;
14
+ if (!authHeader || !authHeader.startsWith("Bearer ")) {
15
+ return (0, response_utils_1.sendErrorResponse)(res, "Missing or invalid token", 401);
16
+ }
17
+ const token = authHeader.split(" ")[1];
18
+ let payload;
19
+ try {
20
+ payload = jsonwebtoken_1.default.verify(token, process.env.JWT_SECRET);
21
+ }
22
+ catch (error) {
23
+ if (error instanceof jsonwebtoken_1.default.TokenExpiredError) {
24
+ return (0, response_utils_1.sendErrorResponse)(res, "Token expired. Please re-verify your phone.", 401);
25
+ }
26
+ return (0, response_utils_1.sendErrorResponse)(res, "Token invalid", 401);
27
+ }
28
+ const user = await vr_models_1.User.findOne({
29
+ where: { id: payload.userId },
30
+ include: [
31
+ {
32
+ model: vr_models_1.SecurityClearance,
33
+ as: "securityClearance",
34
+ },
35
+ ],
36
+ });
37
+ // Check if user exists
38
+ if (!user || !user.securityClearance) {
39
+ return (0, response_utils_1.sendErrorResponse)(res, "User not found", 400);
40
+ }
41
+ // 🔐 Token versioning (logout all devices)
42
+ if (user.tokenVersion !== payload.tokenVersion) {
43
+ return (0, response_utils_1.sendErrorResponse)(res, "Session expired. Please re-verify your phone.", 401);
44
+ }
45
+ // 🧱 Role enforcement
46
+ if (!allowedRoles.includes(user.securityClearance.role)) {
47
+ return (0, response_utils_1.sendErrorResponse)(res, "Access denied", 403);
48
+ }
49
+ // ✅ Extend req with user info
50
+ req.userId = user.id;
51
+ req.firstName = user.firstName;
52
+ req.lastName = user.lastName;
53
+ req.scRole = user.securityClearance.role;
54
+ req.scLevel = user.securityClearance.level;
55
+ req.tokenVersion = user.tokenVersion;
56
+ // Optional: Add sessionId if present in payload (for backward compatibility)
57
+ if (payload.sessionId) {
58
+ req.sessionId = payload.sessionId;
59
+ }
60
+ // 🔄 Auto-refresh token if it's about to expire (within 5 days)
61
+ if ((0, authTokens_utils_1.shouldRefreshToken)(token)) {
62
+ const newToken = (0, authTokens_utils_1.generateToken)(user.id, user.securityClearance.role, user.securityClearance.level, user.tokenVersion, payload.sessionId, // Preserve sessionId if exists
63
+ user.securityClearance.role === "ADMIN"
64
+ ? "ADMIN"
65
+ : user.securityClearance.role === "RIDER"
66
+ ? "RIDER"
67
+ : "PASSENGER");
68
+ // Set new token in response header for client to update
69
+ res.setHeader("X-New-Token", newToken);
70
+ res.setHeader("X-Token-Refreshed", "true");
71
+ console.log(`🔄 Auto-refreshed token for user ${user.id}`);
72
+ }
73
+ next();
74
+ }
75
+ catch (error) {
76
+ console.error("Authentication error:", error);
77
+ next(error);
78
+ }
79
+ };
80
+ exports.checkUserAuthentication = checkUserAuthentication;
81
+ const checkAdminAuthentication = (allowedRoles) => async (req, res, next) => {
82
+ try {
83
+ const token = req.cookies?.access_token;
84
+ if (!token) {
85
+ return (0, response_utils_1.sendErrorResponse)(res, "Authentication required", 401);
86
+ }
87
+ let payload;
88
+ try {
89
+ payload = jsonwebtoken_1.default.verify(token, process.env.JWT_SECRET);
90
+ }
91
+ catch (error) {
92
+ if (error instanceof jsonwebtoken_1.default.TokenExpiredError) {
93
+ return (0, response_utils_1.sendErrorResponse)(res, "Session expired. Please login again.", 401);
94
+ }
95
+ return (0, response_utils_1.sendErrorResponse)(res, "Invalid session", 401);
96
+ }
97
+ const user = await vr_models_1.User.findOne({
98
+ where: { id: payload.userId },
99
+ include: [
100
+ {
101
+ model: vr_models_1.SecurityClearance,
102
+ as: "securityClearance",
103
+ },
104
+ ],
105
+ });
106
+ if (!user || !user.securityClearance) {
107
+ return (0, response_utils_1.sendErrorResponse)(res, "User not found", 400);
108
+ }
109
+ // 🔐 Token versioning
110
+ if (user.tokenVersion !== payload.tokenVersion) {
111
+ return (0, response_utils_1.sendErrorResponse)(res, "Session expired", 401);
112
+ }
113
+ // 🧱 Role enforcement
114
+ if (!allowedRoles.includes(user.securityClearance.role)) {
115
+ return (0, response_utils_1.sendErrorResponse)(res, "Access denied", 403);
116
+ }
117
+ // Attach user to request (same as before)
118
+ req.userId = user.id;
119
+ req.firstName = user.firstName;
120
+ req.lastName = user.lastName;
121
+ req.scRole = user.securityClearance.role;
122
+ req.scLevel = user.securityClearance.level;
123
+ req.tokenVersion = user.tokenVersion;
124
+ next();
125
+ }
126
+ catch (error) {
127
+ console.error("Authentication error:", error);
128
+ next(error);
129
+ }
130
+ };
131
+ exports.checkAdminAuthentication = checkAdminAuthentication;
@@ -0,0 +1 @@
1
+ export { checkUserAuthentication } from "./auth.users.middlewares";
@@ -0,0 +1,5 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.checkUserAuthentication = void 0;
4
+ var auth_users_middlewares_1 = require("./auth.users.middlewares");
5
+ Object.defineProperty(exports, "checkUserAuthentication", { enumerable: true, get: function () { return auth_users_middlewares_1.checkUserAuthentication; } });
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "vr-commons",
3
- "version": "1.0.99",
3
+ "version": "1.0.100",
4
4
  "description": "Shared functions package",
5
5
  "main": "./dist/index.js",
6
6
  "types": "./dist/index.d.ts",