@xfilecom/core-sdk 1.3.23

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 (96) hide show
  1. package/README.md +664 -0
  2. package/dist/core.module.d.ts +39 -0
  3. package/dist/core.module.js +188 -0
  4. package/dist/core.module.js.map +1 -0
  5. package/dist/database/database.constants.d.ts +2 -0
  6. package/dist/database/database.constants.js +6 -0
  7. package/dist/database/database.constants.js.map +1 -0
  8. package/dist/database/database.module.d.ts +19 -0
  9. package/dist/database/database.module.js +56 -0
  10. package/dist/database/database.module.js.map +1 -0
  11. package/dist/database/database.query.d.ts +103 -0
  12. package/dist/database/database.query.example.d.ts +36 -0
  13. package/dist/database/database.query.example.js +148 -0
  14. package/dist/database/database.query.example.js.map +1 -0
  15. package/dist/database/database.query.js +369 -0
  16. package/dist/database/database.query.js.map +1 -0
  17. package/dist/database/database.service.d.ts +18 -0
  18. package/dist/database/database.service.js +110 -0
  19. package/dist/database/database.service.js.map +1 -0
  20. package/dist/database/example-usage.d.ts +0 -0
  21. package/dist/database/example-usage.js +1 -0
  22. package/dist/database/example-usage.js.map +1 -0
  23. package/dist/decorators/public.decorator.d.ts +2 -0
  24. package/dist/decorators/public.decorator.js +8 -0
  25. package/dist/decorators/public.decorator.js.map +1 -0
  26. package/dist/decorators/roles.decorator.d.ts +2 -0
  27. package/dist/decorators/roles.decorator.js +8 -0
  28. package/dist/decorators/roles.decorator.js.map +1 -0
  29. package/dist/decorators/user.decorator.d.ts +7 -0
  30. package/dist/decorators/user.decorator.js +10 -0
  31. package/dist/decorators/user.decorator.js.map +1 -0
  32. package/dist/filters/exception.filter.d.ts +36 -0
  33. package/dist/filters/exception.filter.js +201 -0
  34. package/dist/filters/exception.filter.js.map +1 -0
  35. package/dist/guards/jwt-auth.guard.d.ts +14 -0
  36. package/dist/guards/jwt-auth.guard.js +103 -0
  37. package/dist/guards/jwt-auth.guard.js.map +1 -0
  38. package/dist/guards/roles.guard.d.ts +7 -0
  39. package/dist/guards/roles.guard.js +47 -0
  40. package/dist/guards/roles.guard.js.map +1 -0
  41. package/dist/index.d.ts +29 -0
  42. package/dist/index.js +91 -0
  43. package/dist/index.js.map +1 -0
  44. package/dist/interceptors/database-check.interceptor.d.ts +12 -0
  45. package/dist/interceptors/database-check.interceptor.js +60 -0
  46. package/dist/interceptors/database-check.interceptor.js.map +1 -0
  47. package/dist/interceptors/error-handling.interceptor.d.ts +8 -0
  48. package/dist/interceptors/error-handling.interceptor.js +33 -0
  49. package/dist/interceptors/error-handling.interceptor.js.map +1 -0
  50. package/dist/interceptors/logging.interceptor.d.ts +21 -0
  51. package/dist/interceptors/logging.interceptor.js +167 -0
  52. package/dist/interceptors/logging.interceptor.js.map +1 -0
  53. package/dist/interceptors/response-transform.interceptor.d.ts +5 -0
  54. package/dist/interceptors/response-transform.interceptor.js +30 -0
  55. package/dist/interceptors/response-transform.interceptor.js.map +1 -0
  56. package/dist/utils/auth.helpers.d.ts +19 -0
  57. package/dist/utils/auth.helpers.js +77 -0
  58. package/dist/utils/auth.helpers.js.map +1 -0
  59. package/dist/utils/config-loader.utils.d.ts +22 -0
  60. package/dist/utils/config-loader.utils.js +77 -0
  61. package/dist/utils/config-loader.utils.js.map +1 -0
  62. package/dist/utils/config.validator.d.ts +13 -0
  63. package/dist/utils/config.validator.js +82 -0
  64. package/dist/utils/config.validator.js.map +1 -0
  65. package/dist/utils/controller.helpers.d.ts +58 -0
  66. package/dist/utils/controller.helpers.js +104 -0
  67. package/dist/utils/controller.helpers.js.map +1 -0
  68. package/dist/utils/crypto.utils.d.ts +12 -0
  69. package/dist/utils/crypto.utils.js +53 -0
  70. package/dist/utils/crypto.utils.js.map +1 -0
  71. package/dist/utils/email-hash.utils.d.ts +7 -0
  72. package/dist/utils/email-hash.utils.js +42 -0
  73. package/dist/utils/email-hash.utils.js.map +1 -0
  74. package/dist/utils/env.utils.d.ts +8 -0
  75. package/dist/utils/env.utils.js +27 -0
  76. package/dist/utils/env.utils.js.map +1 -0
  77. package/dist/utils/error.utils.d.ts +6 -0
  78. package/dist/utils/error.utils.js +65 -0
  79. package/dist/utils/error.utils.js.map +1 -0
  80. package/dist/utils/hash-verification.utils.d.ts +35 -0
  81. package/dist/utils/hash-verification.utils.js +133 -0
  82. package/dist/utils/hash-verification.utils.js.map +1 -0
  83. package/dist/utils/logger.helpers.d.ts +71 -0
  84. package/dist/utils/logger.helpers.js +293 -0
  85. package/dist/utils/logger.helpers.js.map +1 -0
  86. package/dist/utils/logging.config.d.ts +6 -0
  87. package/dist/utils/logging.config.js +42 -0
  88. package/dist/utils/logging.config.js.map +1 -0
  89. package/dist/utils/service.helpers.d.ts +22 -0
  90. package/dist/utils/service.helpers.js +73 -0
  91. package/dist/utils/service.helpers.js.map +1 -0
  92. package/dist/utils/yaml-config.loader.d.ts +15 -0
  93. package/dist/utils/yaml-config.loader.js +219 -0
  94. package/dist/utils/yaml-config.loader.js.map +1 -0
  95. package/package.json +47 -0
  96. package/scripts/publish-to-gitlab.mjs +209 -0
@@ -0,0 +1,369 @@
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ var __metadata = (this && this.__metadata) || function (k, v) {
9
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
10
+ };
11
+ var __param = (this && this.__param) || function (paramIndex, decorator) {
12
+ return function (target, key) { decorator(target, key, paramIndex); }
13
+ };
14
+ Object.defineProperty(exports, "__esModule", { value: true });
15
+ exports.DatabaseQuery = void 0;
16
+ const common_1 = require("@nestjs/common");
17
+ const drizzle_orm_1 = require("drizzle-orm");
18
+ const database_constants_1 = require("./database.constants");
19
+ const database_service_1 = require("./database.service");
20
+ let DatabaseQuery = class DatabaseQuery {
21
+ constructor(databaseService, schema) {
22
+ this.databaseService = databaseService;
23
+ this.schema = schema;
24
+ }
25
+ getDb() {
26
+ return this.databaseService.db;
27
+ }
28
+ getTable(tableName) {
29
+ const table = this.schema[tableName];
30
+ if (!table) {
31
+ throw new Error(`Table "${tableName}" not found in schema`);
32
+ }
33
+ return table;
34
+ }
35
+ selectFields(table, fields) {
36
+ if (fields.length === 0) {
37
+ return undefined;
38
+ }
39
+ const selectedFields = {};
40
+ for (const field of fields) {
41
+ if (table[field]) {
42
+ selectedFields[field] = table[field];
43
+ }
44
+ }
45
+ return Object.keys(selectedFields).length > 0 ? selectedFields : undefined;
46
+ }
47
+ buildSearchCondition(table, search) {
48
+ if (!search || search.length === 0) {
49
+ return undefined;
50
+ }
51
+ const conditions = search
52
+ .filter((s) => s.keyword && s.keyword.trim() !== '' && s.fields.length > 0)
53
+ .map((s) => {
54
+ const fieldConditions = s.fields.map((field) => {
55
+ const tableField = table[field];
56
+ if (tableField) {
57
+ return (0, drizzle_orm_1.like)(tableField, `%${s.keyword}%`);
58
+ }
59
+ return (0, drizzle_orm_1.sql) `${drizzle_orm_1.sql.raw(field)} LIKE ${`%${s.keyword}%`}`;
60
+ });
61
+ return (0, drizzle_orm_1.or)(...fieldConditions);
62
+ });
63
+ return conditions.length > 0 ? (0, drizzle_orm_1.and)(...conditions) : undefined;
64
+ }
65
+ isPlainObjectWhere(v) {
66
+ return typeof v === 'object' && v !== null && !('getSQL' in v);
67
+ }
68
+ buildWhereFromObject(tableSchema, whereObj) {
69
+ const conditions = Object.entries(whereObj)
70
+ .filter(([, v]) => v !== undefined && v !== null)
71
+ .map(([field, value]) => {
72
+ const col = tableSchema[field];
73
+ if (col)
74
+ return (0, drizzle_orm_1.eq)(col, value);
75
+ return (0, drizzle_orm_1.sql) `${drizzle_orm_1.sql.raw(field)} = ${value}`;
76
+ });
77
+ if (conditions.length === 0)
78
+ return undefined;
79
+ return conditions.length === 1 ? conditions[0] : (0, drizzle_orm_1.and)(...conditions);
80
+ }
81
+ normalizeWhere(tableSchema, w) {
82
+ if (w == null)
83
+ return undefined;
84
+ if (this.isPlainObjectWhere(w))
85
+ return this.buildWhereFromObject(tableSchema, w);
86
+ return w;
87
+ }
88
+ buildSortCondition(table, sort) {
89
+ if (!sort || sort.length === 0) {
90
+ return [];
91
+ }
92
+ return sort.map((s) => {
93
+ const tableField = table[s.field];
94
+ if (tableField) {
95
+ return s.order === 'desc' ? (0, drizzle_orm_1.desc)(tableField) : (0, drizzle_orm_1.asc)(tableField);
96
+ }
97
+ return s.order === 'desc'
98
+ ? (0, drizzle_orm_1.sql) `${drizzle_orm_1.sql.raw(s.field)} DESC`
99
+ : (0, drizzle_orm_1.sql) `${drizzle_orm_1.sql.raw(s.field)} ASC`;
100
+ });
101
+ }
102
+ getTableIdColumn(table) {
103
+ if (table.id)
104
+ return table.id;
105
+ const key = Object.keys(table).find((k) => k.toLowerCase().includes('id'));
106
+ return key ? table[key] : table.id;
107
+ }
108
+ async findOne(table, options = {}) {
109
+ const db = this.getDb();
110
+ const tableSchema = this.getTable(table);
111
+ const selectedFields = this.selectFields(tableSchema, options.fields ?? []);
112
+ const whereConditions = [];
113
+ const whereNorm = this.normalizeWhere(tableSchema, options.where);
114
+ if (whereNorm)
115
+ whereConditions.push(whereNorm);
116
+ const searchCondition = this.buildSearchCondition(tableSchema, options.search ?? []);
117
+ if (searchCondition)
118
+ whereConditions.push(searchCondition);
119
+ const whereClause = whereConditions.length > 0 ? (0, drizzle_orm_1.and)(...whereConditions) : undefined;
120
+ const orderBy = this.buildSortCondition(tableSchema, options.sort ?? []);
121
+ let queryBuilder = selectedFields
122
+ ? db.select(selectedFields).from(tableSchema)
123
+ : db.select().from(tableSchema);
124
+ if (whereClause)
125
+ queryBuilder = queryBuilder.where(whereClause);
126
+ if (orderBy.length > 0)
127
+ queryBuilder = queryBuilder.orderBy(...orderBy);
128
+ queryBuilder = queryBuilder.limit(1);
129
+ const rows = await queryBuilder;
130
+ return rows[0] ?? undefined;
131
+ }
132
+ async findById(table, id, options = {}) {
133
+ const db = this.getDb();
134
+ const tableSchema = this.getTable(table);
135
+ const idCol = options.idField ? tableSchema[options.idField] : this.getTableIdColumn(tableSchema);
136
+ if (!idCol) {
137
+ throw new Error(`Table "${table}" has no id column. Provide idField in options.`);
138
+ }
139
+ const selectedFields = this.selectFields(tableSchema, options.fields || []);
140
+ let queryBuilder = selectedFields
141
+ ? db.select(selectedFields).from(tableSchema)
142
+ : db.select().from(tableSchema);
143
+ queryBuilder = queryBuilder.where((0, drizzle_orm_1.eq)(idCol, id)).limit(1);
144
+ const rows = await queryBuilder;
145
+ return rows[0] ?? undefined;
146
+ }
147
+ async count(table, options = {}) {
148
+ const db = this.getDb();
149
+ const tableSchema = this.getTable(table);
150
+ let queryBuilder = db.select({ count: (0, drizzle_orm_1.sql) `count(*)` }).from(tableSchema);
151
+ const whereNorm = this.normalizeWhere(tableSchema, options.where);
152
+ if (whereNorm)
153
+ queryBuilder = queryBuilder.where(whereNorm);
154
+ const [row] = await queryBuilder;
155
+ return Number(row?.count ?? 0);
156
+ }
157
+ async exists(table, options = {}) {
158
+ const n = await this.count(table, options);
159
+ return n > 0;
160
+ }
161
+ async query(options) {
162
+ return this.select(options);
163
+ }
164
+ async select(tableOrOptions, fields, options) {
165
+ let table;
166
+ let resolvedFields;
167
+ let resolvedOptions;
168
+ if (typeof tableOrOptions === 'string') {
169
+ table = tableOrOptions;
170
+ resolvedFields = fields ?? [];
171
+ resolvedOptions = options ?? {};
172
+ }
173
+ else {
174
+ const opts = tableOrOptions;
175
+ table = opts.table;
176
+ resolvedFields = opts.fields ?? [];
177
+ resolvedOptions = {
178
+ sort: opts.sort,
179
+ pagination: opts.pagination,
180
+ search: opts.search,
181
+ where: opts.where,
182
+ };
183
+ }
184
+ const db = this.getDb();
185
+ const tableSchema = this.getTable(table);
186
+ const selectedFields = this.selectFields(tableSchema, resolvedFields);
187
+ const whereConditions = [];
188
+ const whereNorm = this.normalizeWhere(tableSchema, resolvedOptions.where);
189
+ if (whereNorm)
190
+ whereConditions.push(whereNorm);
191
+ const searchCondition = this.buildSearchCondition(tableSchema, resolvedOptions.search ?? []);
192
+ if (searchCondition)
193
+ whereConditions.push(searchCondition);
194
+ const whereClause = whereConditions.length > 0 ? (0, drizzle_orm_1.and)(...whereConditions) : undefined;
195
+ const orderBy = this.buildSortCondition(tableSchema, resolvedOptions.sort ?? []);
196
+ const pagination = resolvedOptions.pagination;
197
+ let total = 0;
198
+ let limit = pagination?.limit;
199
+ let offset = pagination ? (pagination.page - 1) * pagination.limit : undefined;
200
+ if (pagination) {
201
+ const countQuery = db
202
+ .select({ count: (0, drizzle_orm_1.sql) `count(*)` })
203
+ .from(tableSchema);
204
+ if (whereClause) {
205
+ countQuery.where(whereClause);
206
+ }
207
+ const [countResult] = await countQuery;
208
+ total = countResult?.count || 0;
209
+ }
210
+ let queryBuilder = selectedFields
211
+ ? db.select(selectedFields).from(tableSchema)
212
+ : db.select().from(tableSchema);
213
+ if (whereClause) {
214
+ queryBuilder = queryBuilder.where(whereClause);
215
+ }
216
+ if (orderBy.length > 0) {
217
+ queryBuilder = queryBuilder.orderBy(...orderBy);
218
+ }
219
+ if (limit !== undefined) {
220
+ queryBuilder = queryBuilder.limit(limit);
221
+ }
222
+ if (offset !== undefined) {
223
+ queryBuilder = queryBuilder.offset(offset);
224
+ }
225
+ const data = await queryBuilder;
226
+ const result = {
227
+ data: data,
228
+ };
229
+ if (pagination) {
230
+ result.pagination = {
231
+ total,
232
+ page: pagination.page,
233
+ limit: pagination.limit,
234
+ totalPages: Math.ceil(total / pagination.limit),
235
+ hasNext: pagination.page * pagination.limit < total,
236
+ hasPrev: pagination.page > 1,
237
+ };
238
+ }
239
+ return result;
240
+ }
241
+ async insertOne(options) {
242
+ return this.insert(options.table, options.fields || [], {
243
+ values: options.values,
244
+ });
245
+ }
246
+ async insert(table, fields, options = {}) {
247
+ const db = this.getDb();
248
+ const tableSchema = this.getTable(table);
249
+ if (!options.values || Object.keys(options.values).length === 0) {
250
+ throw new Error('values option is required for insert');
251
+ }
252
+ const fieldsToInsert = fields.length === 0
253
+ ? Object.keys(options.values)
254
+ : fields;
255
+ const valuesToInsert = {};
256
+ for (const field of fieldsToInsert) {
257
+ if (options.values[field] !== undefined) {
258
+ valuesToInsert[field] = options.values[field];
259
+ }
260
+ }
261
+ const insertResult = await db.insert(tableSchema).values(valuesToInsert);
262
+ let insertedData = [];
263
+ if (insertResult && insertResult.insertId) {
264
+ const insertId = insertResult.insertId;
265
+ const idField = tableSchema.id || tableSchema[Object.keys(tableSchema).find(k => k.toLowerCase().includes('id')) || 'id'];
266
+ if (idField) {
267
+ insertedData = await db
268
+ .select()
269
+ .from(tableSchema)
270
+ .where((0, drizzle_orm_1.eq)(idField, insertId))
271
+ .limit(1);
272
+ }
273
+ }
274
+ else {
275
+ const whereConditions = Object.keys(valuesToInsert).map((key) => {
276
+ const field = tableSchema[key];
277
+ return field ? (0, drizzle_orm_1.eq)(field, valuesToInsert[key]) : null;
278
+ }).filter(Boolean);
279
+ if (whereConditions.length > 0) {
280
+ insertedData = await db
281
+ .select()
282
+ .from(tableSchema)
283
+ .where((0, drizzle_orm_1.and)(...whereConditions))
284
+ .limit(1);
285
+ }
286
+ }
287
+ return insertedData;
288
+ }
289
+ async updateOne(options) {
290
+ return this.update(options.table, options.fields || [], {
291
+ values: options.values,
292
+ where: options.where,
293
+ });
294
+ }
295
+ async update(table, fields, options = {}) {
296
+ const db = this.getDb();
297
+ const tableSchema = this.getTable(table);
298
+ if (!options.values || Object.keys(options.values).length === 0) {
299
+ throw new Error('values option is required for update');
300
+ }
301
+ if (!options.where) {
302
+ throw new Error('where option is required for update');
303
+ }
304
+ const whereNorm = this.normalizeWhere(tableSchema, options.where);
305
+ if (!whereNorm) {
306
+ throw new Error('where has no valid keys (or plain object only had undefined/null)');
307
+ }
308
+ const fieldsToUpdate = fields.length === 0
309
+ ? Object.keys(options.values)
310
+ : fields;
311
+ const valuesToUpdate = {};
312
+ for (const field of fieldsToUpdate) {
313
+ if (options.values[field] !== undefined) {
314
+ valuesToUpdate[field] = options.values[field];
315
+ }
316
+ }
317
+ const recordsToUpdate = await db
318
+ .select()
319
+ .from(tableSchema)
320
+ .where(whereNorm)
321
+ .limit(1000);
322
+ if (recordsToUpdate.length === 0) {
323
+ return [];
324
+ }
325
+ await db
326
+ .update(tableSchema)
327
+ .set(valuesToUpdate)
328
+ .where(whereNorm);
329
+ const updatedData = await db
330
+ .select()
331
+ .from(tableSchema)
332
+ .where(whereNorm)
333
+ .limit(recordsToUpdate.length);
334
+ return updatedData;
335
+ }
336
+ async deleteOne(options) {
337
+ return this.delete(options.table, [], {
338
+ where: options.where,
339
+ });
340
+ }
341
+ async delete(table, fields, options = {}) {
342
+ const db = this.getDb();
343
+ const tableSchema = this.getTable(table);
344
+ if (!options.where) {
345
+ throw new Error('where option is required for delete');
346
+ }
347
+ const whereNorm = this.normalizeWhere(tableSchema, options.where);
348
+ if (!whereNorm) {
349
+ throw new Error('where has no valid keys (or plain object only had undefined/null)');
350
+ }
351
+ const recordsToDelete = await db
352
+ .select()
353
+ .from(tableSchema)
354
+ .where(whereNorm)
355
+ .limit(1000);
356
+ if (recordsToDelete.length === 0) {
357
+ return [];
358
+ }
359
+ await db.delete(tableSchema).where(whereNorm);
360
+ return recordsToDelete;
361
+ }
362
+ };
363
+ exports.DatabaseQuery = DatabaseQuery;
364
+ exports.DatabaseQuery = DatabaseQuery = __decorate([
365
+ (0, common_1.Injectable)(),
366
+ __param(1, (0, common_1.Inject)(database_constants_1.DATABASE_SCHEMA)),
367
+ __metadata("design:paramtypes", [database_service_1.DatabaseService, Object])
368
+ ], DatabaseQuery);
369
+ //# sourceMappingURL=database.query.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"database.query.js","sourceRoot":"","sources":["../../src/database/database.query.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ import { OnModuleInit, OnModuleDestroy } from '@nestjs/common';
2
+ import { DatabaseConfig } from './database.module';
3
+ import * as mysql from 'mysql2/promise';
4
+ import { MySql2Database } from 'drizzle-orm/mysql2';
5
+ export declare class DatabaseService implements OnModuleInit, OnModuleDestroy {
6
+ private readonly config;
7
+ private readonly schema;
8
+ private readonly logger;
9
+ private mysqlPool;
10
+ private _db;
11
+ constructor(config: DatabaseConfig, schema: any);
12
+ onModuleInit(): Promise<void>;
13
+ onModuleDestroy(): Promise<void>;
14
+ private initMySQL;
15
+ get db(): MySql2Database<any>;
16
+ isConnected(): boolean;
17
+ get mysql(): mysql.Pool | null;
18
+ }
@@ -0,0 +1,110 @@
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ var __metadata = (this && this.__metadata) || function (k, v) {
9
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
10
+ };
11
+ var __param = (this && this.__param) || function (paramIndex, decorator) {
12
+ return function (target, key) { decorator(target, key, paramIndex); }
13
+ };
14
+ var DatabaseService_1;
15
+ Object.defineProperty(exports, "__esModule", { value: true });
16
+ exports.DatabaseService = void 0;
17
+ const common_1 = require("@nestjs/common");
18
+ const database_constants_1 = require("./database.constants");
19
+ const mysql = require("mysql2/promise");
20
+ const mysql2_1 = require("drizzle-orm/mysql2");
21
+ let DatabaseService = DatabaseService_1 = class DatabaseService {
22
+ constructor(config, schema) {
23
+ this.config = config;
24
+ this.schema = schema;
25
+ this.logger = new common_1.Logger(DatabaseService_1.name);
26
+ this.mysqlPool = null;
27
+ this._db = null;
28
+ }
29
+ async onModuleInit() {
30
+ try {
31
+ await this.initMySQL();
32
+ this.logger.log('Database (MySQL) connected successfully');
33
+ }
34
+ catch (error) {
35
+ let msg;
36
+ try {
37
+ msg =
38
+ error != null && typeof error === 'object' && 'message' in error
39
+ ? String(error.message)
40
+ : String(error ?? 'Unknown error');
41
+ }
42
+ catch {
43
+ msg = 'Unknown error';
44
+ }
45
+ if (/Cannot read properties of undefined \(reading 'domain'\)|reading 'domain'/.test(msg)) {
46
+ msg = 'Connection failed (check host, port, credentials, and that MySQL is running)';
47
+ }
48
+ this.logger.warn(`Failed to connect to database: ${msg}`);
49
+ this.logger.warn(`Connection attempt: ${this.config.user}@${this.config.host}:${this.config.port}/${this.config.database}`);
50
+ this.logger.warn('Server will continue without database connection. Database features will be unavailable.');
51
+ this.logger.warn('To fix: Set DB_HOST, DB_PORT, DB_USER, DB_PASSWORD, DB_NAME environment variables');
52
+ }
53
+ }
54
+ async onModuleDestroy() {
55
+ if (this.mysqlPool) {
56
+ await this.mysqlPool.end();
57
+ this.logger.log('MySQL connection pool closed');
58
+ }
59
+ }
60
+ async initMySQL() {
61
+ const poolConfig = {
62
+ host: this.config.host,
63
+ port: this.config.port,
64
+ user: this.config.user,
65
+ password: this.config.password,
66
+ database: this.config.database,
67
+ connectionLimit: this.config.connectionLimit || 10,
68
+ waitForConnections: true,
69
+ queueLimit: 0,
70
+ };
71
+ if (this.config.ssl) {
72
+ poolConfig.ssl = {};
73
+ }
74
+ this.mysqlPool = mysql.createPool(poolConfig);
75
+ let connection;
76
+ try {
77
+ connection = await this.mysqlPool.getConnection();
78
+ }
79
+ catch (e) {
80
+ throw e instanceof Error ? e : new Error(String(e ?? 'Connection failed'));
81
+ }
82
+ try {
83
+ await connection.ping();
84
+ }
85
+ finally {
86
+ connection.release();
87
+ }
88
+ this._db = (0, mysql2_1.drizzle)(this.mysqlPool, { schema: this.schema, mode: 'default' });
89
+ }
90
+ get db() {
91
+ if (!this._db) {
92
+ throw new Error('Database is not connected. Please check your database configuration.');
93
+ }
94
+ return this._db;
95
+ }
96
+ isConnected() {
97
+ return this._db !== null;
98
+ }
99
+ get mysql() {
100
+ return this.mysqlPool;
101
+ }
102
+ };
103
+ exports.DatabaseService = DatabaseService;
104
+ exports.DatabaseService = DatabaseService = DatabaseService_1 = __decorate([
105
+ (0, common_1.Injectable)(),
106
+ __param(0, (0, common_1.Inject)(database_constants_1.DATABASE_CONFIG)),
107
+ __param(1, (0, common_1.Inject)(database_constants_1.DATABASE_SCHEMA)),
108
+ __metadata("design:paramtypes", [Object, Object])
109
+ ], DatabaseService);
110
+ //# sourceMappingURL=database.service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"database.service.js","sourceRoot":"","sources":["../../src/database/database.service.ts"],"names":[],"mappings":"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"}
File without changes
@@ -0,0 +1 @@
1
+ //# sourceMappingURL=example-usage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"example-usage.js","sourceRoot":"","sources":["../../src/database/example-usage.ts"],"names":[],"mappings":""}
@@ -0,0 +1,2 @@
1
+ export declare const IS_PUBLIC_KEY = "isPublic";
2
+ export declare const Public: () => import("@nestjs/common").CustomDecorator<string>;
@@ -0,0 +1,8 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.Public = exports.IS_PUBLIC_KEY = void 0;
4
+ const common_1 = require("@nestjs/common");
5
+ exports.IS_PUBLIC_KEY = 'isPublic';
6
+ const Public = () => (0, common_1.SetMetadata)(exports.IS_PUBLIC_KEY, true);
7
+ exports.Public = Public;
8
+ //# sourceMappingURL=public.decorator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"public.decorator.js","sourceRoot":"","sources":["../../src/decorators/public.decorator.ts"],"names":[],"mappings":";;;AAAA,2CAA6C;AAEhC,QAAA,aAAa,GAAG,UAAU,CAAC;AACjC,MAAM,MAAM,GAAG,GAAG,EAAE,CAAC,IAAA,oBAAW,EAAC,qBAAa,EAAE,IAAI,CAAC,CAAC;AAAhD,QAAA,MAAM,UAA0C"}
@@ -0,0 +1,2 @@
1
+ export declare const ROLES_KEY = "roles";
2
+ export declare const Roles: (...roles: string[]) => import("@nestjs/common").CustomDecorator<string>;
@@ -0,0 +1,8 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.Roles = exports.ROLES_KEY = void 0;
4
+ const common_1 = require("@nestjs/common");
5
+ exports.ROLES_KEY = 'roles';
6
+ const Roles = (...roles) => (0, common_1.SetMetadata)(exports.ROLES_KEY, roles);
7
+ exports.Roles = Roles;
8
+ //# sourceMappingURL=roles.decorator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"roles.decorator.js","sourceRoot":"","sources":["../../src/decorators/roles.decorator.ts"],"names":[],"mappings":";;;AAAA,2CAA6C;AAEhC,QAAA,SAAS,GAAG,OAAO,CAAC;AAoB1B,MAAM,KAAK,GAAG,CAAC,GAAG,KAAe,EAAE,EAAE,CAAC,IAAA,oBAAW,EAAC,iBAAS,EAAE,KAAK,CAAC,CAAC;AAA9D,QAAA,KAAK,SAAyD"}
@@ -0,0 +1,7 @@
1
+ export interface JwtUser {
2
+ sub: string | number;
3
+ email?: string;
4
+ role?: string;
5
+ [key: string]: any;
6
+ }
7
+ export declare const User: (...dataOrPipes: (string | import("@nestjs/common").PipeTransform<any, any> | import("@nestjs/common").Type<import("@nestjs/common").PipeTransform<any, any>>)[]) => ParameterDecorator;
@@ -0,0 +1,10 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.User = void 0;
4
+ const common_1 = require("@nestjs/common");
5
+ exports.User = (0, common_1.createParamDecorator)((data, ctx) => {
6
+ const request = ctx.switchToHttp().getRequest();
7
+ const user = request?.user;
8
+ return data && user ? user[data] : user;
9
+ });
10
+ //# sourceMappingURL=user.decorator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"user.decorator.js","sourceRoot":"","sources":["../../src/decorators/user.decorator.ts"],"names":[],"mappings":";;;AAAA,2CAAwE;AAkC3D,QAAA,IAAI,GAAG,IAAA,6BAAoB,EACtC,CAAC,IAAwB,EAAE,GAAqB,EAAE,EAAE;IAClD,MAAM,OAAO,GAAG,GAAG,CAAC,YAAY,EAAE,CAAC,UAAU,EAAE,CAAC;IAChD,MAAM,IAAI,GAAG,OAAO,EAAE,IAAI,CAAC;IAC3B,OAAO,IAAI,IAAI,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;AAC1C,CAAC,CACF,CAAC"}
@@ -0,0 +1,36 @@
1
+ import { ExceptionFilter, ArgumentsHost } from '@nestjs/common';
2
+ export interface ExceptionFilterOptions {
3
+ cors?: {
4
+ enabled?: boolean;
5
+ allowedOrigins?: string[];
6
+ allowAllOriginsInDev?: boolean;
7
+ };
8
+ meta?: {
9
+ enabled?: boolean;
10
+ includeTimestamp?: boolean;
11
+ includePath?: boolean;
12
+ includeMethod?: boolean;
13
+ };
14
+ logging?: {
15
+ enabled?: boolean;
16
+ level?: 'debug' | 'info' | 'warn' | 'error';
17
+ includeStack?: boolean;
18
+ debug?: boolean;
19
+ };
20
+ responseFormat?: {
21
+ includeDetails?: boolean;
22
+ };
23
+ filterStaticFiles?: boolean;
24
+ }
25
+ export declare class AllExceptionsFilter implements ExceptionFilter {
26
+ private readonly logger;
27
+ private readonly errorUtils;
28
+ private readonly options;
29
+ constructor(options?: ExceptionFilterOptions);
30
+ catch(exception: unknown, host: ArgumentsHost): void;
31
+ private handleOptionsRequest;
32
+ private isStaticFile404;
33
+ private buildMeta;
34
+ private extractMessage;
35
+ private logError;
36
+ }