@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.
Files changed (75) hide show
  1. package/dist/context/access-context.d.ts +10 -0
  2. package/dist/context/access-context.js +2 -0
  3. package/dist/context/index.d.ts +1 -0
  4. package/dist/context/index.js +17 -0
  5. package/dist/dto/auth-service.dtos.d.ts +51 -0
  6. package/dist/dto/auth-service.dtos.js +2 -0
  7. package/dist/dto/index.d.ts +3 -0
  8. package/dist/dto/index.js +19 -0
  9. package/dist/dto/response.dtos.d.ts +48 -0
  10. package/dist/dto/response.dtos.js +2 -0
  11. package/dist/dto/user-service.dtos.d.ts +54 -0
  12. package/dist/dto/user-service.dtos.js +2 -0
  13. package/dist/enums/auth-service.enums.d.ts +12 -0
  14. package/dist/enums/auth-service.enums.js +17 -0
  15. package/dist/enums/index.d.ts +3 -0
  16. package/dist/enums/index.js +19 -0
  17. package/dist/enums/permissions.types.d.ts +12 -0
  18. package/dist/enums/permissions.types.js +17 -0
  19. package/dist/enums/user-service.enums.d.ts +32 -0
  20. package/dist/enums/user-service.enums.js +41 -0
  21. package/dist/errors/app-error.d.ts +6 -0
  22. package/dist/errors/app-error.js +19 -0
  23. package/dist/errors/http-errors.d.ts +22 -0
  24. package/dist/errors/http-errors.js +46 -0
  25. package/dist/errors/index.d.ts +2 -0
  26. package/dist/errors/index.js +18 -0
  27. package/dist/http/service-client.d.ts +15 -0
  28. package/dist/http/service-client.js +57 -0
  29. package/dist/index.d.ts +8 -0
  30. package/dist/index.js +24 -0
  31. package/dist/internal/index.d.ts +4 -0
  32. package/dist/internal/index.js +20 -0
  33. package/dist/internal/internal-jwt.service.d.ts +13 -0
  34. package/dist/internal/internal-jwt.service.js +88 -0
  35. package/dist/internal/internal-jwt.types.d.ts +7 -0
  36. package/dist/internal/internal-jwt.types.js +2 -0
  37. package/dist/internal/internal-key-manager.d.ts +16 -0
  38. package/dist/internal/internal-key-manager.js +67 -0
  39. package/dist/internal/registry.d.ts +8 -0
  40. package/dist/internal/registry.js +34 -0
  41. package/dist/internal/service-client.d.ts +9 -0
  42. package/dist/internal/service-client.js +94 -0
  43. package/dist/jwt/index.d.ts +2 -0
  44. package/dist/jwt/index.js +18 -0
  45. package/dist/jwt/jwt-verifier.d.ts +9 -0
  46. package/dist/jwt/jwt-verifier.js +36 -0
  47. package/dist/jwt/service-client.d.ts +7 -0
  48. package/dist/jwt/service-client.js +87 -0
  49. package/dist/middleware/authorize.d.ts +3 -0
  50. package/dist/middleware/authorize.js +24 -0
  51. package/dist/middleware/error-handler.d.ts +4 -0
  52. package/dist/middleware/error-handler.js +23 -0
  53. package/dist/middleware/index.d.ts +5 -0
  54. package/dist/middleware/index.js +21 -0
  55. package/dist/middleware/request-id.d.ts +2 -0
  56. package/dist/middleware/request-id.js +9 -0
  57. package/dist/middleware/require-auth.d.ts +10 -0
  58. package/dist/middleware/require-auth.js +34 -0
  59. package/dist/middleware/validate.d.ts +5 -0
  60. package/dist/middleware/validate.js +18 -0
  61. package/dist/middleware/verify-internal-jwt.d.ts +7 -0
  62. package/dist/middleware/verify-internal-jwt.js +25 -0
  63. package/dist/security/guard.d.ts +10 -0
  64. package/dist/security/guard.js +40 -0
  65. package/dist/security/index.d.ts +1 -0
  66. package/dist/security/index.js +17 -0
  67. package/dist/types/express.d.ts +22 -0
  68. package/dist/types/express.js +3 -0
  69. package/dist/types/index.d.ts +1 -0
  70. package/dist/types/index.js +17 -0
  71. package/dist/utils/index.d.ts +1 -0
  72. package/dist/utils/index.js +17 -0
  73. package/dist/utils/response.d.ts +3 -0
  74. package/dist/utils/response.js +32 -0
  75. 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,5 @@
1
+ import { Request, Response, NextFunction } from "express";
2
+ import { ZodType } from "zod";
3
+ export declare class Validator {
4
+ static validate<T>(schema: ZodType<T>, source?: "body" | "params" | "query"): (req: Request, _res: Response, next: NextFunction) => void;
5
+ }
@@ -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,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ require("express-serve-static-core");
@@ -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
+ }