starta.microservice 0.1.2209
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/Exception.d.ts +21 -0
- package/lib/Exception.js +56 -0
- package/lib/Exception.js.map +1 -0
- package/lib/adapters/aws/index.d.ts +5 -0
- package/lib/adapters/aws/index.js +15 -0
- package/lib/adapters/aws/index.js.map +1 -0
- package/lib/adapters/database/DBScripts/BaseMigration.d.ts +11 -0
- package/lib/adapters/database/DBScripts/BaseMigration.js +12 -0
- package/lib/adapters/database/DBScripts/BaseMigration.js.map +1 -0
- package/lib/adapters/database/DBScripts/DBInitialise.d.ts +4 -0
- package/lib/adapters/database/DBScripts/DBInitialise.js +22 -0
- package/lib/adapters/database/DBScripts/DBInitialise.js.map +1 -0
- package/lib/adapters/database/index.d.ts +25 -0
- package/lib/adapters/database/index.js +88 -0
- package/lib/adapters/database/index.js.map +1 -0
- package/lib/adapters/logger/index.d.ts +14 -0
- package/lib/adapters/logger/index.js +113 -0
- package/lib/adapters/logger/index.js.map +1 -0
- package/lib/adapters/rabbitmq/index.d.ts +17 -0
- package/lib/adapters/rabbitmq/index.js +145 -0
- package/lib/adapters/rabbitmq/index.js.map +1 -0
- package/lib/adapters/redisService/Listener.d.ts +10 -0
- package/lib/adapters/redisService/Listener.js +35 -0
- package/lib/adapters/redisService/Listener.js.map +1 -0
- package/lib/adapters/redisService/Publisher.d.ts +7 -0
- package/lib/adapters/redisService/Publisher.js +38 -0
- package/lib/adapters/redisService/Publisher.js.map +1 -0
- package/lib/adapters/redisService/RedisAdapter.d.ts +29 -0
- package/lib/adapters/redisService/RedisAdapter.js +161 -0
- package/lib/adapters/redisService/RedisAdapter.js.map +1 -0
- package/lib/adapters/redisService/index.d.ts +71 -0
- package/lib/adapters/redisService/index.js +337 -0
- package/lib/adapters/redisService/index.js.map +1 -0
- package/lib/adapters/redisService/types.d.ts +14 -0
- package/lib/adapters/redisService/types.js +3 -0
- package/lib/adapters/redisService/types.js.map +1 -0
- package/lib/config.d.ts +103 -0
- package/lib/config.js +126 -0
- package/lib/config.js.map +1 -0
- package/lib/entities/Account.d.ts +191 -0
- package/lib/entities/Account.js +62 -0
- package/lib/entities/Account.js.map +1 -0
- package/lib/entities/Base.d.ts +29 -0
- package/lib/entities/Base.js +62 -0
- package/lib/entities/Base.js.map +1 -0
- package/lib/entities/Version.d.ts +6 -0
- package/lib/entities/Version.js +10 -0
- package/lib/entities/Version.js.map +1 -0
- package/lib/entities/types/index.d.ts +108 -0
- package/lib/entities/types/index.js +3 -0
- package/lib/entities/types/index.js.map +1 -0
- package/lib/helpers/index.d.ts +24 -0
- package/lib/helpers/index.js +151 -0
- package/lib/helpers/index.js.map +1 -0
- package/lib/repositories/Repository.d.ts +39 -0
- package/lib/repositories/Repository.js +403 -0
- package/lib/repositories/Repository.js.map +1 -0
- package/lib/repositories/index.d.ts +6 -0
- package/lib/repositories/index.js +16 -0
- package/lib/repositories/index.js.map +1 -0
- package/lib/repositories/types/AggregateOptions.d.ts +4 -0
- package/lib/repositories/types/AggregateOptions.js +6 -0
- package/lib/repositories/types/AggregateOptions.js.map +1 -0
- package/lib/repositories/types/FindOptions.d.ts +16 -0
- package/lib/repositories/types/FindOptions.js +6 -0
- package/lib/repositories/types/FindOptions.js.map +1 -0
- package/lib/repositories/types/IQuery.d.ts +4 -0
- package/lib/repositories/types/IQuery.js +3 -0
- package/lib/repositories/types/IQuery.js.map +1 -0
- package/lib/repositories/types/JoinOptions.d.ts +8 -0
- package/lib/repositories/types/JoinOptions.js +6 -0
- package/lib/repositories/types/JoinOptions.js.map +1 -0
- package/lib/services/ServiceExecutor.d.ts +16 -0
- package/lib/services/ServiceExecutor.js +169 -0
- package/lib/services/ServiceExecutor.js.map +1 -0
- package/lib/services/ServiceExecutorHandler.d.ts +13 -0
- package/lib/services/ServiceExecutorHandler.js +323 -0
- package/lib/services/ServiceExecutorHandler.js.map +1 -0
- package/lib/services/ServiceFactoryBase.d.ts +15 -0
- package/lib/services/ServiceFactoryBase.js +11 -0
- package/lib/services/ServiceFactoryBase.js.map +1 -0
- package/lib/services/ServiceHandlerBase.d.ts +30 -0
- package/lib/services/ServiceHandlerBase.js +113 -0
- package/lib/services/ServiceHandlerBase.js.map +1 -0
- package/lib/services/dataSelectors.d.ts +38 -0
- package/lib/services/dataSelectors.js +60 -0
- package/lib/services/dataSelectors.js.map +1 -0
- package/lib/timeProvider.d.ts +14 -0
- package/lib/timeProvider.js +37 -0
- package/lib/timeProvider.js.map +1 -0
- package/lib/types/index.d.ts +72 -0
- package/lib/types/index.js +14 -0
- package/lib/types/index.js.map +1 -0
- package/package.json +51 -0
|
@@ -0,0 +1,113 @@
|
|
|
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
|
+
const helpers_1 = __importDefault(require("../helpers"));
|
|
16
|
+
const Exception_1 = __importDefault(require("../Exception"));
|
|
17
|
+
const timeProvider_1 = __importDefault(require("../timeProvider"));
|
|
18
|
+
const uniquify = helpers_1.default.uniquify;
|
|
19
|
+
const clone = helpers_1.default.clone;
|
|
20
|
+
const diffPatcher = helpers_1.default.diffPatcher();
|
|
21
|
+
const actions = {
|
|
22
|
+
created: 'CREATED',
|
|
23
|
+
updated: 'UPDATED',
|
|
24
|
+
};
|
|
25
|
+
class ServiceHandlerBase {
|
|
26
|
+
constructor(repositories, redis, rabbit, serviceExecutor, logger, request, permissions) {
|
|
27
|
+
this.repositories = repositories;
|
|
28
|
+
this.request = request;
|
|
29
|
+
this.logger = logger;
|
|
30
|
+
this.redis = redis;
|
|
31
|
+
this.serviceExecutor = serviceExecutor;
|
|
32
|
+
this.rabbit = rabbit;
|
|
33
|
+
}
|
|
34
|
+
get Permissions() {
|
|
35
|
+
var _a;
|
|
36
|
+
return this.permissions || ((_a = this.request) === null || _a === void 0 ? void 0 : _a.currentOrgPermissions);
|
|
37
|
+
}
|
|
38
|
+
set Permissions(permissions) {
|
|
39
|
+
this.permissions = permissions;
|
|
40
|
+
}
|
|
41
|
+
simpleHandleRevisions(entityClone, entity) {
|
|
42
|
+
var _a, _b, _c, _d, _e, _f, _g;
|
|
43
|
+
const entityReference = entity;
|
|
44
|
+
if (entity.revisions) {
|
|
45
|
+
entityReference.createdAt = ((_b = (_a = this.request) === null || _a === void 0 ? void 0 : _a.session) === null || _b === void 0 ? void 0 : _b.date) || ((_c = this.requestData) === null || _c === void 0 ? void 0 : _c.createdAt) || timeProvider_1.default.jsDate();
|
|
46
|
+
entityReference.createdBy = ((_f = (_e = (_d = this.request) === null || _d === void 0 ? void 0 : _d.session) === null || _e === void 0 ? void 0 : _e.account) === null || _f === void 0 ? void 0 : _f.login) || ((_g = this.requestData) === null || _g === void 0 ? void 0 : _g.createdBy) || '%system';
|
|
47
|
+
}
|
|
48
|
+
const delta = diffPatcher.diff(entityClone, entity);
|
|
49
|
+
if (!entityClone.originalRevision && entity.revisions) {
|
|
50
|
+
entityReference.originalRevision = entityClone;
|
|
51
|
+
}
|
|
52
|
+
if (entity.revisions) {
|
|
53
|
+
entity.revisions.push(delta);
|
|
54
|
+
}
|
|
55
|
+
return delta;
|
|
56
|
+
}
|
|
57
|
+
handleRevisions(entityClone, entity, options) {
|
|
58
|
+
return this.simpleHandleRevisions(entityClone, entity);
|
|
59
|
+
}
|
|
60
|
+
_emitEvent(eventType, eventData) {
|
|
61
|
+
return this.rabbit.emitEvent(eventType, eventData);
|
|
62
|
+
}
|
|
63
|
+
_insert(entityToInsert) {
|
|
64
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
65
|
+
const createdEntity = yield this.repositories.getRepository(this.getMainRepository())._insert(entityToInsert);
|
|
66
|
+
this._emitEvent(`ENTITY:${this.getEntityName()}:${actions.created}`, {
|
|
67
|
+
entity: createdEntity,
|
|
68
|
+
});
|
|
69
|
+
return createdEntity;
|
|
70
|
+
});
|
|
71
|
+
}
|
|
72
|
+
_update(entityUnique, update, options = null) {
|
|
73
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
74
|
+
const multiResult = yield this._updateMulti([entityUnique], update, options);
|
|
75
|
+
return multiResult[0];
|
|
76
|
+
});
|
|
77
|
+
}
|
|
78
|
+
_updateMulti(entityUniques, update, options) {
|
|
79
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
80
|
+
const repository = this.repositories.getRepository(this.getMainRepository());
|
|
81
|
+
const resourceIds = entityUniques.map(entityUnique => repository.entityUniqueToString(entityUnique)).sort();
|
|
82
|
+
if (uniquify(resourceIds).length !== resourceIds.length) {
|
|
83
|
+
return Promise.reject(new Exception_1.default({
|
|
84
|
+
code: 'UNALBE_TO_UPDATE_ONE_OBJECT_AT_THE_SAME_TIME',
|
|
85
|
+
}));
|
|
86
|
+
}
|
|
87
|
+
const result = yield this.redis.getLocker().using(resourceIds, 10000, () => __awaiter(this, void 0, void 0, function* () {
|
|
88
|
+
const entities = yield repository.findByUniqueKeys(entityUniques);
|
|
89
|
+
if (entities.length !== entityUniques.length) {
|
|
90
|
+
throw new Exception_1.default({
|
|
91
|
+
code: 'NOT_FOUND',
|
|
92
|
+
});
|
|
93
|
+
}
|
|
94
|
+
const clones = entities.map(clone);
|
|
95
|
+
const sortedEntityUniques = clones.map(e => repository.getUniqueValue(e));
|
|
96
|
+
yield Promise.all(entities.map(e => update(e)));
|
|
97
|
+
const resultArray = [];
|
|
98
|
+
yield Promise.all(entities.map((entity, index) => __awaiter(this, void 0, void 0, function* () {
|
|
99
|
+
const delta = this.handleRevisions(clones[index], entity, options);
|
|
100
|
+
const result = yield repository._update(entity, sortedEntityUniques[index]);
|
|
101
|
+
if (result) {
|
|
102
|
+
resultArray.push(entity);
|
|
103
|
+
this._emitEvent(`ENTITY:${this.getEntityName()}:${actions.updated}`, { entity, delta });
|
|
104
|
+
}
|
|
105
|
+
})));
|
|
106
|
+
return entities;
|
|
107
|
+
}));
|
|
108
|
+
return result;
|
|
109
|
+
});
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
exports.default = ServiceHandlerBase;
|
|
113
|
+
//# sourceMappingURL=ServiceHandlerBase.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ServiceHandlerBase.js","sourceRoot":"","sources":["../../src/services/ServiceHandlerBase.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
/// <reference types="multer" />
|
|
2
|
+
import { IAuthorizedRequest } from '../types';
|
|
3
|
+
declare const _default: {
|
|
4
|
+
selectBody: (req: IAuthorizedRequest) => any;
|
|
5
|
+
selectLanguageCookie: (req: IAuthorizedRequest) => {
|
|
6
|
+
language?: string;
|
|
7
|
+
};
|
|
8
|
+
selectBodyAsProp: (req: IAuthorizedRequest) => {
|
|
9
|
+
body: any;
|
|
10
|
+
};
|
|
11
|
+
selectFileAsProp: (req: IAuthorizedRequest) => {
|
|
12
|
+
file: Express.Multer.File;
|
|
13
|
+
};
|
|
14
|
+
selectFile: (req: IAuthorizedRequest) => Express.Multer.File;
|
|
15
|
+
selectStripeSignature: (req: IAuthorizedRequest) => {
|
|
16
|
+
stripeSignature: string | string[];
|
|
17
|
+
};
|
|
18
|
+
selectClientIp: (req: IAuthorizedRequest) => {
|
|
19
|
+
clientIp: string | string[];
|
|
20
|
+
};
|
|
21
|
+
selectUserAgent: (req: IAuthorizedRequest) => {
|
|
22
|
+
userAgent: string;
|
|
23
|
+
};
|
|
24
|
+
selectClientCountry: (req: IAuthorizedRequest) => {
|
|
25
|
+
clientCountry: string | string[];
|
|
26
|
+
};
|
|
27
|
+
selectQuery: (req: IAuthorizedRequest) => {};
|
|
28
|
+
selectLoginFromSession: (req: IAuthorizedRequest) => {
|
|
29
|
+
login: string;
|
|
30
|
+
};
|
|
31
|
+
selectParams: (req: IAuthorizedRequest) => import("express-serve-static-core").ParamsDictionary;
|
|
32
|
+
selectSession: (req: IAuthorizedRequest) => import("../types").ISessionData;
|
|
33
|
+
selectRemarketingUrls: (req: IAuthorizedRequest) => {
|
|
34
|
+
remarketingUrls: any;
|
|
35
|
+
};
|
|
36
|
+
composeSelectors(...args: any[]): any;
|
|
37
|
+
};
|
|
38
|
+
export default _default;
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.default = {
|
|
4
|
+
selectBody: (req) => req.originalRequest.body,
|
|
5
|
+
selectLanguageCookie: (req) => ({ language: req.originalRequest.cookies.language }),
|
|
6
|
+
selectBodyAsProp: (req) => ({ body: req.originalRequest.body }),
|
|
7
|
+
selectFileAsProp: (req) => ({ file: req.originalRequest.file }),
|
|
8
|
+
selectFile: (req) => req.originalRequest.file,
|
|
9
|
+
selectStripeSignature: (req) => ({ stripeSignature: req.originalRequest.headers['stripe-signature'] }),
|
|
10
|
+
selectClientIp: (req) => ({ clientIp: req.originalRequest.headers['cf-connecting-ip'] || req.originalRequest.connection.remoteAddress }),
|
|
11
|
+
selectUserAgent: (req) => ({ userAgent: req.originalRequest.headers['user-agent'] }),
|
|
12
|
+
selectClientCountry: (req) => {
|
|
13
|
+
const country = req.originalRequest.headers['CF-IPCountry'] || req.originalRequest.headers['cf-ipcountry'];
|
|
14
|
+
return ({ clientCountry: country || 'UA' });
|
|
15
|
+
},
|
|
16
|
+
selectQuery: (req) => {
|
|
17
|
+
if (!req.originalRequest.query) {
|
|
18
|
+
return null;
|
|
19
|
+
}
|
|
20
|
+
const recomposedQuery = Object.keys(req.originalRequest.query).reduce((result, key) => {
|
|
21
|
+
if (key.indexOf('.') !== -1) {
|
|
22
|
+
const keyPath = key.split('.');
|
|
23
|
+
let currentNode = result;
|
|
24
|
+
keyPath.forEach((keyPathItem, index) => {
|
|
25
|
+
if (!currentNode[keyPathItem]) {
|
|
26
|
+
currentNode[keyPathItem] = keyPath.length - 1 === index
|
|
27
|
+
? req.originalRequest.query[key]
|
|
28
|
+
: {};
|
|
29
|
+
}
|
|
30
|
+
currentNode = currentNode[keyPathItem];
|
|
31
|
+
});
|
|
32
|
+
}
|
|
33
|
+
else {
|
|
34
|
+
result[key] = req.originalRequest.query[key];
|
|
35
|
+
}
|
|
36
|
+
return result;
|
|
37
|
+
}, {});
|
|
38
|
+
return recomposedQuery;
|
|
39
|
+
},
|
|
40
|
+
selectLoginFromSession: (req) => ({ login: req.session.account.login }),
|
|
41
|
+
selectParams: (req) => req.originalRequest.params,
|
|
42
|
+
selectSession: (req) => req.session,
|
|
43
|
+
selectRemarketingUrls: (req) => ({
|
|
44
|
+
remarketingUrls: req.originalRequest.cookies['remarketing_urls'] && JSON.parse(req.originalRequest.cookies['remarketing_urls']),
|
|
45
|
+
}),
|
|
46
|
+
composeSelectors(...args) {
|
|
47
|
+
const selectors = args;
|
|
48
|
+
return (req) => {
|
|
49
|
+
const result = {};
|
|
50
|
+
Object.keys(selectors).forEach((selectorName) => {
|
|
51
|
+
const subResult = selectors[selectorName](req);
|
|
52
|
+
Object.keys(subResult).forEach((key) => {
|
|
53
|
+
result[key] = subResult[key];
|
|
54
|
+
});
|
|
55
|
+
});
|
|
56
|
+
return result;
|
|
57
|
+
};
|
|
58
|
+
},
|
|
59
|
+
};
|
|
60
|
+
//# sourceMappingURL=dataSelectors.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dataSelectors.js","sourceRoot":"","sources":["../../src/services/dataSelectors.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import moment from 'moment';
|
|
2
|
+
declare class TimeProvider {
|
|
3
|
+
private timeOffset;
|
|
4
|
+
constructor();
|
|
5
|
+
moment(date?: string): moment.Moment;
|
|
6
|
+
jsDate(date?: string): Date;
|
|
7
|
+
addDays(offset: number): void;
|
|
8
|
+
addHours(offset: number): void;
|
|
9
|
+
resetTimeOffset(): void;
|
|
10
|
+
isDateSameOrBefore(beforeDate: Date | moment.Moment | number, date: Date | moment.Moment | number): boolean;
|
|
11
|
+
add(date: any, measurement: any, value: any): any;
|
|
12
|
+
}
|
|
13
|
+
declare const _default: TimeProvider;
|
|
14
|
+
export default _default;
|
|
@@ -0,0 +1,37 @@
|
|
|
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
|
+
const moment_1 = __importDefault(require("moment"));
|
|
7
|
+
class TimeProvider {
|
|
8
|
+
constructor() {
|
|
9
|
+
this.timeOffset = 0;
|
|
10
|
+
}
|
|
11
|
+
moment(date) {
|
|
12
|
+
if (date) {
|
|
13
|
+
return (0, moment_1.default)(date);
|
|
14
|
+
}
|
|
15
|
+
return (0, moment_1.default)().add(this.timeOffset, 'ms');
|
|
16
|
+
}
|
|
17
|
+
jsDate(date) {
|
|
18
|
+
return this.moment(date).toDate();
|
|
19
|
+
}
|
|
20
|
+
addDays(offset) {
|
|
21
|
+
this.timeOffset += offset * 1000 * 3600 * 24;
|
|
22
|
+
}
|
|
23
|
+
addHours(offset) {
|
|
24
|
+
this.timeOffset += offset * 1000 * 3600;
|
|
25
|
+
}
|
|
26
|
+
resetTimeOffset() {
|
|
27
|
+
this.timeOffset = 0;
|
|
28
|
+
}
|
|
29
|
+
isDateSameOrBefore(beforeDate, date) {
|
|
30
|
+
return (0, moment_1.default)(beforeDate).isSameOrBefore(date);
|
|
31
|
+
}
|
|
32
|
+
add(date, measurement, value) {
|
|
33
|
+
return date.add(value, measurement);
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
exports.default = new TimeProvider();
|
|
37
|
+
//# sourceMappingURL=timeProvider.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"timeProvider.js","sourceRoot":"","sources":["../src/timeProvider.ts"],"names":[],"mappings":";;;;;AAAA,oDAA4B;AAE5B,MAAM,YAAY;IAEhB;QACE,IAAI,CAAC,UAAU,GAAG,CAAC,CAAC;IACtB,CAAC;IAED,MAAM,CAAC,IAAa;QAClB,IAAI,IAAI,EAAE;YACR,OAAO,IAAA,gBAAM,EAAC,IAAI,CAAC,CAAC;SACrB;QAED,OAAO,IAAA,gBAAM,GAAE,CAAC,GAAG,CAAC,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC;IAC7C,CAAC;IAED,MAAM,CAAC,IAAa;QAClB,OAAO,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,CAAC;IACpC,CAAC;IAED,OAAO,CAAC,MAAc;QACpB,IAAI,CAAC,UAAU,IAAI,MAAM,GAAG,IAAI,GAAG,IAAI,GAAG,EAAE,CAAC;IAC/C,CAAC;IAED,QAAQ,CAAC,MAAc;QACrB,IAAI,CAAC,UAAU,IAAI,MAAM,GAAG,IAAI,GAAG,IAAI,CAAC;IAC1C,CAAC;IAED,eAAe;QACb,IAAI,CAAC,UAAU,GAAG,CAAC,CAAC;IACtB,CAAC;IAED,kBAAkB,CAAC,UAAyC,EAAE,IAAmC;QAC/F,OAAO,IAAA,gBAAM,EAAC,UAAU,CAAC,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC;IACjD,CAAC;IAED,GAAG,CAAC,IAAI,EAAE,WAAW,EAAE,KAAK;QAC1B,OAAO,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,WAAW,CAAC,CAAC;IACtC,CAAC;CACF;AAED,kBAAe,IAAI,YAAY,EAAE,CAAC"}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
export type AccountType = "organization" | "user";
|
|
2
|
+
export type PermissionsMap = {
|
|
3
|
+
[Key: string]: true;
|
|
4
|
+
};
|
|
5
|
+
import { Request } from 'express';
|
|
6
|
+
import Account from '../entities/Account';
|
|
7
|
+
import ServiceHandlerBase from '../services/ServiceHandlerBase';
|
|
8
|
+
import ServerLogger from '../adapters/logger';
|
|
9
|
+
import ServiceFactoryBase from '../services/ServiceFactoryBase';
|
|
10
|
+
export { ServiceFactoryBase, ServiceHandlerBase, };
|
|
11
|
+
export interface IServiceExecutor {
|
|
12
|
+
executeService(serviceFolder: string, serviceName: string, requestData: any, request?: IAuthorizedRequest, permissions?: PermissionsMap): Promise<any>;
|
|
13
|
+
}
|
|
14
|
+
export interface ISessionData {
|
|
15
|
+
sessionId: string;
|
|
16
|
+
account: Account;
|
|
17
|
+
date: Date;
|
|
18
|
+
}
|
|
19
|
+
export interface IServiceHandler {
|
|
20
|
+
requestData: any;
|
|
21
|
+
selectData(): Object;
|
|
22
|
+
execute(data: any): Promise<any>;
|
|
23
|
+
Permissions: PermissionsMap;
|
|
24
|
+
}
|
|
25
|
+
export interface IServiceFactory {
|
|
26
|
+
getServiceDescription(): IServiceDescription;
|
|
27
|
+
createHandler(serviceExecutor: IServiceExecutor, request: IAuthorizedRequest, logger: ServerLogger): IServiceHandler;
|
|
28
|
+
}
|
|
29
|
+
export declare class IAuthorizedRequest {
|
|
30
|
+
session: ISessionData;
|
|
31
|
+
contextType: '' | 'user' | 'organization';
|
|
32
|
+
currentOrgPermissions: PermissionsMap;
|
|
33
|
+
originalRequest: Request;
|
|
34
|
+
}
|
|
35
|
+
export type RequestMethod = 'post' | 'get' | 'put' | 'delete' | 'options' | 'patch';
|
|
36
|
+
export type MulterSettings = {
|
|
37
|
+
type: 'single';
|
|
38
|
+
fieldName: string;
|
|
39
|
+
};
|
|
40
|
+
type EndpointContext = 'user' | 'organization' | 'any';
|
|
41
|
+
export interface IServiceDescription {
|
|
42
|
+
getBodyParser?: () => 'raw' | 'json';
|
|
43
|
+
getValidationRules?: (request?: IAuthorizedRequest) => Object;
|
|
44
|
+
getValidationRulesPerContext?: (request?: IAuthorizedRequest) => {
|
|
45
|
+
user: Object;
|
|
46
|
+
organization: Object;
|
|
47
|
+
};
|
|
48
|
+
getRequestMethod(): RequestMethod;
|
|
49
|
+
getRequestPathTemplate(): string;
|
|
50
|
+
isAuthorized(): boolean;
|
|
51
|
+
allowAnonymous(): boolean;
|
|
52
|
+
allowCors?: () => boolean;
|
|
53
|
+
getRequiredPermissions(): {
|
|
54
|
+
'user'?: {
|
|
55
|
+
myaccount: boolean;
|
|
56
|
+
};
|
|
57
|
+
'organization'?: string[];
|
|
58
|
+
'adminonly'?: boolean;
|
|
59
|
+
};
|
|
60
|
+
getEndpointContext(): EndpointContext;
|
|
61
|
+
getFileUploadSettings?: () => MulterSettings;
|
|
62
|
+
}
|
|
63
|
+
export type ServiceFactoriesMap = {
|
|
64
|
+
[Key: string]: Record<string, IServiceFactory>;
|
|
65
|
+
};
|
|
66
|
+
export type ServiceEventNames = {
|
|
67
|
+
[key: string]: string[];
|
|
68
|
+
};
|
|
69
|
+
export type ServicesList = {
|
|
70
|
+
serviceFactories: ServiceFactoriesMap;
|
|
71
|
+
serviceEventNames: ServiceEventNames;
|
|
72
|
+
};
|
|
@@ -0,0 +1,14 @@
|
|
|
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.IAuthorizedRequest = exports.ServiceHandlerBase = exports.ServiceFactoryBase = void 0;
|
|
7
|
+
const ServiceHandlerBase_1 = __importDefault(require("../services/ServiceHandlerBase"));
|
|
8
|
+
exports.ServiceHandlerBase = ServiceHandlerBase_1.default;
|
|
9
|
+
const ServiceFactoryBase_1 = __importDefault(require("../services/ServiceFactoryBase"));
|
|
10
|
+
exports.ServiceFactoryBase = ServiceFactoryBase_1.default;
|
|
11
|
+
class IAuthorizedRequest {
|
|
12
|
+
}
|
|
13
|
+
exports.IAuthorizedRequest = IAuthorizedRequest;
|
|
14
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":";;;;;;AAOA,wFAAgE;AAM9D,6BANK,4BAAkB,CAML;AAJpB,wFAAgE;AAG9D,6BAHK,4BAAkB,CAGL;AA8BpB,MAAa,kBAAkB;CAK9B;AALD,gDAKC"}
|
package/package.json
ADDED
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "starta.microservice",
|
|
3
|
+
"version": "0.1.2209",
|
|
4
|
+
"main": "./lib/index.js",
|
|
5
|
+
"description": "Core library for Starta.one microservice",
|
|
6
|
+
"author": "Collaboracia OÜ",
|
|
7
|
+
"license": "ISC",
|
|
8
|
+
"scripts": {
|
|
9
|
+
"build": "tsc",
|
|
10
|
+
"tsw": "tsc -w",
|
|
11
|
+
"format": "prettier --write \"src/**/*.ts\" \"src/**/*.js\"",
|
|
12
|
+
"lint": "tslint -p tsconfig.json",
|
|
13
|
+
"prepare": "npm run build"
|
|
14
|
+
},
|
|
15
|
+
"files": [
|
|
16
|
+
"lib/**/*"
|
|
17
|
+
],
|
|
18
|
+
"dependencies": {
|
|
19
|
+
"@types/aws-sdk": "^2.7.0",
|
|
20
|
+
"@types/multer": "^1.4.7",
|
|
21
|
+
"amqplib": "^0.10.3",
|
|
22
|
+
"auth-header": "^1.0.0",
|
|
23
|
+
"aws-sdk": "^2.1185.0",
|
|
24
|
+
"axios": "^0.24.0",
|
|
25
|
+
"co.validation": "^2.2.1",
|
|
26
|
+
"cors": "^2.8.5",
|
|
27
|
+
"crypto": "^1.0.1",
|
|
28
|
+
"express": "^4.18.2",
|
|
29
|
+
"express-session": "^1.17.3",
|
|
30
|
+
"extend": "^3.0.2",
|
|
31
|
+
"ioredis": "^5.2.4",
|
|
32
|
+
"jsondiffpatch": "0.1.43",
|
|
33
|
+
"language": "^0.4.0",
|
|
34
|
+
"mongodb": "^4.13.0",
|
|
35
|
+
"multer": "^1.4.2",
|
|
36
|
+
"multer-s3": "^2.10.0",
|
|
37
|
+
"path": "^0.12.7",
|
|
38
|
+
"redis-healthcheck": "^0.1.1",
|
|
39
|
+
"redlock": "^5.0.0-beta.2",
|
|
40
|
+
"winston": "^3.8.2",
|
|
41
|
+
"winston-daily-rotate-file": "^4.7.1"
|
|
42
|
+
},
|
|
43
|
+
"devDependencies": {
|
|
44
|
+
"@types/multer": "^1.4.4",
|
|
45
|
+
"@types/express": "^4.17.15",
|
|
46
|
+
"prettier": "^2.5.1",
|
|
47
|
+
"tslint": "^6.1.3",
|
|
48
|
+
"tslint-config-prettier": "^1.18.0",
|
|
49
|
+
"typescript": "^4.9.4"
|
|
50
|
+
}
|
|
51
|
+
}
|