@autofleet/zehut 1.3.0 → 1.3.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/lib/index.d.ts ADDED
@@ -0,0 +1,2 @@
1
+ import User, { middleware, eagerLoadPermissionsMiddleware, middlewareWithDecode } from './user';
2
+ export { User, middleware, middlewareWithDecode, eagerLoadPermissionsMiddleware, };
package/lib/index.js ADDED
@@ -0,0 +1,27 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
5
+ }) : (function(o, m, k, k2) {
6
+ if (k2 === undefined) k2 = k;
7
+ o[k2] = m[k];
8
+ }));
9
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
10
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
11
+ }) : function(o, v) {
12
+ o["default"] = v;
13
+ });
14
+ var __importStar = (this && this.__importStar) || function (mod) {
15
+ if (mod && mod.__esModule) return mod;
16
+ var result = {};
17
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
18
+ __setModuleDefault(result, mod);
19
+ return result;
20
+ };
21
+ Object.defineProperty(exports, "__esModule", { value: true });
22
+ exports.eagerLoadPermissionsMiddleware = exports.middlewareWithDecode = exports.middleware = exports.User = void 0;
23
+ const user_1 = __importStar(require("./user"));
24
+ exports.User = user_1.default;
25
+ Object.defineProperty(exports, "middleware", { enumerable: true, get: function () { return user_1.middleware; } });
26
+ Object.defineProperty(exports, "eagerLoadPermissionsMiddleware", { enumerable: true, get: function () { return user_1.eagerLoadPermissionsMiddleware; } });
27
+ Object.defineProperty(exports, "middlewareWithDecode", { enumerable: true, get: function () { return user_1.middlewareWithDecode; } });
@@ -0,0 +1 @@
1
+ export declare const IdentityNetwork: any;
@@ -0,0 +1,16 @@
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.IdentityNetwork = void 0;
7
+ const network_1 = __importDefault(require("@autofleet/network"));
8
+ const CACHE_LIFETIME_IN_SEC = 10;
9
+ exports.IdentityNetwork = new network_1.default({
10
+ serviceName: 'IDENTITY_MS',
11
+ retries: 3,
12
+ retryCondition: () => true,
13
+ cache: process.env.NODE_ENV !== 'test' ? {
14
+ maxAge: CACHE_LIFETIME_IN_SEC * 1000,
15
+ } : undefined,
16
+ });
@@ -0,0 +1,25 @@
1
+ interface EntityPermissions {
2
+ [key: string]: string[];
3
+ }
4
+ export interface UserPayload {
5
+ businessModels: EntityPermissions;
6
+ fleets: EntityPermissions;
7
+ demandSources: EntityPermissions;
8
+ createdAt?: string;
9
+ }
10
+ export default class ApiUser {
11
+ id: string | undefined;
12
+ privatePermissions: UserPayload | undefined;
13
+ privatePermissionsLegacy: any;
14
+ emptyUser: boolean;
15
+ constructor(id?: string);
16
+ getUserPermissions(): Promise<UserPayload>;
17
+ get businessModels(): string[] | undefined;
18
+ get fleets(): string[] | undefined;
19
+ get demandSources(): string[] | undefined;
20
+ getUserProperty(key: any): string[] | undefined;
21
+ get permissions(): UserPayload | undefined;
22
+ getUserPermissionsLegacy(): Promise<any>;
23
+ get permissionsLegacy(): any;
24
+ }
25
+ export {};
@@ -0,0 +1,72 @@
1
+ "use strict";
2
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
+ return new (P || (P = Promise))(function (resolve, reject) {
5
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
9
+ });
10
+ };
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ const services_1 = require("../services");
13
+ class ApiUser {
14
+ constructor(id) {
15
+ this.id = id;
16
+ this.emptyUser = !!id;
17
+ }
18
+ getUserPermissions() {
19
+ return __awaiter(this, void 0, void 0, function* () {
20
+ if (!this.id) {
21
+ return;
22
+ }
23
+ if (this.privatePermissions) {
24
+ return this.privatePermissions;
25
+ }
26
+ const { data } = yield services_1.IdentityNetwork.get(`/api/v1/users/${this.id}/authorization-payload`);
27
+ this.privatePermissions = data;
28
+ return this.privatePermissions;
29
+ });
30
+ }
31
+ get businessModels() {
32
+ return this.getUserProperty('businessModels');
33
+ }
34
+ get fleets() {
35
+ return this.getUserProperty('fleets');
36
+ }
37
+ get demandSources() {
38
+ return this.getUserProperty('demandSources');
39
+ }
40
+ getUserProperty(key) {
41
+ if (!this.privatePermissions) {
42
+ throw new Error(`Cannot get ${key} without calling (async) getUserPermissions before`);
43
+ }
44
+ return Object.keys(this.privatePermissions[key] || {});
45
+ }
46
+ get permissions() {
47
+ if (!this.privatePermissions) {
48
+ throw new Error('Cannot get permissions without calling (async) getUserPermissions before');
49
+ }
50
+ return this.privatePermissions;
51
+ }
52
+ getUserPermissionsLegacy() {
53
+ return __awaiter(this, void 0, void 0, function* () {
54
+ if (!this.id) {
55
+ return;
56
+ }
57
+ if (this.privatePermissionsLegacy) {
58
+ return this.privatePermissionsLegacy;
59
+ }
60
+ const { data } = yield services_1.IdentityNetwork.get(`/api/v1/users/${this.id}/authorization-payload-legacy`);
61
+ this.privatePermissionsLegacy = data;
62
+ return this.privatePermissionsLegacy;
63
+ });
64
+ }
65
+ get permissionsLegacy() {
66
+ if (!this.privatePermissionsLegacy) {
67
+ throw new Error('Cannot get permissionsLegacy without calling (async) getUserPermissionsLegacy before');
68
+ }
69
+ return this.privatePermissionsLegacy;
70
+ }
71
+ }
72
+ exports.default = ApiUser;
@@ -0,0 +1,11 @@
1
+ import ApiUser from './ApiUser';
2
+ export declare const middleware: (options?: {
3
+ eagerLoadUserPermissions?: boolean;
4
+ eagerLoadUserPermissionsLegacy?: boolean;
5
+ }) => (req: any, res: any, next: any) => Promise<void>;
6
+ export declare const middlewareWithDecode: (options?: {
7
+ eagerLoadUserPermissions?: boolean;
8
+ eagerLoadUserPermissionsLegacy?: boolean;
9
+ }) => (req: any, res: any, next: any) => Promise<void>;
10
+ export declare const eagerLoadPermissionsMiddleware: (req: any, res: any, next: any) => Promise<void>;
11
+ export default ApiUser;
@@ -0,0 +1,57 @@
1
+ "use strict";
2
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
+ return new (P || (P = Promise))(function (resolve, reject) {
5
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
9
+ });
10
+ };
11
+ var __importDefault = (this && this.__importDefault) || function (mod) {
12
+ return (mod && mod.__esModule) ? mod : { "default": mod };
13
+ };
14
+ Object.defineProperty(exports, "__esModule", { value: true });
15
+ exports.eagerLoadPermissionsMiddleware = exports.middlewareWithDecode = exports.middleware = void 0;
16
+ const ApiUser_1 = __importDefault(require("./ApiUser"));
17
+ const utils_1 = require("../utils");
18
+ exports.middleware = (options = {}) => (req, res, next) => __awaiter(void 0, void 0, void 0, function* () {
19
+ const userId = req.headers['x-af-user-id'];
20
+ if (!userId) {
21
+ next();
22
+ return;
23
+ }
24
+ req.user = new ApiUser_1.default(userId);
25
+ if (options.eagerLoadUserPermissions) {
26
+ yield req.user.getUserPermissions();
27
+ }
28
+ if (options.eagerLoadUserPermissionsLegacy) {
29
+ yield req.user.getUserPermissionsLegacy();
30
+ }
31
+ next();
32
+ });
33
+ exports.middlewareWithDecode = (options = {}) => (req, res, next) => __awaiter(void 0, void 0, void 0, function* () {
34
+ var _a;
35
+ if (req.headers.authorization) {
36
+ const decoded = utils_1.decodeBearer(req.headers.authorization);
37
+ const userId = (_a = decoded === null || decoded === void 0 ? void 0 : decoded.user) === null || _a === void 0 ? void 0 : _a.id;
38
+ if (userId) {
39
+ req.headers['X-AF-USER-ID'] = userId;
40
+ }
41
+ const userObject = new ApiUser_1.default(userId);
42
+ req.user = userObject;
43
+ if (options.eagerLoadUserPermissions) {
44
+ yield req.user.getUserPermissions();
45
+ }
46
+ if (options.eagerLoadUserPermissionsLegacy) {
47
+ yield req.user.getUserPermissionsLegacy();
48
+ }
49
+ const entities = req.user.permissions;
50
+ }
51
+ next();
52
+ });
53
+ exports.eagerLoadPermissionsMiddleware = (req, res, next) => __awaiter(void 0, void 0, void 0, function* () {
54
+ yield req.user.getUserPermissions();
55
+ next();
56
+ });
57
+ exports.default = ApiUser_1.default;
package/lib/utils.d.ts ADDED
@@ -0,0 +1,5 @@
1
+ export declare const getAuthFromBearer: (bearer: string) => string;
2
+ export declare const decodeBearer: (bearer: string) => any;
3
+ export declare const parsePermissions: (contextId: any, decodedToken: any) => any;
4
+ export declare const getEntitiesFromContext: (contextId: string, decodedToken: any) => any;
5
+ export declare const getContextAttributes: (contextId: string, decodedToken: any) => any;
package/lib/utils.js ADDED
@@ -0,0 +1,91 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
5
+ }) : (function(o, m, k, k2) {
6
+ if (k2 === undefined) k2 = k;
7
+ o[k2] = m[k];
8
+ }));
9
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
10
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
11
+ }) : function(o, v) {
12
+ o["default"] = v;
13
+ });
14
+ var __importStar = (this && this.__importStar) || function (mod) {
15
+ if (mod && mod.__esModule) return mod;
16
+ var result = {};
17
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
18
+ __setModuleDefault(result, mod);
19
+ return result;
20
+ };
21
+ Object.defineProperty(exports, "__esModule", { value: true });
22
+ exports.getContextAttributes = exports.getEntitiesFromContext = exports.parsePermissions = exports.decodeBearer = exports.getAuthFromBearer = void 0;
23
+ /* eslint-disable prefer-destructuring */
24
+ const jwt = __importStar(require("jsonwebtoken"));
25
+ const CONTEXT_PROPS = ['fleetId', 'businessModelId', 'demandSourceId'];
26
+ const CONTEXT_MAP_PROPS = {
27
+ fleet: 'fleets',
28
+ business: 'businessModels',
29
+ demand: 'demandSources',
30
+ };
31
+ exports.getAuthFromBearer = (bearer) => bearer.replace('Bearer ', '');
32
+ exports.decodeBearer = (bearer) => {
33
+ const token = bearer.replace('Bearer ', '');
34
+ const decoded = jwt.decode(token);
35
+ return decoded;
36
+ };
37
+ exports.parsePermissions = (contextId, decodedToken) => {
38
+ var _a;
39
+ if (!decodedToken) {
40
+ return [];
41
+ }
42
+ const contexts = decodedToken.contexts;
43
+ const activeContext = contexts.find(context => context.id === contextId);
44
+ const permissionsByContext = {};
45
+ const permissionsValue = `${(_a = activeContext.permissions) === null || _a === void 0 ? void 0 : _a.map(cp => `${cp},`)}`;
46
+ return {
47
+ key: activeContext.entityId,
48
+ value: permissionsValue,
49
+ };
50
+ };
51
+ exports.getEntitiesFromContext = (contextId, decodedToken) => {
52
+ if (!decodedToken) {
53
+ return [];
54
+ }
55
+ let contexts = decodedToken.contexts;
56
+ if (contextId) {
57
+ contexts = contexts.filter(context => context.id === contextId);
58
+ }
59
+ const attributes = {};
60
+ contexts.forEach((context) => {
61
+ const prop = CONTEXT_MAP_PROPS[context.subSystem || 'business'];
62
+ const permissions = exports.parsePermissions(context.id, decodedToken);
63
+ // eslint-disable-next-line no-unused-expressions
64
+ attributes[prop] ?
65
+ attributes[prop][permissions.key] = permissions.value
66
+ : attributes[prop] = { [permissions.key]: permissions.value };
67
+ });
68
+ return attributes;
69
+ };
70
+ exports.getContextAttributes = (contextId, decodedToken) => {
71
+ if (!decodedToken) {
72
+ return [];
73
+ }
74
+ let contexts = decodedToken.contexts;
75
+ if (contextId) {
76
+ contexts = contexts.filter(context => context.id === contextId);
77
+ }
78
+ const attributes = {};
79
+ contexts.forEach((context) => {
80
+ CONTEXT_PROPS.forEach((prop) => {
81
+ if (context[prop]) {
82
+ const contextPropWrapped = [context[prop]];
83
+ // eslint-disable-next-line no-unused-expressions
84
+ attributes[prop] ?
85
+ attributes[prop] = attributes[prop].concat(contextPropWrapped) :
86
+ attributes[prop] = contextPropWrapped;
87
+ }
88
+ });
89
+ });
90
+ return attributes;
91
+ };
package/package.json CHANGED
@@ -1,11 +1,12 @@
1
1
  {
2
2
  "name": "@autofleet/zehut",
3
- "version": "1.3.0",
3
+ "version": "1.3.1",
4
4
  "description": "manage user's identity",
5
5
  "main": "lib/index.js",
6
6
  "types": "lib/index.d.ts",
7
7
  "scripts": {
8
8
  "build": "rm -rf lib && tsc",
9
+ "prepublish": "npm run build",
9
10
  "coverage": "jest --coverage --forceExit --runInBand",
10
11
  "test": "jest --forceExit --runInBand",
11
12
  "test-auto": "jest --watch --runInBand",