@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.
- package/README.md +256 -0
- package/lib/app.d.ts +75 -0
- package/lib/app.js +143 -0
- package/lib/app.js.map +1 -0
- package/lib/errors/index.d.ts +25 -0
- package/lib/errors/index.js +41 -0
- package/lib/errors/index.js.map +1 -0
- package/lib/hooks/business.d.ts +1 -0
- package/lib/hooks/business.js +26 -0
- package/lib/hooks/business.js.map +1 -0
- package/lib/hooks/hooks.d.ts +4 -0
- package/lib/hooks/hooks.js +66 -0
- package/lib/hooks/hooks.js.map +1 -0
- package/lib/hooks/index.d.ts +3 -0
- package/lib/hooks/index.js +20 -0
- package/lib/hooks/index.js.map +1 -0
- package/lib/hooks/types.d.ts +9 -0
- package/lib/hooks/types.js +3 -0
- package/lib/hooks/types.js.map +1 -0
- package/lib/index.d.ts +17 -0
- package/lib/index.js +23 -0
- package/lib/index.js.map +1 -0
- package/lib/libs/cache.d.ts +7 -0
- package/lib/libs/cache.js +22 -0
- package/lib/libs/cache.js.map +1 -0
- package/lib/libs/index.d.ts +5 -0
- package/lib/libs/index.js +22 -0
- package/lib/libs/index.js.map +1 -0
- package/lib/libs/logs.d.ts +5 -0
- package/lib/libs/logs.js +26 -0
- package/lib/libs/logs.js.map +1 -0
- package/lib/libs/queue.d.ts +21 -0
- package/lib/libs/queue.js +49 -0
- package/lib/libs/queue.js.map +1 -0
- package/lib/libs/socket.d.ts +8 -0
- package/lib/libs/socket.js +26 -0
- package/lib/libs/socket.js.map +1 -0
- package/lib/libs/utils.d.ts +8 -0
- package/lib/libs/utils.js +28 -0
- package/lib/libs/utils.js.map +1 -0
- package/lib/logger/index.d.ts +11 -0
- package/lib/logger/index.js +50 -0
- package/lib/logger/index.js.map +1 -0
- package/lib/services/auth.d.ts +19 -0
- package/lib/services/auth.js +41 -0
- package/lib/services/auth.js.map +1 -0
- package/lib/services/databases/index.d.ts +3 -0
- package/lib/services/databases/index.js +20 -0
- package/lib/services/databases/index.js.map +1 -0
- package/lib/services/databases/mongo-service.d.ts +26 -0
- package/lib/services/databases/mongo-service.js +55 -0
- package/lib/services/databases/mongo-service.js.map +1 -0
- package/lib/services/databases/postgres-service.d.ts +28 -0
- package/lib/services/databases/postgres-service.js +126 -0
- package/lib/services/databases/postgres-service.js.map +1 -0
- package/lib/services/databases/types.d.ts +26 -0
- package/lib/services/databases/types.js +3 -0
- package/lib/services/databases/types.js.map +1 -0
- package/lib/services/index.d.ts +6 -0
- package/lib/services/index.js +23 -0
- package/lib/services/index.js.map +1 -0
- package/lib/services/micro-service.d.ts +60 -0
- package/lib/services/micro-service.js +146 -0
- package/lib/services/micro-service.js.map +1 -0
- package/lib/services/register-micro-services.d.ts +1 -0
- package/lib/services/register-micro-services.js +41 -0
- package/lib/services/register-micro-services.js.map +1 -0
- package/lib/services/register-services.d.ts +5 -0
- package/lib/services/register-services.js +272 -0
- package/lib/services/register-services.js.map +1 -0
- package/lib/services/service.d.ts +46 -0
- package/lib/services/service.js +63 -0
- package/lib/services/service.js.map +1 -0
- package/package.json +49 -0
- package/src/app.ts +182 -0
- package/src/errors/index.ts +37 -0
- package/src/hooks/business.ts +23 -0
- package/src/hooks/hooks.ts +60 -0
- package/src/hooks/index.ts +3 -0
- package/src/hooks/types.ts +9 -0
- package/src/index.ts +18 -0
- package/src/libs/cache.ts +25 -0
- package/src/libs/index.ts +5 -0
- package/src/libs/logs.ts +21 -0
- package/src/libs/queue.ts +48 -0
- package/src/libs/socket.ts +28 -0
- package/src/libs/utils.ts +28 -0
- package/src/logger/index.ts +49 -0
- package/src/services/auth.ts +48 -0
- package/src/services/databases/index.ts +3 -0
- package/src/services/databases/mongo-service.ts +75 -0
- package/src/services/databases/postgres-service.ts +149 -0
- package/src/services/databases/types.ts +29 -0
- package/src/services/index.ts +6 -0
- package/src/services/micro-service.ts +188 -0
- package/src/services/register-micro-services.ts +37 -0
- package/src/services/register-services.ts +268 -0
- 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
|
+
}
|