@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
package/README.md ADDED
@@ -0,0 +1,256 @@
1
+ # Xitkov
2
+
3
+ TypeScript backend meta-framework on Express. Convention-over-configuration REST APIs, dual database dialect (MongoDB + Postgres), microservice HTTP clients, hooks, auth, cache, queue, sockets — one dependency.
4
+
5
+ ## Install
6
+
7
+ ```bash
8
+ npm install xitkov
9
+ ```
10
+
11
+ ## Quickstart
12
+
13
+ Project layout:
14
+
15
+ ```
16
+ src/
17
+ ├─ index.ts
18
+ ├─ services/
19
+ │ └─ users/
20
+ │ ├─ service.ts # extends XitkovService
21
+ │ ├─ model.ts # mongoose or sequelize model
22
+ │ ├─ validator.ts # optional Joi schemas
23
+ │ └─ hooks.ts # optional per-method hooks
24
+ └─ micro-services/
25
+ └─ billing.ts # optional external service client
26
+ ```
27
+
28
+ `src/index.ts`:
29
+
30
+ ```ts
31
+ import express from 'express';
32
+ import { Xitkov } from 'xitkov';
33
+
34
+ const app = express();
35
+
36
+ Xitkov.create({
37
+ app,
38
+ database: { dialect: 'mongodb', instance: mongooseConnection },
39
+ auth: { required: true, baseURL: 'https://auth.example.com' },
40
+ caching: { redisUrl: 'redis://localhost:6379', keyPrefix: 'app:' },
41
+ socket: { enable: true, socketCorsOrigin: '*' },
42
+ });
43
+ ```
44
+
45
+ `src/services/users/service.ts`:
46
+
47
+ ```ts
48
+ import { XitkovService } from 'xitkov';
49
+ import Model from './model';
50
+
51
+ export default class UserService extends XitkovService<User> {
52
+ constructor() {
53
+ super({ Model, dialect: 'mongodb' });
54
+ }
55
+ }
56
+ ```
57
+
58
+ Boots with REST routes:
59
+
60
+ | Method | Path | Handler |
61
+ |--------|------|---------|
62
+ | GET | `/users` | `find` |
63
+ | GET | `/users/:id` | `get` |
64
+ | POST | `/users` | `create` |
65
+ | PATCH | `/users/:id` | `patch` |
66
+ | PUT | `/users/:id` | `update` |
67
+ | DELETE | `/users/:id` | `remove` |
68
+
69
+ ## Core APIs
70
+
71
+ ### `Xitkov`
72
+
73
+ Bootstrapper. Registers services, wires cache/socket/logger, listens on `PORT`.
74
+
75
+ ```ts
76
+ new Xitkov(config) // fire-and-forget, use `xitkov.ready`
77
+ await Xitkov.create(config) // async factory, resolves after boot
78
+ ```
79
+
80
+ **`Config`**
81
+
82
+ | Field | Type | Purpose |
83
+ |-------|------|---------|
84
+ | `app` | `Application` | Existing Express app |
85
+ | `database.dialect` | `'mongodb' \| 'postgres'` | Backing store |
86
+ | `database.instance` | `any` | Sequelize instance (postgres) |
87
+ | `auth.required` | `boolean` | Enforce JWT verify on every route |
88
+ | `auth.baseURL` | `string` | Verify endpoint (POST `/verify`) |
89
+ | `caching.redisUrl` | `string` | Redis URL for `Cache` |
90
+ | `caching.keyPrefix` | `string` | Key namespace |
91
+ | `socket.enable` | `boolean` | Boot socket.io |
92
+ | `socket.redis` | `{ url?, redisOptions? }` | Redis pub/sub adapter |
93
+ | `socket.socketCorsOrigin` | `string` | Socket CORS |
94
+ | `logger.express` | `LoggerOptions` | express-winston passthrough |
95
+ | `express.limit` | `string` | Body-parser limit (default `50mb`) |
96
+
97
+ ### `XitkovService<T>`
98
+
99
+ Base class every service extends. Wraps dialect-specific implementation.
100
+
101
+ Methods: `find`, `get`, `create`, `patch`, `update`, `remove` — plus underscored bypass variants `_find` … `_remove` (skip hooks + validators when called internally).
102
+
103
+ Instance flags:
104
+ - `pagination?: boolean` — postgres `findAndCountAll`
105
+ - `filtering?: boolean` — toggle `addQuerySupport` translation (default on)
106
+ - `auth?: boolean` — set `false` to disable auth on this service
107
+
108
+ ### `MicroService`
109
+
110
+ Typed Axios client with the same CRUD shape. Auto-created for every entry in `/micro-services`.
111
+
112
+ ```ts
113
+ export default class BillingService {
114
+ name = 'billing'
115
+ baseURL = process.env.BILLING_URL!
116
+ services = ['invoices', 'customers']
117
+ }
118
+
119
+ // then anywhere:
120
+ const invoice = await MicroServices.get('billing', 'invoices').get('inv_1');
121
+ ```
122
+
123
+ Per-call options:
124
+
125
+ ```ts
126
+ await MicroServices.get('billing', 'invoices').get(id, undefined, {
127
+ axiosConfig: { timeout: 5000 },
128
+ exception: { handle: true, defaultValue: null },
129
+ });
130
+ ```
131
+
132
+ ### Hooks
133
+
134
+ Drop `hooks.ts` next to a service; export default class with method arrays:
135
+
136
+ ```ts
137
+ import { setBusinessId, loggedIn } from 'xitkov';
138
+
139
+ export default class UserHooks {
140
+ all = [loggedIn]
141
+ find = [setBusinessId]
142
+ create = [setBusinessId]
143
+ }
144
+ ```
145
+
146
+ Built-in hooks: `disallow`, `externalDisallow`, `loggedIn`, `setBusinessId`, `addQuerySupport`.
147
+
148
+ ### Errors
149
+
150
+ All extend `Error`. Throw them; framework maps to HTTP:
151
+
152
+ ```ts
153
+ import { BadRequest, NotFound, Unauthorized } from 'xitkov';
154
+
155
+ throw new NotFound('User not found');
156
+ ```
157
+
158
+ Classes: `BadRequest` (400), `NoContent` (204), `Unauthorized` (401), `PaymentRequired` (402), `Forbidden` (403), `NotFound` (404), `InternalServer` (500).
159
+
160
+ ### Cache
161
+
162
+ Redis wrapper (ioredis).
163
+
164
+ ```ts
165
+ import { Cache } from 'xitkov';
166
+
167
+ await Cache.set('key', value, 300); // TTL in seconds
168
+ const value = await Cache.get('key');
169
+ await Cache.delete('key');
170
+ ```
171
+
172
+ ### Queue
173
+
174
+ Bull wrapper with env-scoped names (`name_dev`, `name_staging`, bare in prod).
175
+
176
+ ```ts
177
+ import { Queue } from 'xitkov';
178
+
179
+ const emails = new Queue<{ to: string }>('emails', process.env.REDIS_URL!);
180
+ await emails.add({ to: 'a@b.com' });
181
+ emails.consume(async job => sendEmail(job.data));
182
+ ```
183
+
184
+ ### Socket
185
+
186
+ Socket.io helper. Redis adapter attached when `socket.redis` provided.
187
+
188
+ ```ts
189
+ import { Socket } from 'xitkov';
190
+
191
+ Socket.emit('event', payload);
192
+ Socket.client(socket => {
193
+ socket.on('ping', () => socket.emit('pong'));
194
+ });
195
+ ```
196
+
197
+ ### Logger
198
+
199
+ Winston-backed static class. Local dev logs to console; prod to structured JSON.
200
+
201
+ ```ts
202
+ import { Logger } from 'xitkov';
203
+
204
+ Logger.info('boot', { port });
205
+ Logger.error('failed', err);
206
+ ```
207
+
208
+ ### Events
209
+
210
+ ```ts
211
+ import { XitkovEvents, EVENTS } from 'xitkov';
212
+
213
+ XitkovEvents.on(EVENTS.SERVICES_REGISTERED, () => {});
214
+ XitkovEvents.on(EVENTS.SERVER_STARTED, port => {});
215
+ ```
216
+
217
+ ### Query operators (postgres)
218
+
219
+ `addQuerySupport` translates `$op` shorthand → Sequelize `Op`:
220
+
221
+ ```
222
+ GET /users?age[$gte]=18&status[$in]=["active","pending"]
223
+ ```
224
+
225
+ Reserved: `$limit`, `$offset` for pagination.
226
+
227
+ ## Environment variables
228
+
229
+ | Var | Default | Purpose |
230
+ |-----|---------|---------|
231
+ | `PORT` | `3000` | HTTP listen port |
232
+ | `NODE_ENV` | — | Set `local` to disable Winston, use console |
233
+ | `ENVIRONMENT` | `dev` | Bull queue name suffix (`prod` → bare) |
234
+ | `INTERNAL_TOKEN` | `internal_token` | Shared secret for microservice-to-microservice calls (bypasses auth) |
235
+
236
+ ## Type augmentation
237
+
238
+ Register your services for typed access:
239
+
240
+ ```ts
241
+ declare module 'xitkov' {
242
+ interface ServiceTypes {
243
+ users: UserService
244
+ }
245
+ interface MicroServiceNames {
246
+ billing: {
247
+ invoices: MicroService
248
+ customers: MicroService
249
+ }
250
+ }
251
+ }
252
+ ```
253
+
254
+ ## License
255
+
256
+ MIT
package/lib/app.d.ts ADDED
@@ -0,0 +1,75 @@
1
+ /// <reference types="node" />
2
+ /// <reference types="node" />
3
+ import { Server } from 'http';
4
+ import EventEmitter from 'events';
5
+ import { Application } from 'express';
6
+ import { RedisOptions } from 'ioredis';
7
+ import { MicroServiceNames, ServiceTypes, SubMicroServiceNames } from '.';
8
+ import { MicroService } from './services';
9
+ import { LoggerOptions } from 'express-winston';
10
+ export declare const EVENTS: {
11
+ SERVER_STARTED: string;
12
+ SERVICES_REGISTERED: string;
13
+ };
14
+ export declare class Services {
15
+ private static services;
16
+ static get<T extends keyof ServiceTypes>(service: T): ServiceTypes[T];
17
+ static set(services: any): void;
18
+ }
19
+ export interface IMicroServices {
20
+ [microService: string]: {
21
+ [service: string]: MicroService;
22
+ };
23
+ }
24
+ export declare class MicroServices {
25
+ private static services;
26
+ static get<U extends keyof MicroServiceNames, T extends keyof SubMicroServiceNames>(microServiceName: U, service: T): MicroService;
27
+ static set(services: IMicroServices): void;
28
+ }
29
+ export declare const XitkovEvents: EventEmitter;
30
+ export type Dialect = 'mongodb' | 'postgres';
31
+ export interface IExpressOptions {
32
+ limit?: string;
33
+ }
34
+ export interface IAuth {
35
+ required: boolean;
36
+ baseURL: string;
37
+ }
38
+ export interface ISocket {
39
+ enable: boolean;
40
+ socketCorsOrigin: string;
41
+ redis?: {
42
+ url?: string;
43
+ redisOptions?: RedisOptions;
44
+ };
45
+ }
46
+ export interface Config {
47
+ app: Application;
48
+ database?: {
49
+ dialect?: Dialect;
50
+ instance?: any;
51
+ };
52
+ auth?: IAuth;
53
+ socket?: ISocket;
54
+ logger?: {
55
+ express?: Partial<LoggerOptions>;
56
+ };
57
+ caching?: {
58
+ redisUrl: string;
59
+ keyPrefix: string;
60
+ redisOptions?: RedisOptions;
61
+ };
62
+ express?: IExpressOptions;
63
+ }
64
+ export declare class Xitkov {
65
+ readonly app: Application;
66
+ readonly server: Server;
67
+ readonly ready: Promise<void>;
68
+ constructor(config: Config);
69
+ static create(config: Config): Promise<Xitkov>;
70
+ private bootstrap;
71
+ private init;
72
+ private initExpress404;
73
+ private initSocket;
74
+ private initCache;
75
+ }
package/lib/app.js ADDED
@@ -0,0 +1,143 @@
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.Xitkov = exports.XitkovEvents = exports.MicroServices = exports.Services = exports.EVENTS = void 0;
7
+ const http_1 = require("http");
8
+ const events_1 = __importDefault(require("events"));
9
+ const express_1 = __importDefault(require("express"));
10
+ const socket_io_1 = require("socket.io");
11
+ const redis_adapter_1 = require("@socket.io/redis-adapter");
12
+ const ioredis_1 = __importDefault(require("ioredis"));
13
+ const _1 = require(".");
14
+ const services_1 = require("./services");
15
+ const register_services_1 = require("./services/register-services");
16
+ const libs_1 = require("./libs");
17
+ exports.EVENTS = {
18
+ SERVER_STARTED: 'SERVER_STARTED',
19
+ SERVICES_REGISTERED: 'SERVICES_REGISTERED',
20
+ };
21
+ class Services {
22
+ static get(service) {
23
+ return this.services[service];
24
+ }
25
+ static set(services) {
26
+ Services.services = services;
27
+ }
28
+ }
29
+ exports.Services = Services;
30
+ class MicroServices {
31
+ static get(microServiceName, service) {
32
+ return this.services[microServiceName][service];
33
+ }
34
+ static set(services) {
35
+ MicroServices.services = services;
36
+ }
37
+ }
38
+ exports.MicroServices = MicroServices;
39
+ exports.XitkovEvents = new events_1.default();
40
+ class Xitkov {
41
+ constructor(config) {
42
+ var _a;
43
+ const { app, database, express, auth, logger, socket, caching } = config;
44
+ this.app = app;
45
+ this.server = new http_1.Server(app);
46
+ this.init((_a = express === null || express === void 0 ? void 0 : express.limit) !== null && _a !== void 0 ? _a : '50mb', logger === null || logger === void 0 ? void 0 : logger.express);
47
+ this.initSocket(socket === null || socket === void 0 ? void 0 : socket.enable, socket === null || socket === void 0 ? void 0 : socket.redis, socket === null || socket === void 0 ? void 0 : socket.socketCorsOrigin);
48
+ this.ready = this.bootstrap(auth, database, caching);
49
+ }
50
+ static async create(config) {
51
+ const instance = new Xitkov(config);
52
+ await instance.ready;
53
+ return instance;
54
+ }
55
+ async bootstrap(auth, database, caching) {
56
+ var _a;
57
+ if (database === null || database === void 0 ? void 0 : database.dialect)
58
+ services_1.XitkovService.setDefaultDialect(database.dialect);
59
+ await this.initCache(caching);
60
+ const [microServices, services] = await Promise.all([
61
+ (0, services_1.registerMicroServices)(),
62
+ (0, register_services_1.registerServices)(this.app, auth, database),
63
+ ]);
64
+ MicroServices.set(microServices);
65
+ Services.set(services);
66
+ exports.XitkovEvents.emit(exports.EVENTS.SERVICES_REGISTERED, true);
67
+ this.initExpress404();
68
+ const port = (_a = process.env.PORT) !== null && _a !== void 0 ? _a : 3000;
69
+ await new Promise(resolve => {
70
+ this.server.listen(port, () => {
71
+ exports.XitkovEvents.emit(exports.EVENTS.SERVER_STARTED, port);
72
+ _1.Logger.info(`Server Started ${port}`);
73
+ resolve();
74
+ });
75
+ });
76
+ }
77
+ init(limit = "50mb", loggerOptions) {
78
+ this.app.use(libs_1.InternalLogs.middleware(loggerOptions));
79
+ this.app.use(express_1.default.json({ limit }));
80
+ }
81
+ initExpress404() {
82
+ this.app.get('/healthz', (_, res) => {
83
+ return res.status(200).send({
84
+ message: "ok",
85
+ status: 200
86
+ });
87
+ });
88
+ this.app.use((req, res) => {
89
+ return res.status(404).send({
90
+ message: "Not found"
91
+ });
92
+ });
93
+ }
94
+ initSocket(enable, redis, socketCorsOrigin) {
95
+ var _a;
96
+ if (enable) {
97
+ _1.Socket.io = new socket_io_1.Server(this.server, {
98
+ cors: {
99
+ origin: socketCorsOrigin
100
+ }
101
+ });
102
+ if (redis) {
103
+ let pubClient;
104
+ if (redis === null || redis === void 0 ? void 0 : redis.url) {
105
+ pubClient = new ioredis_1.default(redis === null || redis === void 0 ? void 0 : redis.url);
106
+ }
107
+ else {
108
+ pubClient = new ioredis_1.default((_a = redis.redisOptions) !== null && _a !== void 0 ? _a : {});
109
+ }
110
+ if (pubClient) {
111
+ const subClient = pubClient.duplicate();
112
+ _1.Socket.io.adapter((0, redis_adapter_1.createAdapter)(pubClient, subClient));
113
+ _1.Logger.info("Redis added to socket");
114
+ }
115
+ }
116
+ }
117
+ }
118
+ initCache(caching) {
119
+ if (!caching)
120
+ return Promise.resolve();
121
+ const { redisUrl, keyPrefix, redisOptions = {} } = caching;
122
+ libs_1.Cache.client = new ioredis_1.default(redisUrl, { keyPrefix, ...redisOptions });
123
+ return new Promise(resolve => {
124
+ let settled = false;
125
+ libs_1.Cache.client.once('connect', () => {
126
+ _1.Logger.info('Successfully connected to Redis Cache');
127
+ if (!settled) {
128
+ settled = true;
129
+ resolve();
130
+ }
131
+ });
132
+ libs_1.Cache.client.on('error', (error) => {
133
+ _1.Logger.error('Unable to connect to Redis Cache', { error });
134
+ if (!settled) {
135
+ settled = true;
136
+ resolve();
137
+ }
138
+ });
139
+ });
140
+ }
141
+ }
142
+ exports.Xitkov = Xitkov;
143
+ //# sourceMappingURL=app.js.map
package/lib/app.js.map ADDED
@@ -0,0 +1 @@
1
+ {"version":3,"file":"app.js","sourceRoot":"","sources":["../src/app.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,25 @@
1
+ export declare class XitkovError extends Error {
2
+ readonly status: number;
3
+ constructor(message: string, status: number);
4
+ }
5
+ export declare class BadRequest extends XitkovError {
6
+ constructor(message: string);
7
+ }
8
+ export declare class NoContent extends XitkovError {
9
+ constructor(message: string);
10
+ }
11
+ export declare class InternalServer extends XitkovError {
12
+ constructor(message: string);
13
+ }
14
+ export declare class Unauthorized extends XitkovError {
15
+ constructor(message: string);
16
+ }
17
+ export declare class PaymentRequired extends XitkovError {
18
+ constructor(message: string);
19
+ }
20
+ export declare class Forbidden extends XitkovError {
21
+ constructor(message: string);
22
+ }
23
+ export declare class NotFound extends XitkovError {
24
+ constructor(message: string);
25
+ }
@@ -0,0 +1,41 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.NotFound = exports.Forbidden = exports.PaymentRequired = exports.Unauthorized = exports.InternalServer = exports.NoContent = exports.BadRequest = exports.XitkovError = void 0;
4
+ class XitkovError extends Error {
5
+ constructor(message, status) {
6
+ super(message);
7
+ this.name = new.target.name;
8
+ this.status = status;
9
+ Object.setPrototypeOf(this, new.target.prototype);
10
+ }
11
+ }
12
+ exports.XitkovError = XitkovError;
13
+ class BadRequest extends XitkovError {
14
+ constructor(message) { super(message, 400); }
15
+ }
16
+ exports.BadRequest = BadRequest;
17
+ class NoContent extends XitkovError {
18
+ constructor(message) { super(message, 204); }
19
+ }
20
+ exports.NoContent = NoContent;
21
+ class InternalServer extends XitkovError {
22
+ constructor(message) { super(message, 500); }
23
+ }
24
+ exports.InternalServer = InternalServer;
25
+ class Unauthorized extends XitkovError {
26
+ constructor(message) { super(message, 401); }
27
+ }
28
+ exports.Unauthorized = Unauthorized;
29
+ class PaymentRequired extends XitkovError {
30
+ constructor(message) { super(message, 402); }
31
+ }
32
+ exports.PaymentRequired = PaymentRequired;
33
+ class Forbidden extends XitkovError {
34
+ constructor(message) { super(message, 403); }
35
+ }
36
+ exports.Forbidden = Forbidden;
37
+ class NotFound extends XitkovError {
38
+ constructor(message) { super(message, 404); }
39
+ }
40
+ exports.NotFound = NotFound;
41
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/errors/index.ts"],"names":[],"mappings":";;;AAAA,MAAa,WAAY,SAAQ,KAAK;IAEpC,YAAY,OAAe,EAAE,MAAc;QACzC,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC;QAC5B,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,MAAM,CAAC,cAAc,CAAC,IAAI,EAAE,GAAG,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;IACpD,CAAC;CACF;AARD,kCAQC;AAED,MAAa,UAAW,SAAQ,WAAW;IACzC,YAAY,OAAe,IAAI,KAAK,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC;CACtD;AAFD,gCAEC;AAED,MAAa,SAAU,SAAQ,WAAW;IACxC,YAAY,OAAe,IAAI,KAAK,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC;CACtD;AAFD,8BAEC;AAED,MAAa,cAAe,SAAQ,WAAW;IAC7C,YAAY,OAAe,IAAI,KAAK,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC;CACtD;AAFD,wCAEC;AAED,MAAa,YAAa,SAAQ,WAAW;IAC3C,YAAY,OAAe,IAAI,KAAK,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC;CACtD;AAFD,oCAEC;AAED,MAAa,eAAgB,SAAQ,WAAW;IAC9C,YAAY,OAAe,IAAI,KAAK,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC;CACtD;AAFD,0CAEC;AAED,MAAa,SAAU,SAAQ,WAAW;IACxC,YAAY,OAAe,IAAI,KAAK,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC;CACtD;AAFD,8BAEC;AAED,MAAa,QAAS,SAAQ,WAAW;IACvC,YAAY,OAAe,IAAI,KAAK,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC;CACtD;AAFD,4BAEC"}
@@ -0,0 +1 @@
1
+ export declare function setBusinessId(...params: any[]): void;
@@ -0,0 +1,26 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.setBusinessId = void 0;
4
+ function setBusinessId(...params) {
5
+ const req = params[params.length - 2];
6
+ const hookName = params[params.length - 1];
7
+ const user = req === null || req === void 0 ? void 0 : req.user;
8
+ const { userBusinessId: businessId } = user !== null && user !== void 0 ? user : {};
9
+ let idx = 0;
10
+ if (/^(patch|update|remove|get)$/i.test(hookName)) {
11
+ idx = 1;
12
+ }
13
+ const target = params[idx];
14
+ if (target == null)
15
+ return;
16
+ if (Array.isArray(target)) {
17
+ target.forEach(item => { if (item && typeof item === 'object')
18
+ item.businessId = businessId; });
19
+ return;
20
+ }
21
+ if (typeof target === 'object') {
22
+ target.businessId = businessId;
23
+ }
24
+ }
25
+ exports.setBusinessId = setBusinessId;
26
+ //# sourceMappingURL=business.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"business.js","sourceRoot":"","sources":["../../src/hooks/business.ts"],"names":[],"mappings":";;;AAIA,SAAgB,aAAa,CAAC,GAAG,MAAa;IAC5C,MAAM,GAAG,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IACtC,MAAM,QAAQ,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IAC3C,MAAM,IAAI,GAAU,GAAG,aAAH,GAAG,uBAAH,GAAG,CAAE,IAAI,CAAC;IAC9B,MAAM,EAAE,cAAc,EAAE,UAAU,EAAE,GAAG,IAAI,aAAJ,IAAI,cAAJ,IAAI,GAAI,EAAE,CAAC;IAClD,IAAI,GAAG,GAAG,CAAC,CAAC;IACZ,IAAI,8BAA8B,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE;QACjD,GAAG,GAAG,CAAC,CAAC;KACT;IACD,MAAM,MAAM,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC;IAC3B,IAAI,MAAM,IAAI,IAAI;QAAE,OAAO;IAC3B,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE;QACzB,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,GAAG,IAAI,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ;YAAE,IAAI,CAAC,UAAU,GAAG,UAAU,CAAA,CAAC,CAAC,CAAC,CAAC;QAC/F,OAAO;KACR;IACD,IAAI,OAAO,MAAM,KAAK,QAAQ,EAAE;QAC9B,MAAM,CAAC,UAAU,GAAG,UAAU,CAAC;KAChC;AACH,CAAC;AAlBD,sCAkBC"}
@@ -0,0 +1,4 @@
1
+ export declare const disallow: () => never;
2
+ export declare const externalDisallow: (...params: any[]) => void;
3
+ export declare const loggedIn: (...params: any[]) => any;
4
+ export declare const addQuerySupport: (...params: any[]) => any;
@@ -0,0 +1,66 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.addQuerySupport = exports.loggedIn = exports.externalDisallow = exports.disallow = void 0;
4
+ const sequelize_1 = require("sequelize");
5
+ const errors_1 = require("../errors");
6
+ const logger_1 = require("../logger");
7
+ const disallow = () => {
8
+ throw new errors_1.NotFound('Not Found');
9
+ };
10
+ exports.disallow = disallow;
11
+ const externalDisallow = (...params) => {
12
+ var _a;
13
+ const req = params[params.length - 2];
14
+ const internalToken = req.headers['internaltoken'];
15
+ if (internalToken === ((_a = process.env.INTERNAL_TOKEN) !== null && _a !== void 0 ? _a : 'internal_token')) {
16
+ logger_1.Logger.info('externalDisallow', { internalToken });
17
+ return;
18
+ }
19
+ throw new errors_1.NotFound('Not Found');
20
+ };
21
+ exports.externalDisallow = externalDisallow;
22
+ const loggedIn = (...params) => {
23
+ const req = params[params.length - 2];
24
+ const user = req === null || req === void 0 ? void 0 : req.user;
25
+ if (!user) {
26
+ throw new errors_1.Unauthorized("Logged in required");
27
+ }
28
+ return user;
29
+ };
30
+ exports.loggedIn = loggedIn;
31
+ const addQuerySupport = (...params) => {
32
+ var _a;
33
+ const hookName = params[params.length - 1];
34
+ let queryIndex = 0;
35
+ if (/^(create|patch|update|remove|get)$/i.test(hookName)) {
36
+ queryIndex = 1;
37
+ }
38
+ const query = (_a = params[queryIndex]) !== null && _a !== void 0 ? _a : {};
39
+ const queryObj = {};
40
+ Object.keys(query).forEach(key => {
41
+ const value = query[key];
42
+ if (typeof value === 'object') {
43
+ let [conditionValue] = Object.values(value);
44
+ const [condition] = Object.keys(value);
45
+ const sequelizeOp = sequelize_1.Op[condition.replace('$', '')];
46
+ try {
47
+ conditionValue = JSON.parse(conditionValue);
48
+ }
49
+ catch (err) {
50
+ //
51
+ }
52
+ if (sequelizeOp) {
53
+ queryObj[key] = {
54
+ [sequelizeOp]: conditionValue,
55
+ };
56
+ }
57
+ }
58
+ else {
59
+ queryObj[key] = value;
60
+ }
61
+ });
62
+ params[queryIndex] = queryObj;
63
+ return queryObj;
64
+ };
65
+ exports.addQuerySupport = addQuerySupport;
66
+ //# sourceMappingURL=hooks.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hooks.js","sourceRoot":"","sources":["../../src/hooks/hooks.ts"],"names":[],"mappings":";;;AAAA,yCAA+B;AAC/B,sCAAmD;AACnD,sCAAmC;AAE5B,MAAM,QAAQ,GAAG,GAAG,EAAE;IAC3B,MAAM,IAAI,iBAAQ,CAAC,WAAW,CAAC,CAAA;AACjC,CAAC,CAAA;AAFY,QAAA,QAAQ,YAEpB;AAEM,MAAM,gBAAgB,GAAG,CAAC,GAAG,MAAa,EAAE,EAAE;;IACnD,MAAM,GAAG,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAA;IACrC,MAAM,aAAa,GAAG,GAAG,CAAC,OAAO,CAAC,eAAe,CAAC,CAAA;IAClD,IAAI,aAAa,KAAK,CAAC,MAAA,OAAO,CAAC,GAAG,CAAC,cAAc,mCAAI,gBAAgB,CAAC,EAAE;QACtE,eAAM,CAAC,IAAI,CAAC,kBAAkB,EAAE,EAAE,aAAa,EAAE,CAAC,CAAA;QAClD,OAAM;KACP;IACD,MAAM,IAAI,iBAAQ,CAAC,WAAW,CAAC,CAAA;AACjC,CAAC,CAAA;AARY,QAAA,gBAAgB,oBAQ5B;AAEM,MAAM,QAAQ,GAAG,CAAC,GAAG,MAAa,EAAE,EAAE;IAC3C,MAAM,GAAG,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAA;IACrC,MAAM,IAAI,GAAG,GAAG,aAAH,GAAG,uBAAH,GAAG,CAAE,IAAI,CAAA;IACtB,IAAI,CAAC,IAAI,EAAE;QACT,MAAM,IAAI,qBAAY,CAAC,oBAAoB,CAAC,CAAA;KAC7C;IACD,OAAO,IAAI,CAAC;AACd,CAAC,CAAA;AAPY,QAAA,QAAQ,YAOpB;AAEM,MAAM,eAAe,GAAG,CAAC,GAAG,MAAa,EAAE,EAAE;;IAClD,MAAM,QAAQ,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IAC3C,IAAI,UAAU,GAAG,CAAC,CAAC;IAEnB,IAAI,qCAAqC,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE;QACxD,UAAU,GAAG,CAAC,CAAC;KAChB;IAED,MAAM,KAAK,GAAG,MAAA,MAAM,CAAC,UAAU,CAAC,mCAAI,EAAE,CAAC;IACvC,MAAM,QAAQ,GAAQ,EAAE,CAAC;IACzB,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE;QAC/B,MAAM,KAAK,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC;QACzB,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE;YAC7B,IAAI,CAAC,cAAc,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YAC5C,MAAM,CAAC,SAAS,CAAC,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACvC,MAAM,WAAW,GAAI,cAAU,CAAC,SAAS,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,CAAC;YAC5D,IAAI;gBACF,cAAc,GAAG,IAAI,CAAC,KAAK,CAAC,cAAqB,CAAC,CAAC;aACpD;YAAC,OAAO,GAAG,EAAE;gBACZ,EAAE;aACH;YACD,IAAI,WAAW,EAAE;gBACf,QAAQ,CAAC,GAAG,CAAC,GAAG;oBACd,CAAC,WAAW,CAAC,EAAE,cAAc;iBAC9B,CAAC;aACH;SACF;aAAM;YACL,QAAQ,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;SACvB;IACH,CAAC,CAAC,CAAC;IACH,MAAM,CAAC,UAAU,CAAC,GAAG,QAAQ,CAAC;IAC9B,OAAO,QAAQ,CAAC;AAClB,CAAC,CAAA;AAhCY,QAAA,eAAe,mBAgC3B"}
@@ -0,0 +1,3 @@
1
+ export * from './hooks';
2
+ export * from './types';
3
+ export * from './business';