@xitkov/core 2.4.9

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 (98) hide show
  1. package/README.md +256 -0
  2. package/lib/app.d.ts +75 -0
  3. package/lib/app.js +143 -0
  4. package/lib/app.js.map +1 -0
  5. package/lib/errors/index.d.ts +25 -0
  6. package/lib/errors/index.js +41 -0
  7. package/lib/errors/index.js.map +1 -0
  8. package/lib/hooks/business.d.ts +1 -0
  9. package/lib/hooks/business.js +26 -0
  10. package/lib/hooks/business.js.map +1 -0
  11. package/lib/hooks/hooks.d.ts +4 -0
  12. package/lib/hooks/hooks.js +66 -0
  13. package/lib/hooks/hooks.js.map +1 -0
  14. package/lib/hooks/index.d.ts +3 -0
  15. package/lib/hooks/index.js +20 -0
  16. package/lib/hooks/index.js.map +1 -0
  17. package/lib/hooks/types.d.ts +9 -0
  18. package/lib/hooks/types.js +3 -0
  19. package/lib/hooks/types.js.map +1 -0
  20. package/lib/index.d.ts +17 -0
  21. package/lib/index.js +23 -0
  22. package/lib/index.js.map +1 -0
  23. package/lib/libs/cache.d.ts +7 -0
  24. package/lib/libs/cache.js +22 -0
  25. package/lib/libs/cache.js.map +1 -0
  26. package/lib/libs/index.d.ts +5 -0
  27. package/lib/libs/index.js +22 -0
  28. package/lib/libs/index.js.map +1 -0
  29. package/lib/libs/logs.d.ts +5 -0
  30. package/lib/libs/logs.js +26 -0
  31. package/lib/libs/logs.js.map +1 -0
  32. package/lib/libs/queue.d.ts +21 -0
  33. package/lib/libs/queue.js +49 -0
  34. package/lib/libs/queue.js.map +1 -0
  35. package/lib/libs/socket.d.ts +8 -0
  36. package/lib/libs/socket.js +26 -0
  37. package/lib/libs/socket.js.map +1 -0
  38. package/lib/libs/utils.d.ts +8 -0
  39. package/lib/libs/utils.js +28 -0
  40. package/lib/libs/utils.js.map +1 -0
  41. package/lib/logger/index.d.ts +11 -0
  42. package/lib/logger/index.js +50 -0
  43. package/lib/logger/index.js.map +1 -0
  44. package/lib/services/auth.d.ts +19 -0
  45. package/lib/services/auth.js +41 -0
  46. package/lib/services/auth.js.map +1 -0
  47. package/lib/services/databases/index.d.ts +3 -0
  48. package/lib/services/databases/index.js +20 -0
  49. package/lib/services/databases/index.js.map +1 -0
  50. package/lib/services/databases/mongo-service.d.ts +26 -0
  51. package/lib/services/databases/mongo-service.js +55 -0
  52. package/lib/services/databases/mongo-service.js.map +1 -0
  53. package/lib/services/databases/postgres-service.d.ts +28 -0
  54. package/lib/services/databases/postgres-service.js +126 -0
  55. package/lib/services/databases/postgres-service.js.map +1 -0
  56. package/lib/services/databases/types.d.ts +26 -0
  57. package/lib/services/databases/types.js +3 -0
  58. package/lib/services/databases/types.js.map +1 -0
  59. package/lib/services/index.d.ts +6 -0
  60. package/lib/services/index.js +23 -0
  61. package/lib/services/index.js.map +1 -0
  62. package/lib/services/micro-service.d.ts +60 -0
  63. package/lib/services/micro-service.js +146 -0
  64. package/lib/services/micro-service.js.map +1 -0
  65. package/lib/services/register-micro-services.d.ts +1 -0
  66. package/lib/services/register-micro-services.js +41 -0
  67. package/lib/services/register-micro-services.js.map +1 -0
  68. package/lib/services/register-services.d.ts +5 -0
  69. package/lib/services/register-services.js +272 -0
  70. package/lib/services/register-services.js.map +1 -0
  71. package/lib/services/service.d.ts +46 -0
  72. package/lib/services/service.js +63 -0
  73. package/lib/services/service.js.map +1 -0
  74. package/package.json +49 -0
  75. package/src/app.ts +182 -0
  76. package/src/errors/index.ts +37 -0
  77. package/src/hooks/business.ts +23 -0
  78. package/src/hooks/hooks.ts +60 -0
  79. package/src/hooks/index.ts +3 -0
  80. package/src/hooks/types.ts +9 -0
  81. package/src/index.ts +18 -0
  82. package/src/libs/cache.ts +25 -0
  83. package/src/libs/index.ts +5 -0
  84. package/src/libs/logs.ts +21 -0
  85. package/src/libs/queue.ts +48 -0
  86. package/src/libs/socket.ts +28 -0
  87. package/src/libs/utils.ts +28 -0
  88. package/src/logger/index.ts +49 -0
  89. package/src/services/auth.ts +48 -0
  90. package/src/services/databases/index.ts +3 -0
  91. package/src/services/databases/mongo-service.ts +75 -0
  92. package/src/services/databases/postgres-service.ts +149 -0
  93. package/src/services/databases/types.ts +29 -0
  94. package/src/services/index.ts +6 -0
  95. package/src/services/micro-service.ts +188 -0
  96. package/src/services/register-micro-services.ts +37 -0
  97. package/src/services/register-services.ts +268 -0
  98. package/src/services/service.ts +118 -0
@@ -0,0 +1,272 @@
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 __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || function (mod) {
19
+ if (mod && mod.__esModule) return mod;
20
+ var result = {};
21
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
22
+ __setModuleDefault(result, mod);
23
+ return result;
24
+ };
25
+ var __importDefault = (this && this.__importDefault) || function (mod) {
26
+ return (mod && mod.__esModule) ? mod : { "default": mod };
27
+ };
28
+ var _a, _b, _c, _d, _e;
29
+ Object.defineProperty(exports, "__esModule", { value: true });
30
+ exports.registerServices = void 0;
31
+ // eslint-disable-next-line node/no-unsupported-features/node-builtins
32
+ const fs_1 = require("fs");
33
+ const path_1 = __importDefault(require("path"));
34
+ const express_1 = require("express");
35
+ const __1 = require("..");
36
+ const errors_1 = require("../errors");
37
+ const auth_1 = require("./auth");
38
+ async function validate(Validator, func, value) {
39
+ const schema = await Validator[func];
40
+ if (schema) {
41
+ try {
42
+ const schemaValue = await schema().validateAsync(value);
43
+ return schemaValue;
44
+ }
45
+ catch (err) {
46
+ throw new errors_1.BadRequest(err.message);
47
+ }
48
+ }
49
+ return value;
50
+ }
51
+ async function hooks(Hooks, func, parameters, methodName) {
52
+ var _a;
53
+ const allHooks = Hooks[func];
54
+ (_a = allHooks === null || allHooks === void 0 ? void 0 : allHooks.forEach) === null || _a === void 0 ? void 0 : _a.call(allHooks, (hook) => {
55
+ hook === null || hook === void 0 ? void 0 : hook(...parameters, methodName);
56
+ });
57
+ return allHooks;
58
+ }
59
+ function getJWTDecoded(accessToken) {
60
+ try {
61
+ const base64Url = accessToken.split('.')[1];
62
+ const decoded = Buffer.from(base64Url, 'base64').toString();
63
+ return JSON.parse(decoded);
64
+ }
65
+ catch (error) {
66
+ __1.Logger.error("getJWTDecoded", error);
67
+ return {};
68
+ }
69
+ }
70
+ async function registerServices(app, auth, database) {
71
+ var _a, _b, _c;
72
+ if (((_a = require.main) === null || _a === void 0 ? void 0 : _a.filename) == undefined) {
73
+ throw new Error("Please provide service path");
74
+ }
75
+ const appDir = path_1.default.dirname((_b = require.main) === null || _b === void 0 ? void 0 : _b.filename);
76
+ const serviceDirPath = appDir + '/services';
77
+ const servicesNames = (await fs_1.promises.readdir(serviceDirPath)).filter(file => !/^index\.(ts|js|d\.ts)$/.test(file) && !/\.map$/.test(file));
78
+ const methods = [
79
+ {
80
+ method: 'get',
81
+ url: '/',
82
+ func: 'find',
83
+ },
84
+ {
85
+ method: 'get',
86
+ url: '/:id',
87
+ func: 'get',
88
+ },
89
+ {
90
+ method: 'post',
91
+ url: '/',
92
+ func: 'create',
93
+ },
94
+ {
95
+ method: 'patch',
96
+ url: '/:id',
97
+ func: 'patch',
98
+ },
99
+ {
100
+ method: 'put',
101
+ url: '/:id',
102
+ func: 'update',
103
+ },
104
+ {
105
+ method: 'delete',
106
+ url: '/:id',
107
+ func: 'remove',
108
+ },
109
+ ];
110
+ const services = {};
111
+ for (const serviceName of servicesNames) {
112
+ const servicePath = `${serviceDirPath}/${serviceName}/service`;
113
+ const modelPath = `${serviceDirPath}/${serviceName}/model`;
114
+ const validatorPath = `${serviceDirPath}/${serviceName}/validator`;
115
+ const hooksPath = `${serviceDirPath}/${serviceName}/hooks`;
116
+ let Model = null;
117
+ let Validator = null;
118
+ let Hooks = null;
119
+ try {
120
+ if (database === null || database === void 0 ? void 0 : database.instance) {
121
+ Model = (await (_a = modelPath, Promise.resolve().then(() => __importStar(require(_a))))).default(database.instance);
122
+ }
123
+ else {
124
+ Model = (await (_b = modelPath, Promise.resolve().then(() => __importStar(require(_b))))).default;
125
+ }
126
+ }
127
+ catch (err) {
128
+ //
129
+ }
130
+ try {
131
+ Validator = new (await (_c = validatorPath, Promise.resolve().then(() => __importStar(require(_c))))).default;
132
+ }
133
+ catch (err) {
134
+ //
135
+ }
136
+ try {
137
+ Hooks = new (await (_d = hooksPath, Promise.resolve().then(() => __importStar(require(_d))))).default;
138
+ }
139
+ catch (err) {
140
+ //
141
+ }
142
+ const serviceConfig = {};
143
+ if (Model) {
144
+ serviceConfig.Model = Model;
145
+ }
146
+ serviceConfig.dialect = (_c = database === null || database === void 0 ? void 0 : database.dialect) !== null && _c !== void 0 ? _c : 'mongodb';
147
+ const service = new (await (_e = servicePath, Promise.resolve().then(() => __importStar(require(_e))))).default(serviceConfig);
148
+ services[serviceName] = service;
149
+ const router = (0, express_1.Router)();
150
+ for (const { method, url, func } of methods) {
151
+ const callback = async (req, res) => {
152
+ var _a, _b;
153
+ const { required, baseURL } = auth !== null && auth !== void 0 ? auth : {};
154
+ const { params, query, body, baseUrl, ...rest } = req;
155
+ try {
156
+ if (service.auth !== false) {
157
+ // TODO: Temp will find the better solution later
158
+ if (req.headers['internaltoken'] !== ((_a = process.env.INTERNAL_TOKEN) !== null && _a !== void 0 ? _a : 'internal_token')) {
159
+ if (required && baseURL) {
160
+ const authorization = req.headers['authorization'];
161
+ if (!authorization) {
162
+ throw new errors_1.Unauthorized("You don't have permission");
163
+ }
164
+ const authService = new auth_1.AuthService({
165
+ baseURL: baseURL,
166
+ axiosConfig: {
167
+ headers: {
168
+ Authorization: authorization
169
+ }
170
+ }
171
+ });
172
+ const authData = await authService.verify();
173
+ const { businessId } = authData !== null && authData !== void 0 ? authData : {};
174
+ const decodedAccessToken = getJWTDecoded(authorization);
175
+ const { business } = decodedAccessToken;
176
+ const userBusinessId = businessId !== null && businessId !== void 0 ? businessId : business;
177
+ if (!userBusinessId) {
178
+ throw new errors_1.Unauthorized("You don't have permission");
179
+ }
180
+ const userData = ((_b = req.user) !== null && _b !== void 0 ? _b : {});
181
+ req.user = { ...userData, userBusinessId };
182
+ }
183
+ }
184
+ }
185
+ const user = req.user;
186
+ const { id } = params;
187
+ let parameters = [];
188
+ let validatorValue;
189
+ switch (func) {
190
+ case 'find':
191
+ parameters = [query, user, req];
192
+ validatorValue = query;
193
+ break;
194
+ case 'get':
195
+ parameters = [id, query, user, req];
196
+ validatorValue = query;
197
+ break;
198
+ case 'create':
199
+ parameters = [body, query, user, req];
200
+ validatorValue = body;
201
+ break;
202
+ case 'patch':
203
+ parameters = [id, body, query, user, req];
204
+ validatorValue = body;
205
+ break;
206
+ case 'update':
207
+ parameters = [id, body, query, user, req];
208
+ validatorValue = body;
209
+ break;
210
+ case 'remove':
211
+ parameters = [id, query, user, req];
212
+ validatorValue = query;
213
+ break;
214
+ }
215
+ if (Hooks) {
216
+ await hooks(Hooks, 'all', parameters, func);
217
+ await hooks(Hooks, func, parameters, func);
218
+ }
219
+ if (service.filtering !== false && func === 'find') {
220
+ parameters[0] = (0, __1.addQuerySupport)(...parameters, func);
221
+ }
222
+ if (service[func] == undefined) {
223
+ return res.status(404).send({
224
+ message: "Not found"
225
+ });
226
+ }
227
+ if (Validator) {
228
+ await validate(Validator, func, validatorValue);
229
+ }
230
+ const response = await service[func](...parameters);
231
+ let data = response;
232
+ let count = undefined;
233
+ if (func === 'find' && data && !Array.isArray(data) && data.rows) {
234
+ count = data.count;
235
+ data = data.rows;
236
+ }
237
+ else if (response == null) {
238
+ if (id) {
239
+ return res.status(400).send({ message: `No record found for ${id}` });
240
+ }
241
+ return res.status(400).send({ message: 'Bad Request' });
242
+ }
243
+ return res.send({
244
+ message: "ok",
245
+ data,
246
+ count
247
+ });
248
+ }
249
+ catch (error) {
250
+ __1.Logger.error('Error', {
251
+ baseUrl,
252
+ url,
253
+ error,
254
+ message: error === null || error === void 0 ? void 0 : error.message
255
+ });
256
+ const status = error === null || error === void 0 ? void 0 : error.status;
257
+ const message = error === null || error === void 0 ? void 0 : error.message;
258
+ if (typeof status === 'number' && message) {
259
+ return res.status(status).send({ message });
260
+ }
261
+ return res.status(500).send({ message: 'Something went wrong' });
262
+ }
263
+ };
264
+ router[method](url, callback);
265
+ }
266
+ app.set('services', services);
267
+ app.use(`/${serviceName}`, router);
268
+ }
269
+ return services;
270
+ }
271
+ exports.registerServices = registerServices;
272
+ //# sourceMappingURL=register-services.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"register-services.js","sourceRoot":"","sources":["../../src/services/register-services.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,46 @@
1
+ import { Request, Response } from "express";
2
+ import { Model as MongoModel } from "mongoose";
3
+ import { ModelStatic as SequelizeModel } from 'sequelize';
4
+ import { Dialect } from "..";
5
+ import { FindResponse, InternalServiceMethods, Query, User } from './databases';
6
+ /**
7
+ * Augment via:
8
+ * declare module 'xitkov' {
9
+ * interface XitkovConfig { dialect: 'postgres' }
10
+ * }
11
+ */
12
+ export interface XitkovConfig {
13
+ }
14
+ export type DefaultDialect = XitkovConfig extends {
15
+ dialect: infer D;
16
+ } ? D extends Dialect ? D : 'mongodb' : 'mongodb';
17
+ type ModelType<T, U> = U extends 'postgres' ? SequelizeModel<any> : U extends "mongodb" ? MongoModel<T> : any;
18
+ export interface IXitovServiceProps {
19
+ Model: any;
20
+ dialect?: Dialect;
21
+ pagination?: boolean;
22
+ }
23
+ export declare class XitkovService<T, U extends Dialect = DefaultDialect> implements InternalServiceMethods<T> {
24
+ private service;
25
+ private Model;
26
+ pagination?: boolean;
27
+ static defaultDialect: Dialect;
28
+ static setDefaultDialect(dialect: Dialect): void;
29
+ constructor({ Model, dialect, pagination }: IXitovServiceProps);
30
+ find(query: Query, user?: any, req?: Request, res?: Response): Promise<FindResponse<T>>;
31
+ get(id: string | null, query?: Query, user?: User, req?: Request, res?: Response): Promise<T | null>;
32
+ create(data: Partial<T>, query?: Query, user?: User, req?: Request, res?: Response): Promise<T>;
33
+ create(data: Partial<T>[], query?: Query, user?: User, req?: Request, res?: Response): Promise<T[]>;
34
+ update(id: string, data: T, query?: Query, user?: User, req?: Request, res?: Response): Promise<T | null>;
35
+ patch(id: string, data: Partial<T>, query?: Query, user?: User, req?: Request, res?: Response): Promise<T | T[] | null>;
36
+ remove(id: string, query?: Query, user?: User, req?: Request, res?: Response): Promise<T | T[] | null>;
37
+ get model(): ModelType<T, U>;
38
+ _find(query: Query, user?: any, req?: Request, res?: Response): Promise<FindResponse<T>>;
39
+ _get(id: string | null, query?: Query, user?: User, req?: Request, res?: Response): Promise<T | null>;
40
+ _create(data: Partial<T>, query?: Query, user?: User, req?: Request, res?: Response): Promise<T>;
41
+ _create(data: Partial<T>[], query?: Query, user?: User, req?: Request, res?: Response): Promise<T[]>;
42
+ _update(id: string, data: T, query?: Query, user?: User, req?: Request, res?: Response): Promise<T | null>;
43
+ _patch(id: string, data: Partial<T>, query?: Query, user?: User, req?: Request, res?: Response): Promise<T | T[] | null>;
44
+ _remove(id: string, query?: Query, user?: User, req?: Request, res?: Response): Promise<T | T[] | null>;
45
+ }
46
+ export {};
@@ -0,0 +1,63 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.XitkovService = void 0;
4
+ const databases_1 = require("./databases");
5
+ class XitkovService {
6
+ static setDefaultDialect(dialect) {
7
+ XitkovService.defaultDialect = dialect;
8
+ }
9
+ constructor({ Model, dialect, pagination }) {
10
+ this.Model = Model;
11
+ const resolved = dialect !== null && dialect !== void 0 ? dialect : XitkovService.defaultDialect;
12
+ switch (resolved) {
13
+ case 'postgres':
14
+ this.service = new databases_1.PostgreSQLService({ Model, pagination });
15
+ break;
16
+ case 'mongodb':
17
+ default:
18
+ this.service = new databases_1.MongoDBService({ Model });
19
+ }
20
+ }
21
+ async find(query, user, req, res) {
22
+ return await this.service.find(query, user, req, res);
23
+ }
24
+ async get(id, query, user, req, res) {
25
+ return await this.service.get(id, query, user, req, res);
26
+ }
27
+ async create(data, query, user, req, res) {
28
+ return this.service.create(data, query, user, req, res);
29
+ }
30
+ async update(id, data, query, user, req, res) {
31
+ return await this.service.update(id, data, query, user, req, res);
32
+ }
33
+ async patch(id, data, query, user, req, res) {
34
+ return await this.service.patch(id, data, query, user, req, res);
35
+ }
36
+ async remove(id, query, user, req, res) {
37
+ return await this.service.remove(id, query, user, req, res);
38
+ }
39
+ get model() {
40
+ return this.Model;
41
+ }
42
+ async _find(query, user, req, res) {
43
+ return await this.service.find(query, user, req, res);
44
+ }
45
+ async _get(id, query, user, req, res) {
46
+ return await this.service.get(id, query, user, req, res);
47
+ }
48
+ async _create(data, query, user, req, res) {
49
+ return this.service.create(data, query, user, req, res);
50
+ }
51
+ async _update(id, data, query, user, req, res) {
52
+ return await this.service.update(id, data, query, user, req, res);
53
+ }
54
+ async _patch(id, data, query, user, req, res) {
55
+ return await this.service.patch(id, data, query, user, req, res);
56
+ }
57
+ async _remove(id, query, user, req, res) {
58
+ return await this.service.remove(id, query, user, req, res);
59
+ }
60
+ }
61
+ exports.XitkovService = XitkovService;
62
+ XitkovService.defaultDialect = 'mongodb';
63
+ //# sourceMappingURL=service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"service.js","sourceRoot":"","sources":["../../src/services/service.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,49 @@
1
+ {
2
+ "name": "@xitkov/core",
3
+ "version": "2.4.9",
4
+ "publishConfig": {
5
+ "access": "public"
6
+ },
7
+ "description": "",
8
+ "main": "lib/index.js",
9
+ "types": "lib/index.d.ts",
10
+ "files": [
11
+ "src",
12
+ "lib"
13
+ ],
14
+ "homepage": "https://gitlab.com/nixet/internal/nixetjs",
15
+ "license": "MIT",
16
+ "author": "Xitkov",
17
+ "keywords": [],
18
+ "scripts": {
19
+ "test": "jest",
20
+ "lint": "gts lint",
21
+ "clean": "gts clean",
22
+ "compile": "tsc",
23
+ "fix": "gts fix",
24
+ "prepare": "npm run compile"
25
+ },
26
+ "devDependencies": {
27
+ "@types/bull": "^3.15.9",
28
+ "@types/express": "^4.17.11",
29
+ "@types/jest": "^30.0.0",
30
+ "@types/mongoose": "^5.11.97",
31
+ "@types/node": "^14.11.2",
32
+ "gts": "^3.1.0",
33
+ "jest": "^30.4.2",
34
+ "sqlite3": "^6.0.1",
35
+ "ts-jest": "^29.4.11",
36
+ "typescript": "^4.0.3"
37
+ },
38
+ "dependencies": {
39
+ "@socket.io/redis-adapter": "^8.2.1",
40
+ "axios": "^0.26.1",
41
+ "bull": "^4.8.5",
42
+ "express": "^4.17.1",
43
+ "express-winston": "^4.2.0",
44
+ "ioredis": "^5.3.2",
45
+ "sequelize": "^6.28.0",
46
+ "socket.io": "^4.6.1",
47
+ "winston": "^3.8.2"
48
+ }
49
+ }
package/src/app.ts ADDED
@@ -0,0 +1,182 @@
1
+ import { Server } from 'http'
2
+ import EventEmitter from 'events';
3
+ import express, {Application} from 'express';
4
+ import {Server as SocketServer} from 'socket.io'
5
+ import { createAdapter } from '@socket.io/redis-adapter';
6
+ import Redis, { RedisOptions } from 'ioredis';
7
+ import {Logger, MicroServiceNames, ServiceTypes, Socket, SubMicroServiceNames} from '.';
8
+ import { MicroService, registerMicroServices, XitkovService } from './services';
9
+ import {registerServices} from './services/register-services';
10
+ import { Cache, InternalLogs } from './libs';
11
+ import { LoggerOptions } from 'express-winston';
12
+
13
+ export const EVENTS = {
14
+ SERVER_STARTED: 'SERVER_STARTED',
15
+ SERVICES_REGISTERED: 'SERVICES_REGISTERED',
16
+ }
17
+ export class Services {
18
+ private static services: ServiceTypes
19
+ static get<T extends keyof ServiceTypes>(service: T): ServiceTypes[T] {
20
+ return this.services[service];
21
+ }
22
+ static set(services: any){
23
+ Services.services = services
24
+ }
25
+ }
26
+
27
+ export interface IMicroServices {
28
+ [microService: string]: {
29
+ [service: string]: MicroService
30
+ }
31
+ }
32
+
33
+ export class MicroServices {
34
+ private static services: IMicroServices
35
+ static get<U extends keyof MicroServiceNames, T extends keyof SubMicroServiceNames>(microServiceName: U, service: T): MicroService {
36
+ return this.services[microServiceName][service];
37
+ }
38
+ static set(services: IMicroServices){
39
+ MicroServices.services = services
40
+ }
41
+ }
42
+
43
+ export const XitkovEvents = new EventEmitter()
44
+
45
+ export type Dialect = 'mongodb' | 'postgres'
46
+
47
+ export interface IExpressOptions {
48
+ limit?: string
49
+ }
50
+
51
+ export interface IAuth {
52
+ required: boolean,
53
+ baseURL: string
54
+ }
55
+
56
+ export interface ISocket {
57
+ enable: boolean
58
+ socketCorsOrigin: string
59
+ redis?: {
60
+ url?: string;
61
+ redisOptions?: RedisOptions
62
+ }
63
+ }
64
+ export interface Config {
65
+ app: Application
66
+ database?: {
67
+ dialect?: Dialect,
68
+ instance?: any
69
+ }
70
+ auth?: IAuth
71
+ socket?: ISocket
72
+ logger?: {
73
+ express?: Partial<LoggerOptions>
74
+ }
75
+ caching?: {
76
+ redisUrl: string
77
+ keyPrefix: string
78
+ redisOptions?: RedisOptions;
79
+ }
80
+ express?: IExpressOptions
81
+ }
82
+
83
+ export class Xitkov {
84
+ readonly app: Application;
85
+ readonly server: Server
86
+ readonly ready: Promise<void>
87
+
88
+ constructor(config: Config) {
89
+ const { app, database, express, auth, logger, socket, caching } = config
90
+ this.app = app
91
+ this.server = new Server(app)
92
+ this.init(express?.limit ?? '50mb', logger?.express)
93
+ this.initSocket(socket?.enable, socket?.redis, socket?.socketCorsOrigin)
94
+ this.ready = this.bootstrap(auth, database, caching)
95
+ }
96
+
97
+ static async create(config: Config): Promise<Xitkov> {
98
+ const instance = new Xitkov(config)
99
+ await instance.ready
100
+ return instance
101
+ }
102
+
103
+ private async bootstrap(auth: Config['auth'], database: Config['database'], caching: Config['caching']) {
104
+ if (database?.dialect) XitkovService.setDefaultDialect(database.dialect)
105
+ await this.initCache(caching)
106
+ const [microServices, services] = await Promise.all([
107
+ registerMicroServices(),
108
+ registerServices(this.app, auth, database),
109
+ ])
110
+ MicroServices.set(microServices)
111
+ Services.set(services)
112
+ XitkovEvents.emit(EVENTS.SERVICES_REGISTERED, true)
113
+ this.initExpress404()
114
+ const port = process.env.PORT ?? 3000
115
+ await new Promise<void>(resolve => {
116
+ this.server.listen(port, () => {
117
+ XitkovEvents.emit(EVENTS.SERVER_STARTED, port)
118
+ Logger.info(`Server Started ${port}`);
119
+ resolve()
120
+ });
121
+ })
122
+ }
123
+
124
+ private init(limit: string = "50mb", loggerOptions?: Partial<LoggerOptions>) {
125
+ this.app.use(InternalLogs.middleware(loggerOptions))
126
+ this.app.use(express.json({ limit }))
127
+ }
128
+
129
+ private initExpress404() {
130
+ this.app.get('/healthz', (_, res) => {
131
+ return res.status(200).send({
132
+ message: "ok",
133
+ status: 200
134
+ });
135
+ });
136
+
137
+ this.app.use((req, res) => {
138
+ return res.status(404).send({
139
+ message: "Not found"
140
+ });
141
+ })
142
+ }
143
+
144
+ private initSocket(enable?: boolean, redis?: ISocket['redis'], socketCorsOrigin?: string) {
145
+ if (enable) {
146
+ Socket.io = new SocketServer(this.server, {
147
+ cors: {
148
+ origin: socketCorsOrigin
149
+ }
150
+ })
151
+ if (redis) {
152
+ let pubClient: Redis;
153
+ if (redis?.url) {
154
+ pubClient = new Redis(redis?.url);
155
+ } else {
156
+ pubClient = new Redis(redis.redisOptions ?? {});
157
+ }
158
+ if (pubClient) {
159
+ const subClient = pubClient.duplicate();
160
+ Socket.io.adapter(createAdapter(pubClient, subClient));
161
+ Logger.info("Redis added to socket")
162
+ }
163
+ }
164
+ }
165
+ }
166
+ private initCache(caching: Config['caching']): Promise<void> {
167
+ if (!caching) return Promise.resolve()
168
+ const { redisUrl, keyPrefix, redisOptions = {} } = caching
169
+ Cache.client = new Redis(redisUrl, { keyPrefix, ...redisOptions });
170
+ return new Promise<void>(resolve => {
171
+ let settled = false
172
+ Cache.client.once('connect', () => {
173
+ Logger.info('Successfully connected to Redis Cache');
174
+ if (!settled) { settled = true; resolve() }
175
+ });
176
+ Cache.client.on('error', (error: any) => {
177
+ Logger.error('Unable to connect to Redis Cache', { error });
178
+ if (!settled) { settled = true; resolve() }
179
+ });
180
+ })
181
+ }
182
+ }
@@ -0,0 +1,37 @@
1
+ export class XitkovError extends Error {
2
+ readonly status: number;
3
+ constructor(message: string, status: number) {
4
+ super(message);
5
+ this.name = new.target.name;
6
+ this.status = status;
7
+ Object.setPrototypeOf(this, new.target.prototype);
8
+ }
9
+ }
10
+
11
+ export class BadRequest extends XitkovError {
12
+ constructor(message: string) { super(message, 400); }
13
+ }
14
+
15
+ export class NoContent extends XitkovError {
16
+ constructor(message: string) { super(message, 204); }
17
+ }
18
+
19
+ export class InternalServer extends XitkovError {
20
+ constructor(message: string) { super(message, 500); }
21
+ }
22
+
23
+ export class Unauthorized extends XitkovError {
24
+ constructor(message: string) { super(message, 401); }
25
+ }
26
+
27
+ export class PaymentRequired extends XitkovError {
28
+ constructor(message: string) { super(message, 402); }
29
+ }
30
+
31
+ export class Forbidden extends XitkovError {
32
+ constructor(message: string) { super(message, 403); }
33
+ }
34
+
35
+ export class NotFound extends XitkovError {
36
+ constructor(message: string) { super(message, 404); }
37
+ }