linker-api 1.0.0 → 1.0.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.
@@ -0,0 +1,56 @@
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.ExposeApi = void 0;
7
+ const fs_1 = __importDefault(require("fs"));
8
+ class ExposeApi {
9
+ constructor(AppConfig) {
10
+ this.AppConfig = AppConfig;
11
+ }
12
+ registerControllers(apiDir, config) {
13
+ apiDir = apiDir.replace('server', '');
14
+ let apiScanned = this.AppConfig.API_SCAN;
15
+ for (let scanned of apiScanned) {
16
+ let controllerDir = `${apiDir}/dist/${scanned}`;
17
+ //console.log(`controllerDir : ${controllerDir}`)
18
+ if (fs_1.default.existsSync(controllerDir)) {
19
+ let cntrlFiles = this.getFiles(controllerDir);
20
+ //console.log(`cntrlFiles : ${cntrlFiles}`)
21
+ for (let i in cntrlFiles) {
22
+ let cntrlFile = cntrlFiles[i];
23
+ let cntrlClass = require(cntrlFile);
24
+ if (typeof (Object.values(cntrlClass)[0]) === 'function')
25
+ config.register(Object.values(cntrlClass)[0]);
26
+ }
27
+ }
28
+ }
29
+ }
30
+ getFiles(dir, files_) {
31
+ files_ = files_ || [];
32
+ var files;
33
+ try {
34
+ files = fs_1.default.readdirSync(dir);
35
+ }
36
+ catch (err) {
37
+ }
38
+ if (!files) {
39
+ files = [];
40
+ }
41
+ for (var i in files) {
42
+ let file = files[i];
43
+ var name = dir + '/' + file;
44
+ if (fs_1.default.statSync(name).isDirectory()) {
45
+ this.getFiles(name, files_);
46
+ }
47
+ else {
48
+ if (file.endsWith('.js'))
49
+ files_.push(name);
50
+ }
51
+ }
52
+ return files_;
53
+ }
54
+ }
55
+ exports.ExposeApi = ExposeApi;
56
+ //# sourceMappingURL=expose-api.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"expose-api.js","sourceRoot":"","sources":["../../../src/lib/container/expose-api.ts"],"names":[],"mappings":";;;;;;AAAA,4CAAoB;AACpB,MAAa,SAAS;IAClB,YAAoB,SAAa;QAAb,cAAS,GAAT,SAAS,CAAI;IAAE,CAAC;IACpC,mBAAmB,CAAC,MAAM,EAAE,MAAM;QAC9B,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;QACtC,IAAI,UAAU,GAAG,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC;QACzC,KAAI,IAAI,OAAO,IAAI,UAAU,EAAC,CAAC;YAC3B,IAAI,aAAa,GAAG,GAAG,MAAM,SAAS,OAAO,EAAE,CAAC;YAChD,iDAAiD;YACjD,IAAG,YAAE,CAAC,UAAU,CAAC,aAAa,CAAC,EAAC,CAAC;gBAC7B,IAAI,UAAU,GAAG,IAAI,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAC;gBAC9C,2CAA2C;gBAC3C,KAAI,IAAI,CAAC,IAAI,UAAU,EAAC,CAAC;oBACrB,IAAI,SAAS,GAAG,UAAU,CAAC,CAAC,CAAC,CAAC;oBAC9B,IAAI,UAAU,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC;oBACpC,IAAG,OAAM,CAAC,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,UAAU;wBAClD,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;gBACtD,CAAC;YACL,CAAC;QACL,CAAC;IACL,CAAC;IACD,QAAQ,CAAE,GAAG,EAAE,MAAO;QAClB,MAAM,GAAG,MAAM,IAAI,EAAE,CAAC;QACtB,IAAI,KAAK,CAAC;QACV,IAAG,CAAC;YACA,KAAK,GAAG,YAAE,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;QAChC,CAAC;QAAA,OAAM,GAAG,EAAC,CAAC;QACZ,CAAC;QACD,IAAG,CAAC,KAAK,EAAC,CAAC;YACP,KAAK,GAAG,EAAE,CAAC;QACf,CAAC;QACD,KAAK,IAAI,CAAC,IAAI,KAAK,EAAC,CAAC;YACjB,IAAI,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;YACpB,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC;YAC5B,IAAI,YAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,WAAW,EAAE,EAAC,CAAC;gBACjC,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;YAChC,CAAC;iBAAM,CAAC;gBACJ,IAAG,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC;oBACvB,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACtB,CAAC;QACL,CAAC;QACD,OAAO,MAAM,CAAC;IAClB,CAAC;CACJ;AA1CD,8BA0CC"}
@@ -0,0 +1,194 @@
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
+ exports.ServiceContext = void 0;
13
+ class ServiceContext {
14
+ constructor(app, express, authorizer) {
15
+ this.app = app;
16
+ this.express = express;
17
+ this.authorizer = authorizer;
18
+ this.serviceMap = {};
19
+ this.SchemaConfig = [];
20
+ }
21
+ register(controllerClass) {
22
+ var _a, _b;
23
+ try {
24
+ //console.log(`registration of controllers ${controllerClass.name}`)
25
+ //console.log(`Controller metadata OLD: ${JSON.stringify(controllerClass.prototype)}`)
26
+ let controller = new controllerClass(this.app);
27
+ let cntrlMetadata = controllerClass.prototype;
28
+ let cntrlUri = (_a = cntrlMetadata.metadata) === null || _a === void 0 ? void 0 : _a.baseUri;
29
+ if (cntrlUri) {
30
+ //let controller = new controllerClass(app);
31
+ //console.log(`Controller metadata: ${controller.metadata}`)
32
+ //console.log(`Controller method metadata: ${JSON.stringify(controller['getDispensaryEmployees'])}`)
33
+ if (controller.metadata) {
34
+ let router = this.express.Router();
35
+ this.serviceMap[controller.metadata.baseUri] = controller;
36
+ controller.request = this.request.bind(this);
37
+ if (!controller.router) {
38
+ //console.log(`registration of controllers ${controller.metadata.baseUri}`)
39
+ if (controller.metadata.baseUri)
40
+ this.app.use(controller.metadata.baseUri, router);
41
+ controller.router = router;
42
+ }
43
+ }
44
+ }
45
+ controller.getSchemaConfig = () => {
46
+ return this.SchemaConfig;
47
+ };
48
+ let schema = (_b = cntrlMetadata.metadata) === null || _b === void 0 ? void 0 : _b.schema;
49
+ if (schema) {
50
+ this.addSchemaConfig(schema);
51
+ }
52
+ //console.log(`Controller router: ${controller}`)
53
+ let protoOfTest = Object.getPrototypeOf(controller);
54
+ let methodMap = Object.getOwnPropertyNames(protoOfTest).filter(item => !['constructor', 'metadata'].includes(item));
55
+ for (let idx = 0; idx < methodMap.length; idx++) {
56
+ let method = methodMap[idx];
57
+ if (schema) {
58
+ this.addSchemaMethod(method, controller, schema);
59
+ }
60
+ if ((schema === null || schema === void 0 ? void 0 : schema.id) !== 'common') {
61
+ this.registerMethod(method, controller, controller.router);
62
+ }
63
+ }
64
+ //console.log('controller.metadata.baseUri '+controller.metadata?.baseUri);
65
+ //console.log('register Controller :: '+controller?.router?.stack);
66
+ if ((schema === null || schema === void 0 ? void 0 : schema.id) === 'common') {
67
+ this.commonService = controller;
68
+ }
69
+ }
70
+ catch (err) {
71
+ console.log('register Controller Error :: ' + err.stack);
72
+ }
73
+ }
74
+ addSchemaConfig(schema) {
75
+ //console.log(`schema `, schema)
76
+ let idx = this.SchemaConfig.findIndex(item => (item === null || item === void 0 ? void 0 : item.id) === schema.id);
77
+ if (idx === -1) {
78
+ if (this.commonService) {
79
+ schema.table = schema.table.concat(this.commonService.getSchemaConfig()[0].table);
80
+ }
81
+ this.SchemaConfig.push(schema);
82
+ }
83
+ }
84
+ addPreProcessor(metadata, controller, schema) {
85
+ let table = schema.table.find(item => (item === null || item === void 0 ? void 0 : item.id) === metadata.uriMethod);
86
+ if (table) {
87
+ if (!table.preProcessors)
88
+ table.preProcessors = [];
89
+ table.preProcessors.push(controller[metadata.actualMethod].bind(controller));
90
+ }
91
+ }
92
+ addPostProcessor(metadata, controller, schema) {
93
+ let table = schema.table.find(item => (item === null || item === void 0 ? void 0 : item.id) === metadata.uriMethod);
94
+ if (table) {
95
+ if (!table.postProcessors)
96
+ table.postProcessors = [];
97
+ table.postProcessors.push(controller[metadata.actualMethod].bind(controller));
98
+ }
99
+ }
100
+ addSchemaMethod(method, controller, schema) {
101
+ let metadata = controller[method].metadata;
102
+ //console.log('metadata ', metadata)
103
+ if (metadata === null || metadata === void 0 ? void 0 : metadata.isExecutor) {
104
+ let idx = schema.table.findIndex(elem => (elem === null || elem === void 0 ? void 0 : elem.id) === metadata.uriPath);
105
+ if (idx === -1) {
106
+ //console.log('isExecutor')
107
+ schema.table.push({
108
+ id: metadata.uriPath.replace('/', ''),
109
+ executor: controller[metadata.actualMethod].bind(controller)
110
+ });
111
+ }
112
+ }
113
+ if (metadata === null || metadata === void 0 ? void 0 : metadata.isPreProcessor) {
114
+ this.addPreProcessor(metadata, controller, schema);
115
+ }
116
+ if (metadata === null || metadata === void 0 ? void 0 : metadata.isPostProcessor) {
117
+ this.addPostProcessor(metadata, controller, schema);
118
+ }
119
+ }
120
+ registerMethod(method, controller, router) {
121
+ let metadata = controller[method].metadata;
122
+ //console.log('registerMethod :: '+method);
123
+ /*if(controllerClass.name === 'Master' && metadata){
124
+ console.log(`Controller method metadata: ${JSON.stringify(metadata)}`)
125
+ console.log(`Controller method metadata: ${controller[method]}`)
126
+ }*/
127
+ let secureCallback = this.authorizer; //Middleware.verifyToken.bind(Middleware);
128
+ if (metadata && router) {
129
+ //console.log(`metadata `, metadata)
130
+ //console.log(`metadata.unsecured ${metadata.unsecured}`)
131
+ if (metadata.unsecured || !this.authorizer) {
132
+ secureCallback = (req, res, next) => { next(); };
133
+ }
134
+ let callerMethod = (req, res, next) => {
135
+ controller[method].apply(controller, [req, res, next]);
136
+ };
137
+ //let callerMethod = controller[method].bind(controller);
138
+ switch (metadata.uriMethod) {
139
+ case 'post':
140
+ router.post(metadata.uriPath, secureCallback, callerMethod);
141
+ break;
142
+ case 'put':
143
+ router.put(metadata.uriPath, secureCallback, callerMethod);
144
+ break;
145
+ case 'delete':
146
+ router.delete(metadata.uriPath, secureCallback, callerMethod);
147
+ break;
148
+ case 'get':
149
+ router.get(metadata.uriPath, secureCallback, callerMethod);
150
+ break;
151
+ default:
152
+ router.get(metadata.uriPath, secureCallback, callerMethod);
153
+ }
154
+ }
155
+ }
156
+ request(options) {
157
+ return __awaiter(this, void 0, void 0, function* () {
158
+ let uris = options.url.split('/');
159
+ let controller = this.serviceMap[`/${uris[1]}`];
160
+ let component;
161
+ let req = {
162
+ attributes: options.attributes,
163
+ body: options.body,
164
+ headers: options.headers,
165
+ method: options.method
166
+ };
167
+ if (!controller) {
168
+ controller = this.serviceMap[`/`];
169
+ component = controller.router.stack.find(item => item.route.path === `/:service/:operation`);
170
+ req.params = { service: uris[1], operation: uris[2] };
171
+ }
172
+ if (controller && !component) {
173
+ component = controller.router.stack.find(item => item.route.path === `/${uris[2]}`);
174
+ }
175
+ if (component) {
176
+ req.path = component.route.path;
177
+ return new Promise((resolve, reject) => {
178
+ let result = {
179
+ send: (data) => {
180
+ resolve(data);
181
+ },
182
+ status: (status) => {
183
+ return result;
184
+ }
185
+ };
186
+ component.handle(req, result);
187
+ });
188
+ }
189
+ return { status: 1 };
190
+ });
191
+ }
192
+ }
193
+ exports.ServiceContext = ServiceContext;
194
+ //# sourceMappingURL=service-context.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"service-context.js","sourceRoot":"","sources":["../../../src/lib/container/service-context.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,28 @@
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.AppLogger = void 0;
7
+ const fs_1 = __importDefault(require("fs"));
8
+ const nebula_node_logger_1 = __importDefault(require("nebula-node-logger"));
9
+ class AppLogger {
10
+ constructor(customerId) {
11
+ let appLogDir = `./appLogs/`;
12
+ if (!fs_1.default.existsSync(appLogDir)) {
13
+ fs_1.default.mkdirSync(appLogDir, { recursive: true });
14
+ }
15
+ const opts = {
16
+ errorEventName: 'error',
17
+ logDirectory: appLogDir, // NOTE: folder must exist and be writable...
18
+ fileNamePattern: `${customerId}-<DATE>.log`,
19
+ dateFormat: 'YYYY.MM.DD-HHa'
20
+ };
21
+ const log = nebula_node_logger_1.default.createRollingFileLogger(opts);
22
+ console.log = log.info;
23
+ console.error = log.error;
24
+ console.debug = log.debug;
25
+ }
26
+ }
27
+ exports.AppLogger = AppLogger;
28
+ //# sourceMappingURL=app-logger.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"app-logger.js","sourceRoot":"","sources":["../../../src/lib/logger/app-logger.ts"],"names":[],"mappings":";;;;;;AAAA,4CAAoB;AACpB,4EAA4C;AAC5C,MAAa,SAAS;IAClB,YAAY,UAAU;QAClB,IAAI,SAAS,GAAG,YAAY,CAAC;QAC7B,IAAG,CAAC,YAAE,CAAC,UAAU,CAAC,SAAS,CAAC,EAAC,CAAC;YAC1B,YAAE,CAAC,SAAS,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACjD,CAAC;QACD,MAAM,IAAI,GAAG;YACT,cAAc,EAAC,OAAO;YAClB,YAAY,EAAE,SAAS,EAAE,6CAA6C;YACtE,eAAe,EAAC,GAAG,UAAU,aAAa;YAC1C,UAAU,EAAC,gBAAgB;SAClC,CAAC;QACF,MAAM,GAAG,GAAG,4BAAU,CAAC,uBAAuB,CAAE,IAAI,CAAE,CAAC;QACvD,OAAO,CAAC,GAAG,GAAG,GAAG,CAAC,IAAI,CAAC;QACvB,OAAO,CAAC,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC;QAC1B,OAAO,CAAC,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC;IAC9B,CAAC;CACJ;AAjBD,8BAiBC"}
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  /*
3
- * Public API Surface of tharak-core-utils
3
+ * Public API Surface of linker-api
4
4
  */
5
5
  var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
6
6
  if (k2 === undefined) k2 = k;
@@ -18,4 +18,7 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
18
18
  };
19
19
  Object.defineProperty(exports, "__esModule", { value: true });
20
20
  __exportStar(require("./lib/factory/factory"), exports);
21
+ __exportStar(require("./lib/logger/app-logger"), exports);
22
+ __exportStar(require("./lib/container/expose-api"), exports);
23
+ __exportStar(require("./lib/container/service-context"), exports);
21
24
  //# sourceMappingURL=public-api.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"public-api.js","sourceRoot":"","sources":["../src/public-api.ts"],"names":[],"mappings":";AAAA;;GAEG;;;;;;;;;;;;;;;;AAEH,wDAAsC"}
1
+ {"version":3,"file":"public-api.js","sourceRoot":"","sources":["../src/public-api.ts"],"names":[],"mappings":";AAAA;;GAEG;;;;;;;;;;;;;;;;AAEH,wDAAsC;AACtC,0DAAwC;AACxC,6DAA2C;AAC3C,kEAAgD"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "linker-api",
3
- "version": "1.0.0",
3
+ "version": "1.0.1",
4
4
  "description": "",
5
5
  "main": "./dist/public-api.js",
6
6
  "typings": "./dist/index.d.ts",
@@ -24,6 +24,7 @@
24
24
  "@types/node": "^20.12.7",
25
25
  "fs-extra": "^11.3.2",
26
26
  "mssql": "^12.0.0",
27
+ "nebula-node-logger": "^0.0.1",
27
28
  "rimraf": "^6.1.0",
28
29
  "tharak-api": "^0.0.7",
29
30
  "typescript": "^5.4.5"
@@ -0,0 +1,44 @@
1
+ import fs from 'fs';
2
+ export class ExposeApi {
3
+ constructor(private AppConfig:any){}
4
+ registerControllers(apiDir, config){
5
+ apiDir = apiDir.replace('server', '');
6
+ let apiScanned = this.AppConfig.API_SCAN;
7
+ for(let scanned of apiScanned){
8
+ let controllerDir = `${apiDir}/dist/${scanned}`;
9
+ //console.log(`controllerDir : ${controllerDir}`)
10
+ if(fs.existsSync(controllerDir)){
11
+ let cntrlFiles = this.getFiles(controllerDir);
12
+ //console.log(`cntrlFiles : ${cntrlFiles}`)
13
+ for(let i in cntrlFiles){
14
+ let cntrlFile = cntrlFiles[i];
15
+ let cntrlClass = require(cntrlFile);
16
+ if(typeof(Object.values(cntrlClass)[0]) === 'function')
17
+ config.register(Object.values(cntrlClass)[0]);
18
+ }
19
+ }
20
+ }
21
+ }
22
+ getFiles (dir, files_?){
23
+ files_ = files_ || [];
24
+ var files;
25
+ try{
26
+ files = fs.readdirSync(dir);
27
+ }catch(err){
28
+ }
29
+ if(!files){
30
+ files = [];
31
+ }
32
+ for (var i in files){
33
+ let file = files[i];
34
+ var name = dir + '/' + file;
35
+ if (fs.statSync(name).isDirectory()){
36
+ this.getFiles(name, files_);
37
+ } else {
38
+ if(file.endsWith('.js'))
39
+ files_.push(name);
40
+ }
41
+ }
42
+ return files_;
43
+ }
44
+ }
@@ -0,0 +1,174 @@
1
+ export class ServiceContext {
2
+ serviceMap = {};
3
+ SchemaConfig = [];
4
+ commonService;
5
+ constructor(private app, private express, private authorizer){}
6
+ register(controllerClass){
7
+ try{
8
+ //console.log(`registration of controllers ${controllerClass.name}`)
9
+ //console.log(`Controller metadata OLD: ${JSON.stringify(controllerClass.prototype)}`)
10
+ let controller = new controllerClass(this.app);
11
+ let cntrlMetadata = controllerClass.prototype;
12
+ let cntrlUri = cntrlMetadata.metadata?.baseUri;
13
+
14
+ if(cntrlUri){
15
+ //let controller = new controllerClass(app);
16
+ //console.log(`Controller metadata: ${controller.metadata}`)
17
+ //console.log(`Controller method metadata: ${JSON.stringify(controller['getDispensaryEmployees'])}`)
18
+ if(controller.metadata){
19
+ let router = this.express.Router();
20
+ this.serviceMap[controller.metadata.baseUri] = controller;
21
+ controller.request = this.request.bind(this);
22
+ if(!controller.router){
23
+ //console.log(`registration of controllers ${controller.metadata.baseUri}`)
24
+ if(controller.metadata.baseUri)
25
+ this.app.use(controller.metadata.baseUri, router);
26
+ controller.router = router;
27
+ }
28
+ }
29
+ }
30
+ controller.getSchemaConfig = ()=>{
31
+ return this.SchemaConfig;
32
+ }
33
+ let schema = cntrlMetadata.metadata?.schema;
34
+ if(schema){
35
+ this.addSchemaConfig(schema);
36
+ }
37
+ //console.log(`Controller router: ${controller}`)
38
+ let protoOfTest = Object.getPrototypeOf(controller);
39
+ let methodMap = Object.getOwnPropertyNames(protoOfTest).filter(item=>!['constructor', 'metadata'].includes(item));
40
+ for(let idx=0; idx<methodMap.length; idx++){
41
+ let method = methodMap[idx];
42
+ if(schema){
43
+ this.addSchemaMethod(method, controller, schema);
44
+ }
45
+ if(schema?.id !== 'common'){
46
+ this.registerMethod(method, controller, controller.router);
47
+ }
48
+ }
49
+ //console.log('controller.metadata.baseUri '+controller.metadata?.baseUri);
50
+ //console.log('register Controller :: '+controller?.router?.stack);
51
+ if(schema?.id === 'common'){
52
+ this.commonService = controller;
53
+ }
54
+ }catch(err){
55
+ console.log('register Controller Error :: '+err.stack);
56
+ }
57
+ }
58
+ addSchemaConfig(schema){
59
+ //console.log(`schema `, schema)
60
+ let idx = this.SchemaConfig.findIndex(item=>item?.id === schema.id);
61
+ if(idx === -1){
62
+ if(this.commonService){
63
+ schema.table = schema.table.concat(this.commonService.getSchemaConfig()[0].table)
64
+ }
65
+ this.SchemaConfig.push(schema);
66
+ }
67
+ }
68
+ addPreProcessor(metadata, controller, schema){
69
+ let table = schema.table.find(item=>item?.id === metadata.uriMethod);
70
+ if(table){
71
+ if(!table.preProcessors)
72
+ table.preProcessors = []
73
+ table.preProcessors.push(controller[metadata.actualMethod].bind(controller));
74
+ }
75
+ }
76
+ addPostProcessor(metadata, controller, schema){
77
+ let table = schema.table.find(item=>item?.id === metadata.uriMethod);
78
+ if(table){
79
+ if(!table.postProcessors)
80
+ table.postProcessors = []
81
+ table.postProcessors.push(controller[metadata.actualMethod].bind(controller));
82
+ }
83
+ }
84
+ addSchemaMethod(method, controller, schema){
85
+ let metadata = controller[method].metadata;
86
+ //console.log('metadata ', metadata)
87
+ if(metadata?.isExecutor){
88
+ let idx = schema.table.findIndex(elem=>elem?.id === metadata.uriPath)
89
+ if(idx === -1){
90
+ //console.log('isExecutor')
91
+ schema.table.push({
92
+ id: metadata.uriPath.replace('/',''),
93
+ executor: controller[metadata.actualMethod].bind(controller)
94
+ });
95
+ }
96
+ }
97
+ if(metadata?.isPreProcessor){
98
+ this.addPreProcessor(metadata, controller, schema);
99
+ }
100
+ if(metadata?.isPostProcessor){
101
+ this.addPostProcessor(metadata, controller, schema);
102
+ }
103
+ }
104
+ registerMethod(method, controller, router){
105
+ let metadata = controller[method].metadata;
106
+ //console.log('registerMethod :: '+method);
107
+ /*if(controllerClass.name === 'Master' && metadata){
108
+ console.log(`Controller method metadata: ${JSON.stringify(metadata)}`)
109
+ console.log(`Controller method metadata: ${controller[method]}`)
110
+ }*/
111
+ let secureCallback = this.authorizer;//Middleware.verifyToken.bind(Middleware);
112
+ if(metadata && router){
113
+ //console.log(`metadata `, metadata)
114
+ //console.log(`metadata.unsecured ${metadata.unsecured}`)
115
+ if(metadata.unsecured || !this.authorizer){
116
+ secureCallback = (req, res, next)=>{ next(); }
117
+ }
118
+ let callerMethod = (req, res, next)=>{
119
+ controller[method].apply(controller, [req, res, next]);
120
+ }
121
+ //let callerMethod = controller[method].bind(controller);
122
+ switch (metadata.uriMethod) {
123
+ case 'post':
124
+ router.post(metadata.uriPath, secureCallback, callerMethod);
125
+ break;
126
+ case 'put':
127
+ router.put(metadata.uriPath, secureCallback, callerMethod);
128
+ break;
129
+ case 'delete':
130
+ router.delete(metadata.uriPath, secureCallback, callerMethod);
131
+ break;
132
+ case 'get':
133
+ router.get(metadata.uriPath, secureCallback, callerMethod);
134
+ break;
135
+ default:
136
+ router.get(metadata.uriPath, secureCallback, callerMethod);
137
+ }
138
+ }
139
+ }
140
+ async request(options){
141
+ let uris = options.url.split('/');
142
+ let controller = this.serviceMap[`/${uris[1]}`];
143
+ let component;
144
+ let req:any = {
145
+ attributes: options.attributes,
146
+ body: options.body,
147
+ headers: options.headers,
148
+ method: options.method
149
+ };
150
+ if(!controller){
151
+ controller = this.serviceMap[`/`];
152
+ component = controller.router.stack.find(item=>item.route.path === `/:service/:operation`);
153
+ req.params = {service: uris[1], operation: uris[2]};
154
+ }
155
+ if(controller && !component){
156
+ component = controller.router.stack.find(item=>item.route.path === `/${uris[2]}`);
157
+ }
158
+ if(component){
159
+ req.path= component.route.path;
160
+ return new Promise((resolve, reject)=>{
161
+ let result = {
162
+ send: (data)=>{
163
+ resolve(data);
164
+ },
165
+ status: (status)=>{
166
+ return result;
167
+ }
168
+ };
169
+ component.handle(req, result);
170
+ })
171
+ }
172
+ return {status: 1};
173
+ }
174
+ }
@@ -0,0 +1,20 @@
1
+ import fs from 'fs';
2
+ import nodeLogger from 'nebula-node-logger';
3
+ export class AppLogger {
4
+ constructor(customerId){
5
+ let appLogDir = `./appLogs/`;
6
+ if(!fs.existsSync(appLogDir)){
7
+ fs.mkdirSync(appLogDir, { recursive: true });
8
+ }
9
+ const opts = {
10
+ errorEventName:'error',
11
+ logDirectory: appLogDir, // NOTE: folder must exist and be writable...
12
+ fileNamePattern:`${customerId}-<DATE>.log`,
13
+ dateFormat:'YYYY.MM.DD-HHa'
14
+ };
15
+ const log = nodeLogger.createRollingFileLogger( opts );
16
+ console.log = log.info;
17
+ console.error = log.error;
18
+ console.debug = log.debug;
19
+ }
20
+ }
package/src/public-api.ts CHANGED
@@ -1,5 +1,8 @@
1
1
  /*
2
- * Public API Surface of tharak-core-utils
2
+ * Public API Surface of linker-api
3
3
  */
4
4
 
5
- export * from './lib/factory/factory';
5
+ export * from './lib/factory/factory';
6
+ export * from './lib/logger/app-logger';
7
+ export * from './lib/container/expose-api';
8
+ export * from './lib/container/service-context';