@discover-cloud/shared 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/context/access-context.d.ts +10 -0
- package/dist/context/access-context.js +2 -0
- package/dist/context/index.d.ts +1 -0
- package/dist/context/index.js +17 -0
- package/dist/dto/auth-service.dtos.d.ts +51 -0
- package/dist/dto/auth-service.dtos.js +2 -0
- package/dist/dto/index.d.ts +3 -0
- package/dist/dto/index.js +19 -0
- package/dist/dto/response.dtos.d.ts +48 -0
- package/dist/dto/response.dtos.js +2 -0
- package/dist/dto/user-service.dtos.d.ts +54 -0
- package/dist/dto/user-service.dtos.js +2 -0
- package/dist/enums/auth-service.enums.d.ts +12 -0
- package/dist/enums/auth-service.enums.js +17 -0
- package/dist/enums/index.d.ts +3 -0
- package/dist/enums/index.js +19 -0
- package/dist/enums/permissions.types.d.ts +12 -0
- package/dist/enums/permissions.types.js +17 -0
- package/dist/enums/user-service.enums.d.ts +32 -0
- package/dist/enums/user-service.enums.js +41 -0
- package/dist/errors/app-error.d.ts +6 -0
- package/dist/errors/app-error.js +19 -0
- package/dist/errors/http-errors.d.ts +22 -0
- package/dist/errors/http-errors.js +46 -0
- package/dist/errors/index.d.ts +2 -0
- package/dist/errors/index.js +18 -0
- package/dist/http/service-client.d.ts +15 -0
- package/dist/http/service-client.js +57 -0
- package/dist/index.d.ts +8 -0
- package/dist/index.js +24 -0
- package/dist/internal/index.d.ts +4 -0
- package/dist/internal/index.js +20 -0
- package/dist/internal/internal-jwt.service.d.ts +13 -0
- package/dist/internal/internal-jwt.service.js +88 -0
- package/dist/internal/internal-jwt.types.d.ts +7 -0
- package/dist/internal/internal-jwt.types.js +2 -0
- package/dist/internal/internal-key-manager.d.ts +16 -0
- package/dist/internal/internal-key-manager.js +67 -0
- package/dist/internal/registry.d.ts +8 -0
- package/dist/internal/registry.js +34 -0
- package/dist/internal/service-client.d.ts +9 -0
- package/dist/internal/service-client.js +94 -0
- package/dist/jwt/index.d.ts +2 -0
- package/dist/jwt/index.js +18 -0
- package/dist/jwt/jwt-verifier.d.ts +9 -0
- package/dist/jwt/jwt-verifier.js +36 -0
- package/dist/jwt/service-client.d.ts +7 -0
- package/dist/jwt/service-client.js +87 -0
- package/dist/middleware/authorize.d.ts +3 -0
- package/dist/middleware/authorize.js +24 -0
- package/dist/middleware/error-handler.d.ts +4 -0
- package/dist/middleware/error-handler.js +23 -0
- package/dist/middleware/index.d.ts +5 -0
- package/dist/middleware/index.js +21 -0
- package/dist/middleware/request-id.d.ts +2 -0
- package/dist/middleware/request-id.js +9 -0
- package/dist/middleware/require-auth.d.ts +10 -0
- package/dist/middleware/require-auth.js +34 -0
- package/dist/middleware/validate.d.ts +5 -0
- package/dist/middleware/validate.js +18 -0
- package/dist/middleware/verify-internal-jwt.d.ts +7 -0
- package/dist/middleware/verify-internal-jwt.js +25 -0
- package/dist/security/guard.d.ts +10 -0
- package/dist/security/guard.js +40 -0
- package/dist/security/index.d.ts +1 -0
- package/dist/security/index.js +17 -0
- package/dist/types/express.d.ts +22 -0
- package/dist/types/express.js +3 -0
- package/dist/types/index.d.ts +1 -0
- package/dist/types/index.js +17 -0
- package/dist/utils/index.d.ts +1 -0
- package/dist/utils/index.js +17 -0
- package/dist/utils/response.d.ts +3 -0
- package/dist/utils/response.js +32 -0
- package/package.json +35 -0
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.RequireAuthMiddleware = void 0;
|
|
4
|
+
const errors_1 = require("../errors");
|
|
5
|
+
class RequireAuthMiddleware {
|
|
6
|
+
constructor(verifier) {
|
|
7
|
+
this.verifier = verifier;
|
|
8
|
+
this.handle = async (req, _res, next) => {
|
|
9
|
+
const header = req.headers.authorization;
|
|
10
|
+
if (!header?.startsWith("Bearer ")) {
|
|
11
|
+
return next(new errors_1.UnauthorizedError("Missing Authorization header"));
|
|
12
|
+
}
|
|
13
|
+
const token = header.slice(7);
|
|
14
|
+
try {
|
|
15
|
+
// 1. Verify against Gateway Public Keys
|
|
16
|
+
const payload = await this.verifier.verifyAccessToken(token);
|
|
17
|
+
// 2. Store the raw payload (Access to .jti for logouts/suspensions)
|
|
18
|
+
req.internalAuth = payload;
|
|
19
|
+
// 3. Build AccessContext if it's a human user
|
|
20
|
+
if (payload.accountId && payload.accountRole) {
|
|
21
|
+
req.accessContext = {
|
|
22
|
+
accountId: payload.accountId,
|
|
23
|
+
accountRole: payload.accountRole,
|
|
24
|
+
};
|
|
25
|
+
}
|
|
26
|
+
next();
|
|
27
|
+
}
|
|
28
|
+
catch (err) {
|
|
29
|
+
next(new errors_1.UnauthorizedError("Unauthorized: Token validation failed"));
|
|
30
|
+
}
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
exports.RequireAuthMiddleware = RequireAuthMiddleware;
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.Validator = void 0;
|
|
4
|
+
class Validator {
|
|
5
|
+
static validate(schema, source = "body") {
|
|
6
|
+
return (req, _res, next) => {
|
|
7
|
+
const result = schema.safeParse(req[source]);
|
|
8
|
+
if (!result.success) {
|
|
9
|
+
// Pass to GlobalErrorHandler
|
|
10
|
+
return next(result.error);
|
|
11
|
+
}
|
|
12
|
+
// Populate req.validated (defined in your shared .d.ts)
|
|
13
|
+
req.validated = result.data;
|
|
14
|
+
next();
|
|
15
|
+
};
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
exports.Validator = Validator;
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { Request, Response, NextFunction } from "express";
|
|
2
|
+
import { InternalJwtService } from "../internal";
|
|
3
|
+
export declare class VerifyInternalJwtMiddleware {
|
|
4
|
+
private readonly internalJwt;
|
|
5
|
+
constructor(internalJwt: InternalJwtService);
|
|
6
|
+
handle: (req: Request, _res: Response, next: NextFunction) => Promise<void>;
|
|
7
|
+
}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.VerifyInternalJwtMiddleware = void 0;
|
|
4
|
+
const errors_1 = require("../errors"); // Shared errors
|
|
5
|
+
class VerifyInternalJwtMiddleware {
|
|
6
|
+
constructor(internalJwt) {
|
|
7
|
+
this.internalJwt = internalJwt;
|
|
8
|
+
this.handle = async (req, _res, next) => {
|
|
9
|
+
const raw = req.headers["x-internal-token"]; // Standardize header name
|
|
10
|
+
if (!raw || typeof raw !== "string") {
|
|
11
|
+
return next(new errors_1.UnauthorizedError("Missing internal token"));
|
|
12
|
+
}
|
|
13
|
+
try {
|
|
14
|
+
const payload = await this.internalJwt.verify(raw);
|
|
15
|
+
// Populate standardized internalAuth (from your shared .d.ts)
|
|
16
|
+
req.internalAuth = payload;
|
|
17
|
+
next();
|
|
18
|
+
}
|
|
19
|
+
catch (err) {
|
|
20
|
+
next(new errors_1.UnauthorizedError("Invalid internal token"));
|
|
21
|
+
}
|
|
22
|
+
};
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
exports.VerifyInternalJwtMiddleware = VerifyInternalJwtMiddleware;
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { AccountRole, GlobalPermission, OrganizationRole, OrgPermission } from "../enums";
|
|
2
|
+
import { AccessContext } from "../types";
|
|
3
|
+
export declare const globalRolePermissions: Record<AccountRole, readonly GlobalPermission[]>;
|
|
4
|
+
export declare const orgRolePermissions: Record<OrganizationRole, readonly OrgPermission[]>;
|
|
5
|
+
/**
|
|
6
|
+
* Updated isAllowed
|
|
7
|
+
* Since memberships are no longer in the JWT, this function
|
|
8
|
+
* primarily validates Global permissions.
|
|
9
|
+
*/
|
|
10
|
+
export declare const isAllowed: (ctx: AccessContext, permission: GlobalPermission | OrgPermission) => boolean;
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.isAllowed = exports.orgRolePermissions = exports.globalRolePermissions = void 0;
|
|
4
|
+
const enums_1 = require("../enums");
|
|
5
|
+
exports.globalRolePermissions = {
|
|
6
|
+
[enums_1.AccountRole.SUPERADMIN]: Object.values(enums_1.GlobalPermission), // Superadmin gets everything
|
|
7
|
+
[enums_1.AccountRole.ADMIN]: [
|
|
8
|
+
enums_1.GlobalPermission.MANAGE_USERS,
|
|
9
|
+
enums_1.GlobalPermission.SUPPORT_ACTIONS,
|
|
10
|
+
enums_1.GlobalPermission.VIEW_SYSTEM_LOGS
|
|
11
|
+
],
|
|
12
|
+
[enums_1.AccountRole.SUPPORT]: [enums_1.GlobalPermission.SUPPORT_ACTIONS],
|
|
13
|
+
[enums_1.AccountRole.MODERATOR]: [enums_1.GlobalPermission.MODERATE_CONTENT],
|
|
14
|
+
[enums_1.AccountRole.USER]: []
|
|
15
|
+
};
|
|
16
|
+
// We keep this here as a reference for local service lookups
|
|
17
|
+
exports.orgRolePermissions = {
|
|
18
|
+
[enums_1.OrganizationRole.OWNER]: [enums_1.OrgPermission.MANAGE_ORG, enums_1.OrgPermission.MANAGE_MEMBERS],
|
|
19
|
+
[enums_1.OrganizationRole.ADMIN]: [enums_1.OrgPermission.MANAGE_MEMBERS],
|
|
20
|
+
[enums_1.OrganizationRole.EDITOR]: [],
|
|
21
|
+
[enums_1.OrganizationRole.VIEWER]: [],
|
|
22
|
+
};
|
|
23
|
+
const canPerformGlobalPermission = (role, permission) => {
|
|
24
|
+
return exports.globalRolePermissions[role]?.includes(permission) ?? false;
|
|
25
|
+
};
|
|
26
|
+
/**
|
|
27
|
+
* Updated isAllowed
|
|
28
|
+
* Since memberships are no longer in the JWT, this function
|
|
29
|
+
* primarily validates Global permissions.
|
|
30
|
+
*/
|
|
31
|
+
const isAllowed = (ctx, permission) => {
|
|
32
|
+
// 1. Check if it's a Global Permission (Handled via JWT role)
|
|
33
|
+
if (Object.values(enums_1.GlobalPermission).includes(permission)) {
|
|
34
|
+
return canPerformGlobalPermission(ctx.accountRole, permission);
|
|
35
|
+
}
|
|
36
|
+
// 2. Org Permissions are now handled by specific "Tenant Middleware"
|
|
37
|
+
// within the microservices because they require a DB check.
|
|
38
|
+
return false;
|
|
39
|
+
};
|
|
40
|
+
exports.isAllowed = isAllowed;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from "./guard";
|
|
@@ -0,0 +1,17 @@
|
|
|
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
|
+
};
|
|
16
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
+
__exportStar(require("./guard"), exports);
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import "express-serve-static-core";
|
|
2
|
+
import { JWTPayload } from "jose";
|
|
3
|
+
import { AccountRole } from "../enums";
|
|
4
|
+
export interface AccessContext {
|
|
5
|
+
accountId: string;
|
|
6
|
+
accountRole: AccountRole;
|
|
7
|
+
}
|
|
8
|
+
export interface InternalJwtPayload extends JWTPayload {
|
|
9
|
+
jti: string;
|
|
10
|
+
accountId?: string;
|
|
11
|
+
accountRole?: string;
|
|
12
|
+
isMachine?: boolean;
|
|
13
|
+
}
|
|
14
|
+
declare module "express-serve-static-core" {
|
|
15
|
+
interface Request {
|
|
16
|
+
id: string;
|
|
17
|
+
validated?: any;
|
|
18
|
+
accessContext?: AccessContext;
|
|
19
|
+
internalAuth?: InternalJwtPayload;
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
export {};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from "./express";
|
|
@@ -0,0 +1,17 @@
|
|
|
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
|
+
};
|
|
16
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
+
__exportStar(require("./express"), exports);
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from "./response";
|
|
@@ -0,0 +1,17 @@
|
|
|
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
|
+
};
|
|
16
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
+
__exportStar(require("./response"), exports);
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
import { Response } from "express";
|
|
2
|
+
export declare const success: <T>(res: Response, data: T, statusCode?: number) => Response<any, Record<string, any>>;
|
|
3
|
+
export declare const failure: (res: Response, message: string, statusCode?: number, details?: unknown) => Response<any, Record<string, any>>;
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.failure = exports.success = void 0;
|
|
4
|
+
const success = (res, data, statusCode = 200) => {
|
|
5
|
+
const req = res.req;
|
|
6
|
+
const response = {
|
|
7
|
+
success: true,
|
|
8
|
+
data,
|
|
9
|
+
meta: {
|
|
10
|
+
requestId: req?.id ?? null,
|
|
11
|
+
timestamp: new Date().toISOString()
|
|
12
|
+
}
|
|
13
|
+
};
|
|
14
|
+
return res.status(statusCode).json(response);
|
|
15
|
+
};
|
|
16
|
+
exports.success = success;
|
|
17
|
+
const failure = (res, message, statusCode = 400, details) => {
|
|
18
|
+
const req = res.req;
|
|
19
|
+
const response = {
|
|
20
|
+
success: false,
|
|
21
|
+
error: {
|
|
22
|
+
message,
|
|
23
|
+
details: details ?? null
|
|
24
|
+
},
|
|
25
|
+
meta: {
|
|
26
|
+
requestId: req?.id ?? null,
|
|
27
|
+
timestamp: new Date().toISOString()
|
|
28
|
+
}
|
|
29
|
+
};
|
|
30
|
+
return res.status(statusCode).json(response);
|
|
31
|
+
};
|
|
32
|
+
exports.failure = failure;
|
package/package.json
ADDED
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@discover-cloud/shared",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"private": false,
|
|
5
|
+
"type": "commonjs",
|
|
6
|
+
"main": "dist/index.js",
|
|
7
|
+
"types": "dist/index.d.ts",
|
|
8
|
+
"files": [
|
|
9
|
+
"dist"
|
|
10
|
+
],
|
|
11
|
+
"scripts": {
|
|
12
|
+
"build": "tsc -p tsconfig.json",
|
|
13
|
+
"prepublishOnly": "npm run build"
|
|
14
|
+
},
|
|
15
|
+
"publishConfig": {
|
|
16
|
+
"access": "public"
|
|
17
|
+
},
|
|
18
|
+
"dependencies": {
|
|
19
|
+
"axios-retry": "^4.5.0",
|
|
20
|
+
"jose": "^6.1.3"
|
|
21
|
+
},
|
|
22
|
+
"peerDependencies": {
|
|
23
|
+
"axios": "^1.13.5",
|
|
24
|
+
"express": "^5.2.1",
|
|
25
|
+
"zod": "^4.3.6"
|
|
26
|
+
},
|
|
27
|
+
"devDependencies": {
|
|
28
|
+
"@types/express": "^5.0.6",
|
|
29
|
+
"@types/node": "^25.3.0",
|
|
30
|
+
"axios": "^1.13.5",
|
|
31
|
+
"express": "^5.2.1",
|
|
32
|
+
"typescript": "^5.9.3",
|
|
33
|
+
"zod": "^4.3.6"
|
|
34
|
+
}
|
|
35
|
+
}
|