pangea-server 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.
Files changed (150) hide show
  1. package/README.md +1 -0
  2. package/dist/authentication/access-token.class.d.ts +13 -0
  3. package/dist/authentication/access-token.class.js +28 -0
  4. package/dist/authentication/authentication.helpers.d.ts +17 -0
  5. package/dist/authentication/authentication.helpers.js +77 -0
  6. package/dist/authentication/authentication.types.d.ts +11 -0
  7. package/dist/authentication/authentication.types.js +2 -0
  8. package/dist/authentication/base-auth.class.d.ts +9 -0
  9. package/dist/authentication/base-auth.class.js +29 -0
  10. package/dist/authentication/index.d.ts +4 -0
  11. package/dist/authentication/index.js +20 -0
  12. package/dist/database/base-service.class.d.ts +15 -0
  13. package/dist/database/base-service.class.js +28 -0
  14. package/dist/database/database.helpers.d.ts +4 -0
  15. package/dist/database/database.helpers.js +19 -0
  16. package/dist/database/database.types.d.ts +59 -0
  17. package/dist/database/database.types.js +2 -0
  18. package/dist/database/db-client.d.ts +11 -0
  19. package/dist/database/db-client.js +69 -0
  20. package/dist/database/db.class.d.ts +64 -0
  21. package/dist/database/db.class.js +270 -0
  22. package/dist/database/decorators/columns/column.d.ts +10 -0
  23. package/dist/database/decorators/columns/column.js +47 -0
  24. package/dist/database/decorators/columns/date.columns.d.ts +4 -0
  25. package/dist/database/decorators/columns/date.columns.js +16 -0
  26. package/dist/database/decorators/columns/general.columns.d.ts +4 -0
  27. package/dist/database/decorators/columns/general.columns.js +54 -0
  28. package/dist/database/decorators/columns/json.columns.d.ts +3 -0
  29. package/dist/database/decorators/columns/json.columns.js +22 -0
  30. package/dist/database/decorators/columns/number.columns.d.ts +10 -0
  31. package/dist/database/decorators/columns/number.columns.js +33 -0
  32. package/dist/database/decorators/columns/string.columns.d.ts +10 -0
  33. package/dist/database/decorators/columns/string.columns.js +55 -0
  34. package/dist/database/decorators/index.d.ts +23 -0
  35. package/dist/database/decorators/index.js +50 -0
  36. package/dist/database/decorators/relations.d.ts +12 -0
  37. package/dist/database/decorators/relations.js +42 -0
  38. package/dist/database/decorators/table.d.ts +6 -0
  39. package/dist/database/decorators/table.js +57 -0
  40. package/dist/database/index.d.ts +8 -0
  41. package/dist/database/index.js +26 -0
  42. package/dist/database/init-database.d.ts +11 -0
  43. package/dist/database/init-database.js +69 -0
  44. package/dist/database/model-decorators/column.d.ts +11 -0
  45. package/dist/database/model-decorators/column.js +51 -0
  46. package/dist/database/model-decorators/date-columns.d.ts +6 -0
  47. package/dist/database/model-decorators/date-columns.js +41 -0
  48. package/dist/database/model-decorators/decorators.types.d.ts +20 -0
  49. package/dist/database/model-decorators/decorators.types.js +2 -0
  50. package/dist/database/model-decorators/general-columns.d.ts +4 -0
  51. package/dist/database/model-decorators/general-columns.js +54 -0
  52. package/dist/database/model-decorators/index.d.ts +23 -0
  53. package/dist/database/model-decorators/index.js +50 -0
  54. package/dist/database/model-decorators/json-columns.d.ts +3 -0
  55. package/dist/database/model-decorators/json-columns.js +46 -0
  56. package/dist/database/model-decorators/number-columns.d.ts +10 -0
  57. package/dist/database/model-decorators/number-columns.js +58 -0
  58. package/dist/database/model-decorators/relations.d.ts +12 -0
  59. package/dist/database/model-decorators/relations.js +42 -0
  60. package/dist/database/model-decorators/string-columns.d.ts +9 -0
  61. package/dist/database/model-decorators/string-columns.js +51 -0
  62. package/dist/database/model-decorators/table.d.ts +6 -0
  63. package/dist/database/model-decorators/table.js +57 -0
  64. package/dist/database/models/base-model.class.d.ts +33 -0
  65. package/dist/database/models/base-model.class.js +76 -0
  66. package/dist/database/models/index.d.ts +2 -0
  67. package/dist/database/models/index.js +18 -0
  68. package/dist/database/models/user.model.d.ts +5 -0
  69. package/dist/database/models/user.model.js +25 -0
  70. package/dist/database/seed.helpers.d.ts +4 -0
  71. package/dist/database/seed.helpers.js +44 -0
  72. package/dist/helpers/console.helpers.d.ts +8 -0
  73. package/dist/helpers/console.helpers.js +29 -0
  74. package/dist/helpers/controllers.helpers.d.ts +2 -0
  75. package/dist/helpers/controllers.helpers.js +6 -0
  76. package/dist/helpers/env.helpers.d.ts +4 -0
  77. package/dist/helpers/env.helpers.js +32 -0
  78. package/dist/helpers/error.helpers.d.ts +20 -0
  79. package/dist/helpers/error.helpers.js +29 -0
  80. package/dist/helpers/file.helpers.d.ts +4 -0
  81. package/dist/helpers/file.helpers.js +78 -0
  82. package/dist/helpers/hashing.helpers.d.ts +2 -0
  83. package/dist/helpers/hashing.helpers.js +16 -0
  84. package/dist/helpers/html-sanitize.helpers.d.ts +4 -0
  85. package/dist/helpers/html-sanitize.helpers.js +30 -0
  86. package/dist/helpers/index.d.ts +11 -0
  87. package/dist/helpers/index.js +27 -0
  88. package/dist/helpers/job.helpers.d.ts +8 -0
  89. package/dist/helpers/job.helpers.js +20 -0
  90. package/dist/helpers/mailer.helpers.d.ts +33 -0
  91. package/dist/helpers/mailer.helpers.js +34 -0
  92. package/dist/helpers/multer.helpers.d.ts +2 -0
  93. package/dist/helpers/multer.helpers.js +52 -0
  94. package/dist/helpers/print.helpers.d.ts +8 -0
  95. package/dist/helpers/print.helpers.js +29 -0
  96. package/dist/helpers/random.helpers.d.ts +4 -0
  97. package/dist/helpers/random.helpers.js +27 -0
  98. package/dist/index.d.ts +8 -0
  99. package/dist/index.js +26 -0
  100. package/dist/main.d.ts +13 -0
  101. package/dist/main.js +65 -0
  102. package/dist/middlewares/delay-request.middleware.d.ts +1 -0
  103. package/dist/middlewares/delay-request.middleware.js +16 -0
  104. package/dist/middlewares/handle-error.middleware.d.ts +1 -0
  105. package/dist/middlewares/handle-error.middleware.js +13 -0
  106. package/dist/resources/color.resources.d.ts +18 -0
  107. package/dist/resources/color.resources.js +20 -0
  108. package/dist/resources/index.d.ts +2 -0
  109. package/dist/resources/index.js +18 -0
  110. package/dist/resources/refs.d.ts +32 -0
  111. package/dist/resources/refs.js +35 -0
  112. package/dist/resources/string.resources.d.ts +15 -0
  113. package/dist/resources/string.resources.js +16 -0
  114. package/dist/router/app-router.class.d.ts +18 -0
  115. package/dist/router/app-router.class.js +34 -0
  116. package/dist/router/call-controller.d.ts +5 -0
  117. package/dist/router/call-controller.js +47 -0
  118. package/dist/router/index.d.ts +1 -0
  119. package/dist/router/index.js +17 -0
  120. package/dist/router/router.types.d.ts +15 -0
  121. package/dist/router/router.types.js +2 -0
  122. package/dist/types/error.types.d.ts +4 -0
  123. package/dist/types/error.types.js +2 -0
  124. package/dist/types/global.types.d.ts +22 -0
  125. package/dist/types/global.types.js +2 -0
  126. package/dist/types/index.d.ts +2 -0
  127. package/dist/types/index.js +4 -0
  128. package/dist/validations/general-schemas.d.ts +20 -0
  129. package/dist/validations/general-schemas.js +15 -0
  130. package/dist/validations/index.d.ts +3 -0
  131. package/dist/validations/index.js +19 -0
  132. package/dist/validations/validate-request.middleware.d.ts +2 -0
  133. package/dist/validations/validate-request.middleware.js +33 -0
  134. package/dist/validations/validation-locations.d.ts +1 -0
  135. package/dist/validations/validation-locations.js +4 -0
  136. package/dist/validations/validations.types.d.ts +23 -0
  137. package/dist/validations/validations.types.js +21 -0
  138. package/dist/validator/general-schemas.d.ts +1 -0
  139. package/dist/validator/general-schemas.js +25 -0
  140. package/dist/validator/index.d.ts +1 -0
  141. package/dist/validator/index.js +17 -0
  142. package/dist/validator/tags.d.ts +1 -0
  143. package/dist/validator/tags.js +5 -0
  144. package/dist/validator/validate-request.d.ts +2 -0
  145. package/dist/validator/validate-request.js +71 -0
  146. package/dist/validator/validator.types.d.ts +6 -0
  147. package/dist/validator/validator.types.js +2 -0
  148. package/dist/validator/validators.helpers.d.ts +38 -0
  149. package/dist/validator/validators.helpers.js +8 -0
  150. package/package.json +78 -0
package/README.md ADDED
@@ -0,0 +1 @@
1
+ # PANGEA BACKEND
@@ -0,0 +1,13 @@
1
+ import { User } from '../database';
2
+ import type { UserCtor } from './authentication.types';
3
+ export declare class AccessToken {
4
+ private __privateKey;
5
+ constructor(privateKey: string);
6
+ getKey(userCtor: UserCtor): string;
7
+ createToken(userCtor: UserCtor, id: ModelId): string;
8
+ verifyToken(token: string): Record<string, number>;
9
+ getTokenData(userCtor: UserCtor, user: User): {
10
+ accessToken: string;
11
+ user: User;
12
+ };
13
+ }
@@ -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.AccessToken = void 0;
7
+ const jsonwebtoken_1 = __importDefault(require("jsonwebtoken"));
8
+ // helpers
9
+ const pangea_helpers_1 = require("pangea-helpers");
10
+ class AccessToken {
11
+ constructor(privateKey) {
12
+ this.__privateKey = privateKey;
13
+ }
14
+ getKey(userCtor) {
15
+ return `${(0, pangea_helpers_1.getFirstChartInLowercase)(userCtor.name)}Id`;
16
+ }
17
+ createToken(userCtor, id) {
18
+ const key = this.getKey(userCtor);
19
+ return jsonwebtoken_1.default.sign({ [key]: id }, this.__privateKey, { expiresIn: 60 * 60 * 24 * 365 });
20
+ }
21
+ verifyToken(token) {
22
+ return jsonwebtoken_1.default.verify(token, this.__privateKey);
23
+ }
24
+ getTokenData(userCtor, user) {
25
+ return { accessToken: this.createToken(userCtor, user.id), user };
26
+ }
27
+ }
28
+ exports.AccessToken = AccessToken;
@@ -0,0 +1,17 @@
1
+ import { AccessToken } from './access-token.class';
2
+ import { User } from '../database';
3
+ import type { UserCtor, AuthMap } from './authentication.types';
4
+ type AuthHeader = string | undefined;
5
+ export declare function login(authHeader: AuthHeader, tx: Tx, accessToken: AccessToken, userCtor: UserCtor): Promise<{
6
+ accessToken: string;
7
+ user: User;
8
+ }>;
9
+ export declare function validateAccessToken(authHeader: AuthHeader, tx: Tx, accessToken: AccessToken, userCtor: UserCtor): Promise<{
10
+ accessToken: string;
11
+ user: User;
12
+ }>;
13
+ export declare function getUserFromToken(authHeader: AuthHeader, tx: Tx, accessToken: AccessToken, userCtor: UserCtor): Promise<User | null> | null;
14
+ export declare function getUsersFromToken(authHeader: AuthHeader, tx: Tx, accessToken: AccessToken, authMap: AuthMap): Promise<{
15
+ [k: string]: User | null;
16
+ }>;
17
+ export {};
@@ -0,0 +1,77 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.getUsersFromToken = exports.getUserFromToken = exports.validateAccessToken = exports.login = void 0;
4
+ // helpers
5
+ const helpers_1 = require("../helpers");
6
+ // database
7
+ const database_1 = require("../database");
8
+ async function login(authHeader, tx, accessToken, userCtor) {
9
+ if (!authHeader?.startsWith('Basic '))
10
+ helpers_1.AppError.ThrowInvalidCredentials();
11
+ const base64 = authHeader.slice(6);
12
+ const decoded = Buffer.from(base64, 'base64').toString('utf-8');
13
+ const [username, password] = decoded.split(':');
14
+ if (!username || !password)
15
+ helpers_1.AppError.ThrowInvalidCredentials();
16
+ const db = new database_1.Db(tx);
17
+ const user = await db.findOneOrNull(userCtor, { username }, { scopes: ['withExcludedAttributes'] });
18
+ if (!user)
19
+ helpers_1.AppError.ThrowInvalidCredentials();
20
+ const isPasswordValid = await (0, helpers_1.comparePasswords)(password, user.password);
21
+ if (!isPasswordValid)
22
+ helpers_1.AppError.ThrowInvalidCredentials();
23
+ return accessToken.getTokenData(userCtor, user);
24
+ }
25
+ exports.login = login;
26
+ async function validateAccessToken(authHeader, tx, accessToken, userCtor) {
27
+ const user = await getUserFromToken(authHeader, tx, accessToken, userCtor);
28
+ if (!user)
29
+ helpers_1.AppError.ThrowUnauthorized();
30
+ return accessToken.getTokenData(userCtor, user);
31
+ }
32
+ exports.validateAccessToken = validateAccessToken;
33
+ function getUserFromToken(authHeader, tx, accessToken, userCtor) {
34
+ try {
35
+ const token = getBearerToken(authHeader);
36
+ const payload = accessToken.verifyToken(token);
37
+ const key = accessToken.getKey(userCtor);
38
+ const id = payload[key];
39
+ if (!id)
40
+ return null;
41
+ const db = new database_1.Db(tx);
42
+ return db.findOneOrNull(userCtor, id);
43
+ }
44
+ catch {
45
+ return null;
46
+ }
47
+ }
48
+ exports.getUserFromToken = getUserFromToken;
49
+ async function getUsersFromToken(authHeader, tx, accessToken, authMap) {
50
+ try {
51
+ const token = getBearerToken(authHeader);
52
+ const payload = accessToken.verifyToken(token);
53
+ const results = await Promise.all(Object.entries(authMap).map(async ([type, userCtor]) => {
54
+ const key = accessToken.getKey(userCtor);
55
+ const id = payload[key];
56
+ if (!id)
57
+ return [type, null];
58
+ const db = new database_1.Db(tx);
59
+ const user = await db.findOneOrNull(userCtor, id);
60
+ return [type, user];
61
+ }));
62
+ return Object.fromEntries(results);
63
+ }
64
+ catch {
65
+ return Object.fromEntries(Object.keys(authMap).map((type) => [type, null]));
66
+ }
67
+ }
68
+ exports.getUsersFromToken = getUsersFromToken;
69
+ // internal functions
70
+ function getBearerToken(authHeader) {
71
+ if (!authHeader)
72
+ throw new Error('Missing authorization header');
73
+ const [type, token] = authHeader.split(' ');
74
+ if (type !== 'Bearer' || !token)
75
+ throw new Error('Invalid authorization format');
76
+ return token;
77
+ }
@@ -0,0 +1,11 @@
1
+ import { BaseAuth } from './base-auth.class';
2
+ import { User } from '../database';
3
+ export type UserCtor = BaseModelCtor<User>;
4
+ export type AuthMap = Record<string, UserCtor>;
5
+ export type UserType<AM extends AuthMap> = keyof AM;
6
+ export type AuthUsers<AM extends AuthMap> = {
7
+ [K in keyof AM]: InstanceType<AM[K]> | null;
8
+ };
9
+ export interface AuthCtor<AM extends AuthMap, AU extends AuthUsers<AM>, BA extends BaseAuth<AM>> {
10
+ new (authUsers: AU): BA;
11
+ }
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
@@ -0,0 +1,9 @@
1
+ import type { AuthMap, UserType, AuthUsers } from './authentication.types';
2
+ export declare abstract class BaseAuth<AM extends AuthMap> {
3
+ private __authUsers;
4
+ constructor(authUsers: AuthUsers<AM>);
5
+ free(): void;
6
+ notSetYet(): void;
7
+ isUserAuth<T extends UserType<AM>>(type: T): NonNullable<AuthUsers<AM>[T]>;
8
+ isAnyUserAuth<const T extends readonly UserType<AM>[]>(types: T): { [I in keyof T]: InstanceType<AM[T[I]]> | null; };
9
+ }
@@ -0,0 +1,29 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.BaseAuth = void 0;
4
+ // helpers
5
+ const helpers_1 = require("../helpers");
6
+ class BaseAuth {
7
+ constructor(authUsers) {
8
+ this.__authUsers = authUsers;
9
+ }
10
+ free() {
11
+ (0, helpers_1.printWarning)('authentication', 'free access');
12
+ }
13
+ notSetYet() {
14
+ (0, helpers_1.printWarning)('authentication', 'auth not set yet');
15
+ }
16
+ isUserAuth(type) {
17
+ const user = this.__authUsers[type];
18
+ if (!user)
19
+ helpers_1.AppError.ThrowUnauthorized();
20
+ return user;
21
+ }
22
+ isAnyUserAuth(types) {
23
+ const users = types.map((type) => this.__authUsers[type]);
24
+ if (users.every((user) => !user))
25
+ helpers_1.AppError.ThrowUnauthorized();
26
+ return users;
27
+ }
28
+ }
29
+ exports.BaseAuth = BaseAuth;
@@ -0,0 +1,4 @@
1
+ export * from './access-token.class';
2
+ export * from './authentication.helpers';
3
+ export * from './authentication.types';
4
+ export * from './base-auth.class';
@@ -0,0 +1,20 @@
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 __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ __exportStar(require("./access-token.class"), exports);
18
+ __exportStar(require("./authentication.helpers"), exports);
19
+ __exportStar(require("./authentication.types"), exports);
20
+ __exportStar(require("./base-auth.class"), exports);
@@ -0,0 +1,15 @@
1
+ import { Db } from './db.class';
2
+ import { BaseModel } from './models';
3
+ type SetArrayConfig<T extends BaseModel, M extends BaseModel> = {
4
+ instances: T[];
5
+ getManyFn: (ids: number[]) => Promise<M[]>;
6
+ keyName: string;
7
+ relationName: string;
8
+ };
9
+ export declare abstract class BaseService {
10
+ protected tx: Tx;
11
+ protected db: Db;
12
+ constructor(tx: Tx);
13
+ protected __setArray<T extends BaseModel, M extends BaseModel>(config: SetArrayConfig<T, M>): Promise<void>;
14
+ }
15
+ export {};
@@ -0,0 +1,28 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.BaseService = void 0;
4
+ const db_class_1 = require("./db.class");
5
+ class BaseService {
6
+ constructor(tx) {
7
+ this.tx = tx;
8
+ this.db = new db_class_1.Db(tx);
9
+ }
10
+ async __setArray(config) {
11
+ const { instances, getManyFn, keyName, relationName } = config;
12
+ if (!instances.length)
13
+ return;
14
+ const instanceIds = instances.map((instance) => instance.id);
15
+ const instancesToSet = await getManyFn(instanceIds);
16
+ const instancesToSetMap = new Map();
17
+ for (const instanceToSet of instancesToSet) {
18
+ const key = instanceToSet[keyName];
19
+ const list = instancesToSetMap.get(key) || [];
20
+ list.push(instanceToSet);
21
+ instancesToSetMap.set(key, list);
22
+ }
23
+ for (const instance of instances) {
24
+ instance[relationName] = instancesToSetMap.get(instance.id) || [];
25
+ }
26
+ }
27
+ }
28
+ exports.BaseService = BaseService;
@@ -0,0 +1,4 @@
1
+ import type { Transaction } from 'sequelize';
2
+ export declare function startTransaction(): Promise<Transaction>;
3
+ export declare function disableForeignKeyChecks(t?: Transaction): Promise<[unknown[], unknown]>;
4
+ export declare function enableForeignKeyChecks(t?: Transaction): Promise<[unknown[], unknown]>;
@@ -0,0 +1,19 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.enableForeignKeyChecks = exports.disableForeignKeyChecks = exports.startTransaction = void 0;
4
+ const init_database_1 = require("./init-database");
5
+ function startTransaction() {
6
+ const dbClient = (0, init_database_1.getDbClient)();
7
+ return dbClient.transaction();
8
+ }
9
+ exports.startTransaction = startTransaction;
10
+ function disableForeignKeyChecks(t) {
11
+ const dbClient = (0, init_database_1.getDbClient)();
12
+ return dbClient.query('SET FOREIGN_KEY_CHECKS = 0', { transaction: t });
13
+ }
14
+ exports.disableForeignKeyChecks = disableForeignKeyChecks;
15
+ function enableForeignKeyChecks(t) {
16
+ const dbClient = (0, init_database_1.getDbClient)();
17
+ return dbClient.query('SET FOREIGN_KEY_CHECKS = 1', { transaction: t });
18
+ }
19
+ exports.enableForeignKeyChecks = enableForeignKeyChecks;
@@ -0,0 +1,59 @@
1
+ import * as seq from 'sequelize-typescript';
2
+ import { BaseModel } from './models';
3
+ import type { OptionalFields, OptionalIfNullish } from 'pangea-helpers';
4
+ import type { InferCreationAttributes, CreationOptional, NonAttribute, AbstractDataTypeConstructor, AbstractDataType, Transaction, WhereOptions } from 'sequelize';
5
+ import type { ModelCtor } from 'sequelize-typescript';
6
+ declare global {
7
+ type ModelId = number;
8
+ type ModelName = string;
9
+ type BaseModelCtor<BM extends BaseModel = BaseModel> = typeof BaseModel & ModelCtor<BM>;
10
+ type ColOptional<T> = CreationOptional<T>;
11
+ type ColExcluded<T> = T & {
12
+ __brand: 'excluded';
13
+ };
14
+ type ColVirtual<T> = NonAttribute<T>;
15
+ type Tx = Transaction;
16
+ type Where<BM extends BaseModel> = WhereOptions<BM> & Record<symbol, any>;
17
+ type InsertParams<BM extends BaseModel> = OptionalIfNullish<OptionalIfOptional<StripRelations<OptionalFields<IncludeExcluded<InferCreationAttributes<BM>>, keyof InferCreationAttributes<BM> & 'id'>>>>;
18
+ type UpdateParams<BM extends BaseModel> = Partial<InsertParams<BM>>;
19
+ }
20
+ export type Models = Record<ModelName, BaseModelCtor>;
21
+ export type Seeds<M extends Models> = {
22
+ [T in keyof M]: InsertParams<InstanceType<M[T]>>[];
23
+ };
24
+ export type ConnectDatabase = () => void;
25
+ export type DisconnectDatabase = () => void;
26
+ export type Index = {
27
+ field?: string;
28
+ fields?: string[];
29
+ unique?: boolean;
30
+ };
31
+ export type ColumnType = keyof typeof seq.DataType | AbstractDataTypeConstructor | AbstractDataType;
32
+ export type DefaultValue = unknown;
33
+ export type ColGeneralOptions = {
34
+ nullable?: boolean;
35
+ defaultValue?: DefaultValue;
36
+ index?: boolean;
37
+ unique?: boolean;
38
+ exclude?: boolean;
39
+ };
40
+ export type ColVirtualGet = (this: any) => unknown;
41
+ export type ColVirtualSet = (this: any, val: any) => void;
42
+ export type ColVirtualOptions = {
43
+ get?: ColVirtualGet;
44
+ set?: ColVirtualSet;
45
+ };
46
+ export type GetModelFn = () => BaseModelCtor;
47
+ type OptionalIfOptional<T> = {
48
+ [K in keyof T as undefined extends T[K] ? K : never]?: Exclude<T[K], undefined>;
49
+ } & {
50
+ [K in keyof T as undefined extends T[K] ? never : K]: T[K];
51
+ };
52
+ type IncludeExcluded<T> = {
53
+ [K in keyof T]-?: Exclude<T[K], undefined> extends ColExcluded<infer U> ? U : T[K];
54
+ };
55
+ type IsRelation<T> = NonNullable<T> extends BaseModel | Array<BaseModel> ? true : false;
56
+ type StripRelations<T> = {
57
+ [K in keyof T as IsRelation<T[K]> extends true ? never : K]: T[K];
58
+ };
59
+ export {};
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
@@ -0,0 +1,11 @@
1
+ import { Sequelize } from 'sequelize-typescript';
2
+ import type { Models, Seeds } from './database.types';
3
+ type InitDatabaseConfig = {
4
+ logging?: boolean;
5
+ };
6
+ export declare function initDatabase<M extends Models>(models: M, seeds: Seeds<M>, config?: InitDatabaseConfig): {
7
+ connectDatabase: () => Promise<void>;
8
+ disconnectDatabase: () => Promise<void>;
9
+ };
10
+ export declare function getDbClient(): Sequelize;
11
+ export {};
@@ -0,0 +1,69 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.getDbClient = exports.initDatabase = void 0;
4
+ const sequelize_typescript_1 = require("sequelize-typescript");
5
+ // helpers
6
+ const helpers_1 = require("../helpers");
7
+ const seed_helpers_1 = require("./seed.helpers");
8
+ let dbClient = undefined;
9
+ function initDatabase(models, seeds, config = {}) {
10
+ if (dbClient)
11
+ throw new Error('DbClient instance has already been initialized');
12
+ dbClient = new sequelize_typescript_1.Sequelize({
13
+ dialect: 'mysql',
14
+ host: (0, helpers_1.getEnvStr)('DB_HOST'),
15
+ port: (0, helpers_1.getEnvInt)('DB_PORT'),
16
+ username: (0, helpers_1.getEnvStr)('DB_USERNAME'),
17
+ password: (0, helpers_1.getEnvStr)('DB_PASSWORD'),
18
+ database: (0, helpers_1.getEnvStr)('DB_DATABASE'),
19
+ pool: { max: 5, min: 0, acquire: 30000, idle: 10000 },
20
+ models: Object.values(models),
21
+ logging: config.logging ? logQuery : false,
22
+ benchmark: true,
23
+ });
24
+ async function connectDatabase() {
25
+ try {
26
+ const dbClient = getDbClient();
27
+ await dbClient.authenticate();
28
+ (0, helpers_1.printSuccess)('database', 'database connected');
29
+ if ((0, helpers_1.getEnvStr)('ENVIRONMENT') !== 'production') {
30
+ if ((0, helpers_1.getEnvBool)('DB_DROP_TABLES'))
31
+ await (0, seed_helpers_1.dropTables)();
32
+ await (0, seed_helpers_1.syncTables)();
33
+ if ((0, helpers_1.getEnvBool)('DB_SEED_TABLES'))
34
+ await (0, seed_helpers_1.seedTables)(models, seeds);
35
+ }
36
+ }
37
+ catch (err) {
38
+ (0, helpers_1.printDanger)('database', err);
39
+ throw err;
40
+ }
41
+ }
42
+ async function disconnectDatabase() {
43
+ try {
44
+ const dbClient = getDbClient();
45
+ await dbClient.close();
46
+ (0, helpers_1.printSuccess)('database', 'database disconnected');
47
+ }
48
+ catch (err) {
49
+ (0, helpers_1.printDanger)('database', err);
50
+ }
51
+ }
52
+ return { connectDatabase, disconnectDatabase };
53
+ }
54
+ exports.initDatabase = initDatabase;
55
+ function getDbClient() {
56
+ if (!dbClient)
57
+ throw new Error('DbClient instance is not initialized');
58
+ return dbClient;
59
+ }
60
+ exports.getDbClient = getDbClient;
61
+ // internal functions
62
+ function logQuery(sql, timing) {
63
+ (0, helpers_1.printInfo)('query', sql);
64
+ if (!timing)
65
+ return;
66
+ const logFns = { success: helpers_1.printSuccess, warning: helpers_1.printWarning, danger: helpers_1.printDanger };
67
+ const level = timing <= 50 ? 'success' : timing <= 200 ? 'warning' : 'danger';
68
+ logFns[level]('timing', `${timing} ms`);
69
+ }
@@ -0,0 +1,64 @@
1
+ import { BaseModel } from './models';
2
+ type AttributeField = string;
3
+ type AttributeOp = 'COUNT' | 'SUM';
4
+ type AttributeColumn = AttributeField | [AttributeOp, AttributeField];
5
+ type AttributeAlias = string;
6
+ type Attribute = [AttributeColumn, AttributeAlias];
7
+ type IncludeItem = {
8
+ relation?: string;
9
+ active?: boolean;
10
+ include?: IncludeItem[];
11
+ };
12
+ type Filters<BM extends BaseModel> = ModelId | Where<BM>;
13
+ type Group = string[];
14
+ type Order = Record<string, 'asc' | 'desc'>;
15
+ type FindOneOptions = {
16
+ scopes?: string[];
17
+ attributes?: Attribute[];
18
+ include?: IncludeItem[];
19
+ order?: Order;
20
+ paranoid?: boolean;
21
+ };
22
+ type FindManyOptions<BM extends BaseModel> = {
23
+ attributes?: Attribute[];
24
+ include?: IncludeItem[];
25
+ where?: Where<BM>;
26
+ searchFields?: string[];
27
+ search?: string | null;
28
+ group?: Group;
29
+ order?: Order;
30
+ page?: number | null;
31
+ pageSize?: number | null;
32
+ paranoid?: 'active' | 'all' | 'deleted';
33
+ };
34
+ type InsertManyOptions<BM extends BaseModel> = {
35
+ ignoreDuplicates?: boolean;
36
+ updateOnDuplicate?: (keyof BM)[];
37
+ };
38
+ type Target<BM extends BaseModel> = Filters<BM> | BM;
39
+ export declare class Db {
40
+ private __tx?;
41
+ constructor(tx: Tx);
42
+ findOneOrNull<BM extends BaseModel>(model: BaseModelCtor<BM>, filters: Filters<BM>, options?: FindOneOptions): Promise<BM | null>;
43
+ findOne<BM extends BaseModel>(model: BaseModelCtor<BM>, filters: Filters<BM>, options?: FindOneOptions): Promise<BM>;
44
+ findMany<BM extends BaseModel>(model: BaseModelCtor<BM>, options?: FindManyOptions<BM>): Promise<{
45
+ instances: BM[];
46
+ totalCount: number;
47
+ }>;
48
+ insertOne<BM extends BaseModel>(model: BaseModelCtor<BM>, params: InsertParams<BM>): Promise<BM>;
49
+ insertMany<BM extends BaseModel>(model: BaseModelCtor<BM>, data: InsertParams<BM>[], options?: InsertManyOptions<BM>): Promise<number>;
50
+ updateOne<BM extends BaseModel>(model: BaseModelCtor<BM>, target: Target<BM>, params: UpdateParams<BM>): Promise<BM>;
51
+ updateMany<BM extends BaseModel>(model: BaseModelCtor<BM>, where: Where<BM>, params: UpdateParams<BM>): Promise<number>;
52
+ deleteOne<BM extends BaseModel>(model: BaseModelCtor<BM>, target: Target<BM>): Promise<BM | null>;
53
+ deleteMany<BM extends BaseModel>(model: BaseModelCtor<BM>, where: Where<BM>): Promise<number>;
54
+ destroyOne<BM extends BaseModel>(model: BaseModelCtor<BM>, target: Target<BM>): Promise<BM | null>;
55
+ destroyMany<BM extends BaseModel>(model: BaseModelCtor<BM>, where: Where<BM>): Promise<number>;
56
+ restoreOne<BM extends BaseModel>(model: BaseModelCtor<BM>, target: Target<BM>): Promise<BM>;
57
+ restoreMany<BM extends BaseModel>(model: BaseModelCtor<BM>, where: Where<BM>): Promise<void>;
58
+ private __getInstance;
59
+ private __deleteOne;
60
+ private __deleteMany;
61
+ enableForeignKeyChecks(): Promise<[unknown[], unknown]>;
62
+ disableForeignKeyChecks(): Promise<[unknown[], unknown]>;
63
+ }
64
+ export {};