@kominal/common-nestjs 0.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 (65) hide show
  1. package/controllers/health.controller.d.ts +6 -0
  2. package/controllers/health.controller.js +38 -0
  3. package/controllers/health.controller.js.map +1 -0
  4. package/entities/access-token.entity.d.ts +21 -0
  5. package/entities/access-token.entity.js +38 -0
  6. package/entities/access-token.entity.js.map +1 -0
  7. package/entities/membership.entity.d.ts +40 -0
  8. package/entities/membership.entity.js +66 -0
  9. package/entities/membership.entity.js.map +1 -0
  10. package/entities/tenant.entity.d.ts +24 -0
  11. package/entities/tenant.entity.js +38 -0
  12. package/entities/tenant.entity.js.map +1 -0
  13. package/entities/user.entity.d.ts +20 -0
  14. package/entities/user.entity.js +34 -0
  15. package/entities/user.entity.js.map +1 -0
  16. package/guards/admin.guard.d.ts +7 -0
  17. package/guards/admin.guard.js +29 -0
  18. package/guards/admin.guard.js.map +1 -0
  19. package/guards/system.guard.d.ts +4 -0
  20. package/guards/system.guard.js +21 -0
  21. package/guards/system.guard.js.map +1 -0
  22. package/guards/tenant.guard.d.ts +11 -0
  23. package/guards/tenant.guard.js +71 -0
  24. package/guards/tenant.guard.js.map +1 -0
  25. package/guards/user.guard.d.ts +13 -0
  26. package/guards/user.guard.js +66 -0
  27. package/guards/user.guard.js.map +1 -0
  28. package/helpers/context.decorator.d.ts +7 -0
  29. package/helpers/context.decorator.js +11 -0
  30. package/helpers/context.decorator.js.map +1 -0
  31. package/helpers/custom-operation-name.decorator.d.ts +2 -0
  32. package/helpers/custom-operation-name.decorator.js +14 -0
  33. package/helpers/custom-operation-name.decorator.js.map +1 -0
  34. package/helpers/entity-service.helper.d.ts +56 -0
  35. package/helpers/entity-service.helper.js +86 -0
  36. package/helpers/entity-service.helper.js.map +1 -0
  37. package/helpers/exception-filter.d.ts +4 -0
  38. package/helpers/exception-filter.js +30 -0
  39. package/helpers/exception-filter.js.map +1 -0
  40. package/helpers/logger.d.ts +10 -0
  41. package/helpers/logger.js +39 -0
  42. package/helpers/logger.js.map +1 -0
  43. package/kominal-common.module.d.ts +2 -0
  44. package/kominal-common.module.js +29 -0
  45. package/kominal-common.module.js.map +1 -0
  46. package/middlewares/request-logging.middleware.d.ts +6 -0
  47. package/middlewares/request-logging.middleware.js +32 -0
  48. package/middlewares/request-logging.middleware.js.map +1 -0
  49. package/models/entity.model.d.ts +14 -0
  50. package/models/entity.model.js +50 -0
  51. package/models/entity.model.js.map +1 -0
  52. package/models/stored-file.model.d.ts +8 -0
  53. package/models/stored-file.model.js +10 -0
  54. package/models/stored-file.model.js.map +1 -0
  55. package/package.json +30 -0
  56. package/services/auth.service.d.ts +4 -0
  57. package/services/auth.service.js +34 -0
  58. package/services/auth.service.js.map +1 -0
  59. package/services/file.service.d.ts +7 -0
  60. package/services/file.service.js +57 -0
  61. package/services/file.service.js.map +1 -0
  62. package/services/health.service.d.ts +3 -0
  63. package/services/health.service.js +28 -0
  64. package/services/health.service.js.map +1 -0
  65. package/tsconfig.tsbuildinfo +1 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context.decorator.js","sourceRoot":"","sources":["../../src/helpers/context.decorator.ts"],"names":[],"mappings":";;;AAAA,2CAAsD;AAEtD,MAAa,WAAW;CAKvB;AALD,kCAKC;AAEY,QAAA,OAAO,GAAG,IAAA,6BAAoB,EAAqB,CAAC,CAAC,EAAE,OAAO,EAAE,EAAE;IAC7E,OAAO,OAAO,CAAC,YAAY,EAAE,CAAC,UAAU,EAAE,CAAC,WAA0B,CAAC;AACxE,CAAC,CAAC,CAAC"}
@@ -0,0 +1,2 @@
1
+ import { ApiOperationOptions } from '@nestjs/swagger';
2
+ export declare const CustomOperationName: (op?: ApiOperationOptions) => MethodDecorator;
@@ -0,0 +1,14 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.CustomOperationName = void 0;
4
+ const swagger_1 = require("@nestjs/swagger");
5
+ const CustomOperationName = (op) => (target, prop, descriptor) => {
6
+ if (!op)
7
+ op = {};
8
+ (0, swagger_1.ApiOperation)({
9
+ ...op,
10
+ 'x-operation-name': prop.toString(),
11
+ })(target, prop, descriptor);
12
+ };
13
+ exports.CustomOperationName = CustomOperationName;
14
+ //# sourceMappingURL=custom-operation-name.decorator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"custom-operation-name.decorator.js","sourceRoot":"","sources":["../../src/helpers/custom-operation-name.decorator.ts"],"names":[],"mappings":";;;AAAA,6CAAwF;AAEjF,MAAM,mBAAmB,GAC9B,CAAC,EAAwB,EAAmB,EAAE,CAC9C,CAAC,MAAM,EAAE,IAAI,EAAE,UAAU,EAAE,EAAE;IAC3B,IAAI,CAAC,EAAE;QAAE,EAAE,GAAG,EAAE,CAAC;IACjB,IAAA,sBAAgB,EAAC;QACf,GAAG,EAAE;QACL,kBAAkB,EAAE,IAAI,CAAC,QAAQ,EAAE;KAC7B,CAAC,CAAC,MAAM,EAAE,IAAI,EAAE,UAAU,CAAC,CAAC;AACtC,CAAC,CAAC;AARS,QAAA,mBAAmB,uBAQ5B"}
@@ -0,0 +1,56 @@
1
+ import { FilterQuery, Model, PopulateOptions } from 'mongoose';
2
+ import { BaseEntity } from '../models/entity.model';
3
+ export declare class EntitiesPathParams {
4
+ tenantId: string;
5
+ }
6
+ export declare class OptionalEntityPathParams {
7
+ tenantId: string;
8
+ uuid?: string;
9
+ }
10
+ export declare class EntityPathParams {
11
+ tenantId: string;
12
+ uuid: string;
13
+ }
14
+ export declare class GlobalEntityPathParams {
15
+ uuid: string;
16
+ }
17
+ export declare class ListParams {
18
+ active?: string;
19
+ direction?: string;
20
+ pageIndex?: number;
21
+ pageSize?: number;
22
+ filter?: string;
23
+ select?: string;
24
+ }
25
+ export declare class ListResponse<T> {
26
+ items: T[];
27
+ count: number;
28
+ }
29
+ export declare const OpenApiPaginationResponse: (model: any) => (<TFunction extends Function, Y>(target: object | TFunction, propertyKey?: string | symbol, descriptor?: TypedPropertyDescriptor<Y>) => void);
30
+ declare class ChangeContext {
31
+ email: string;
32
+ }
33
+ export declare function created<Entity extends BaseEntity>(changeContext: ChangeContext, entity: Partial<Entity>): Partial<Entity>;
34
+ export declare function changed<Entity extends BaseEntity>(changeContext: ChangeContext, entity: Partial<Entity>): Partial<Entity>;
35
+ export declare class EntityService<Entity extends BaseEntity, EntitiesPath extends FilterQuery<Entity> = EntitiesPathParams, EntityPath extends FilterQuery<Entity> = EntityPathParams, PopulatedEntity = Entity> {
36
+ private model;
37
+ protected options?: {
38
+ listSelect?: string;
39
+ populate?: PopulateOptions | PopulateOptions[];
40
+ defaultSortKey?: string;
41
+ defaultSortDirection?: string;
42
+ } | undefined;
43
+ constructor(model: Model<Entity>, options?: {
44
+ listSelect?: string;
45
+ populate?: PopulateOptions | PopulateOptions[];
46
+ defaultSortKey?: string;
47
+ defaultSortDirection?: string;
48
+ } | undefined);
49
+ create(changeContext: ChangeContext, pathParams: EntitiesPath, createRequest: Partial<Entity>): Promise<Entity>;
50
+ list(pathParams: EntitiesPath, { active, direction, pageIndex, pageSize, filter, select }: ListParams): Promise<ListResponse<PopulatedEntity>>;
51
+ read(params: EntityPath): Promise<Entity>;
52
+ update(changeContext: ChangeContext, entityPath: EntityPath, createRequest: Partial<Entity>): Promise<void>;
53
+ delete(params: EntityPath): Promise<any>;
54
+ inUse(params: EntityPath): Promise<boolean>;
55
+ }
56
+ export {};
@@ -0,0 +1,86 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.EntityService = exports.OpenApiPaginationResponse = exports.ListResponse = exports.ListParams = exports.GlobalEntityPathParams = exports.EntityPathParams = exports.OptionalEntityPathParams = exports.EntitiesPathParams = void 0;
4
+ exports.created = created;
5
+ exports.changed = changed;
6
+ const common_1 = require("@nestjs/common");
7
+ const swagger_1 = require("@nestjs/swagger");
8
+ const uuid_1 = require("uuid");
9
+ class EntitiesPathParams {
10
+ }
11
+ exports.EntitiesPathParams = EntitiesPathParams;
12
+ class OptionalEntityPathParams {
13
+ }
14
+ exports.OptionalEntityPathParams = OptionalEntityPathParams;
15
+ class EntityPathParams {
16
+ }
17
+ exports.EntityPathParams = EntityPathParams;
18
+ class GlobalEntityPathParams {
19
+ }
20
+ exports.GlobalEntityPathParams = GlobalEntityPathParams;
21
+ class ListParams {
22
+ }
23
+ exports.ListParams = ListParams;
24
+ class ListResponse {
25
+ }
26
+ exports.ListResponse = ListResponse;
27
+ const OpenApiPaginationResponse = (model) => (0, common_1.applyDecorators)((0, swagger_1.ApiOkResponse)({ schema: { properties: { items: { type: 'array', items: { $ref: (0, swagger_1.getSchemaPath)(model) } }, count: { type: 'number' } }, required: ['items', 'count'] } }), (0, swagger_1.ApiExtraModels)(model));
28
+ exports.OpenApiPaginationResponse = OpenApiPaginationResponse;
29
+ class ChangeContext {
30
+ }
31
+ function created(changeContext, entity) {
32
+ return {
33
+ ...entity,
34
+ uuid: (0, uuid_1.v4)(),
35
+ createdAt: new Date(),
36
+ createdBy: changeContext.email,
37
+ updatedAt: new Date(),
38
+ updatedBy: changeContext.email,
39
+ };
40
+ }
41
+ function changed(changeContext, entity) {
42
+ return {
43
+ ...entity,
44
+ updatedAt: new Date(),
45
+ updatedBy: changeContext.email,
46
+ };
47
+ }
48
+ class EntityService {
49
+ constructor(model, options) {
50
+ this.model = model;
51
+ this.options = options;
52
+ }
53
+ async create(changeContext, pathParams, createRequest) {
54
+ return this.model.create(created(changeContext, { ...createRequest, ...pathParams }));
55
+ }
56
+ async list(pathParams, { active, direction, pageIndex, pageSize, filter, select }) {
57
+ const evaluatedFilter = { ...(filter ? JSON.parse(filter) : {}), ...pathParams };
58
+ const items = await this.model
59
+ .find(evaluatedFilter)
60
+ .select(this.options?.listSelect || select || '')
61
+ .sort({ [active || this.options?.defaultSortKey || '_id']: (direction || this.options?.defaultSortDirection || 'asc') })
62
+ .skip((pageIndex || 0) * (pageSize || 10))
63
+ .limit(pageSize || 10)
64
+ .populate(this.options?.populate || [])
65
+ .lean();
66
+ const count = await this.model.countDocuments(evaluatedFilter);
67
+ return { items, count };
68
+ }
69
+ async read(params) {
70
+ return this.model.findOne(params).orFail(new common_1.HttpException('exception.notFound', 404));
71
+ }
72
+ async update(changeContext, entityPath, createRequest) {
73
+ await this.model.updateOne(entityPath, changed(changeContext, { ...createRequest, tenantId: entityPath.tenantId }));
74
+ }
75
+ async delete(params) {
76
+ if (await this.inUse(params)) {
77
+ throw new common_1.HttpException('exception.inUse', 404);
78
+ }
79
+ return this.model.deleteOne(params);
80
+ }
81
+ async inUse(params) {
82
+ return false;
83
+ }
84
+ }
85
+ exports.EntityService = EntityService;
86
+ //# sourceMappingURL=entity-service.helper.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"entity-service.helper.js","sourceRoot":"","sources":["../../src/helpers/entity-service.helper.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import { ArgumentsHost, ExceptionFilter } from '@nestjs/common';
2
+ export declare class ErrorFilter implements ExceptionFilter {
3
+ catch(error: Error, host: ArgumentsHost): void;
4
+ }
@@ -0,0 +1,30 @@
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
+ Object.defineProperty(exports, "__esModule", { value: true });
9
+ exports.ErrorFilter = void 0;
10
+ const common_1 = require("@nestjs/common");
11
+ let ErrorFilter = class ErrorFilter {
12
+ catch(error, host) {
13
+ const ctx = host.switchToHttp();
14
+ const response = ctx.getResponse();
15
+ console.error(error);
16
+ if (error instanceof common_1.HttpException) {
17
+ const httpException = error;
18
+ response.status(httpException.getStatus()).json(httpException.getResponse());
19
+ return;
20
+ }
21
+ response.status(common_1.HttpStatus.INTERNAL_SERVER_ERROR).json({
22
+ type: 'SERVER_ERROR',
23
+ });
24
+ }
25
+ };
26
+ exports.ErrorFilter = ErrorFilter;
27
+ exports.ErrorFilter = ErrorFilter = __decorate([
28
+ (0, common_1.Catch)(Error)
29
+ ], ErrorFilter);
30
+ //# sourceMappingURL=exception-filter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"exception-filter.js","sourceRoot":"","sources":["../../src/helpers/exception-filter.ts"],"names":[],"mappings":";;;;;;;;;AAAA,2CAAkG;AAI3F,IAAM,WAAW,GAAjB,MAAM,WAAW;IACf,KAAK,CAAC,KAAY,EAAE,IAAmB;QAC5C,MAAM,GAAG,GAAG,IAAI,CAAC,YAAY,EAAE,CAAC;QAChC,MAAM,QAAQ,GAAG,GAAG,CAAC,WAAW,EAAY,CAAC;QAE7C,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QAErB,IAAI,KAAK,YAAY,sBAAa,EAAE,CAAC;YACnC,MAAM,aAAa,GAAG,KAAsB,CAAC;YAC7C,QAAQ,CAAC,MAAM,CAAC,aAAa,CAAC,SAAS,EAAE,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,WAAW,EAAE,CAAC,CAAC;YAC7E,OAAO;QACT,CAAC;QAED,QAAQ,CAAC,MAAM,CAAC,mBAAU,CAAC,qBAAqB,CAAC,CAAC,IAAI,CAAC;YACrD,IAAI,EAAE,cAAc;SACrB,CAAC,CAAC;IACL,CAAC;CACF,CAAA;AAjBY,kCAAW;sBAAX,WAAW;IADvB,IAAA,cAAK,EAAC,KAAK,CAAC;GACA,WAAW,CAiBvB"}
@@ -0,0 +1,10 @@
1
+ import { LoggerService } from '@nestjs/common';
2
+ export declare class CustomerLogger implements LoggerService {
3
+ private formatString;
4
+ private logToConsole;
5
+ log(message: any, ...optionalParams: any): void;
6
+ error(message: any, ...optionalParams: any): void;
7
+ warn(message: any, ...optionalParams: any): void;
8
+ debug?(message: any, ...optionalParams: any): void;
9
+ verbose?(message: any, ...optionalParams: any): void;
10
+ }
@@ -0,0 +1,39 @@
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
+ Object.defineProperty(exports, "__esModule", { value: true });
9
+ exports.CustomerLogger = void 0;
10
+ const common_1 = require("@nestjs/common");
11
+ let CustomerLogger = class CustomerLogger {
12
+ formatString(message, ...optionalParams) {
13
+ return message.replace(/{([0-9]+)}/g, (match, index) => (typeof optionalParams[index] === 'undefined' ? match : optionalParams[index]));
14
+ }
15
+ logToConsole(level, message, ...optionalParams) {
16
+ const parameter = optionalParams[0] || [];
17
+ console.log(`${new Date().toISOString()} [${level}] [${parameter[parameter.length - 1]}] ${this.formatString(message, parameter)}`);
18
+ }
19
+ log(message, ...optionalParams) {
20
+ this.logToConsole('LOG ', message, optionalParams);
21
+ }
22
+ error(message, ...optionalParams) {
23
+ this.logToConsole('ERROR ', message, optionalParams);
24
+ }
25
+ warn(message, ...optionalParams) {
26
+ this.logToConsole('WARN ', message, optionalParams);
27
+ }
28
+ debug(message, ...optionalParams) {
29
+ this.logToConsole('DEBUG ', message, optionalParams);
30
+ }
31
+ verbose(message, ...optionalParams) {
32
+ this.logToConsole('VERBOSE', message, optionalParams);
33
+ }
34
+ };
35
+ exports.CustomerLogger = CustomerLogger;
36
+ exports.CustomerLogger = CustomerLogger = __decorate([
37
+ (0, common_1.Injectable)()
38
+ ], CustomerLogger);
39
+ //# sourceMappingURL=logger.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger.js","sourceRoot":"","sources":["../../src/helpers/logger.ts"],"names":[],"mappings":";;;;;;;;;AAAA,2CAA2D;AAGpD,IAAM,cAAc,GAApB,MAAM,cAAc;IACjB,YAAY,CAAC,OAAe,EAAE,GAAG,cAAqB;QAC5D,OAAO,OAAO,CAAC,OAAO,CAAC,aAAa,EAAE,CAAC,KAAK,EAAE,KAAK,EAAE,EAAE,CAAC,CAAC,OAAO,cAAc,CAAC,KAAK,CAAC,KAAK,WAAW,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IAC1I,CAAC;IAEO,YAAY,CAAC,KAAa,EAAE,OAAY,EAAE,GAAG,cAAmB;QACtE,MAAM,SAAS,GAAG,cAAc,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;QAE1C,OAAO,CAAC,GAAG,CAAC,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,KAAK,KAAK,MAAM,SAAS,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,CAAC,KAAK,IAAI,CAAC,YAAY,CAAC,OAAO,EAAE,SAAS,CAAC,EAAE,CAAC,CAAC;IACtI,CAAC;IAEM,GAAG,CAAC,OAAY,EAAE,GAAG,cAAmB;QAC7C,IAAI,CAAC,YAAY,CAAC,SAAS,EAAE,OAAO,EAAE,cAAc,CAAC,CAAC;IACxD,CAAC;IAEM,KAAK,CAAC,OAAY,EAAE,GAAG,cAAmB;QAC/C,IAAI,CAAC,YAAY,CAAC,SAAS,EAAE,OAAO,EAAE,cAAc,CAAC,CAAC;IACxD,CAAC;IAEM,IAAI,CAAC,OAAY,EAAE,GAAG,cAAmB;QAC9C,IAAI,CAAC,YAAY,CAAC,SAAS,EAAE,OAAO,EAAE,cAAc,CAAC,CAAC;IACxD,CAAC;IAEM,KAAK,CAAE,OAAY,EAAE,GAAG,cAAmB;QAChD,IAAI,CAAC,YAAY,CAAC,SAAS,EAAE,OAAO,EAAE,cAAc,CAAC,CAAC;IACxD,CAAC;IAEM,OAAO,CAAE,OAAY,EAAE,GAAG,cAAmB;QAClD,IAAI,CAAC,YAAY,CAAC,SAAS,EAAE,OAAO,EAAE,cAAc,CAAC,CAAC;IACxD,CAAC;CACF,CAAA;AA9BY,wCAAc;yBAAd,cAAc;IAD1B,IAAA,mBAAU,GAAE;GACA,cAAc,CA8B1B"}
@@ -0,0 +1,2 @@
1
+ export declare class KominalCommonModule {
2
+ }
@@ -0,0 +1,29 @@
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
+ Object.defineProperty(exports, "__esModule", { value: true });
9
+ exports.KominalCommonModule = void 0;
10
+ const common_1 = require("@nestjs/common");
11
+ const health_controller_1 = require("./controllers/health.controller");
12
+ const admin_guard_1 = require("./guards/admin.guard");
13
+ const system_guard_1 = require("./guards/system.guard");
14
+ const tenant_guard_1 = require("./guards/tenant.guard");
15
+ const user_guard_1 = require("./guards/user.guard");
16
+ const auth_service_1 = require("./services/auth.service");
17
+ const file_service_1 = require("./services/file.service");
18
+ const health_service_1 = require("./services/health.service");
19
+ let KominalCommonModule = class KominalCommonModule {
20
+ };
21
+ exports.KominalCommonModule = KominalCommonModule;
22
+ exports.KominalCommonModule = KominalCommonModule = __decorate([
23
+ (0, common_1.Module)({
24
+ controllers: [health_controller_1.HealthController],
25
+ providers: [auth_service_1.AuthService, file_service_1.FileService, health_service_1.HealthService, admin_guard_1.AdminGuard, tenant_guard_1.TenantGuard, user_guard_1.UserGuard, system_guard_1.SystemGuard],
26
+ exports: [auth_service_1.AuthService, file_service_1.FileService, health_service_1.HealthService, admin_guard_1.AdminGuard, tenant_guard_1.TenantGuard, user_guard_1.UserGuard, system_guard_1.SystemGuard],
27
+ })
28
+ ], KominalCommonModule);
29
+ //# sourceMappingURL=kominal-common.module.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"kominal-common.module.js","sourceRoot":"","sources":["../src/kominal-common.module.ts"],"names":[],"mappings":";;;;;;;;;AAAA,2CAAwC;AACxC,uEAAmE;AACnE,sDAAkD;AAClD,wDAAoD;AACpD,wDAAoD;AACpD,oDAAgD;AAChD,0DAAsD;AACtD,0DAAsD;AACtD,8DAA0D;AAOnD,IAAM,mBAAmB,GAAzB,MAAM,mBAAmB;CAAG,CAAA;AAAtB,kDAAmB;8BAAnB,mBAAmB;IAL/B,IAAA,eAAM,EAAC;QACN,WAAW,EAAE,CAAC,oCAAgB,CAAC;QAC/B,SAAS,EAAE,CAAC,0BAAW,EAAE,0BAAW,EAAE,8BAAa,EAAE,wBAAU,EAAE,0BAAW,EAAE,sBAAS,EAAE,0BAAW,CAAC;QACrG,OAAO,EAAE,CAAC,0BAAW,EAAE,0BAAW,EAAE,8BAAa,EAAE,wBAAU,EAAE,0BAAW,EAAE,sBAAS,EAAE,0BAAW,CAAC;KACpG,CAAC;GACW,mBAAmB,CAAG"}
@@ -0,0 +1,6 @@
1
+ import { NestMiddleware } from '@nestjs/common';
2
+ import { NextFunction, Request, Response } from 'express';
3
+ export declare class RequestLoggingMiddleware implements NestMiddleware {
4
+ private readonly logger;
5
+ use(req: Request, res: Response, next: NextFunction): void;
6
+ }
@@ -0,0 +1,32 @@
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 RequestLoggingMiddleware_1;
9
+ Object.defineProperty(exports, "__esModule", { value: true });
10
+ exports.RequestLoggingMiddleware = void 0;
11
+ const common_1 = require("@nestjs/common");
12
+ let RequestLoggingMiddleware = RequestLoggingMiddleware_1 = class RequestLoggingMiddleware {
13
+ constructor() {
14
+ this.logger = new common_1.Logger(RequestLoggingMiddleware_1.name);
15
+ }
16
+ use(req, res, next) {
17
+ const time = new Date().getTime();
18
+ const requestText = `${req.method} ${req.originalUrl}`;
19
+ this.logger.log(requestText);
20
+ res.on('close', () => {
21
+ const { statusCode } = res;
22
+ const contentLength = res.get('content-length');
23
+ this.logger.log(`${requestText} ${statusCode} ${contentLength} ${new Date().getTime() - time}ms`);
24
+ });
25
+ next();
26
+ }
27
+ };
28
+ exports.RequestLoggingMiddleware = RequestLoggingMiddleware;
29
+ exports.RequestLoggingMiddleware = RequestLoggingMiddleware = RequestLoggingMiddleware_1 = __decorate([
30
+ (0, common_1.Injectable)()
31
+ ], RequestLoggingMiddleware);
32
+ //# sourceMappingURL=request-logging.middleware.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"request-logging.middleware.js","sourceRoot":"","sources":["../../src/middlewares/request-logging.middleware.ts"],"names":[],"mappings":";;;;;;;;;;AAAA,2CAAoE;AAI7D,IAAM,wBAAwB,gCAA9B,MAAM,wBAAwB;IAA9B;QACY,WAAM,GAAG,IAAI,eAAM,CAAC,0BAAwB,CAAC,IAAI,CAAC,CAAC;IAatE,CAAC;IAXQ,GAAG,CAAC,GAAY,EAAE,GAAa,EAAE,IAAkB;QACxD,MAAM,IAAI,GAAG,IAAI,IAAI,EAAE,CAAC,OAAO,EAAE,CAAC;QAClC,MAAM,WAAW,GAAG,GAAG,GAAG,CAAC,MAAM,IAAI,GAAG,CAAC,WAAW,EAAE,CAAC;QACvD,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;QAC7B,GAAG,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE;YACnB,MAAM,EAAE,UAAU,EAAE,GAAG,GAAG,CAAC;YAC3B,MAAM,aAAa,GAAG,GAAG,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC;YAChD,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,WAAW,IAAI,UAAU,IAAI,aAAa,IAAI,IAAI,IAAI,EAAE,CAAC,OAAO,EAAE,GAAG,IAAI,IAAI,CAAC,CAAC;QACpG,CAAC,CAAC,CAAC;QACH,IAAI,EAAE,CAAC;IACT,CAAC;CACF,CAAA;AAdY,4DAAwB;mCAAxB,wBAAwB;IADpC,IAAA,mBAAU,GAAE;GACA,wBAAwB,CAcpC"}
@@ -0,0 +1,14 @@
1
+ export declare abstract class BaseEntity {
2
+ _id: string;
3
+ uuid: string;
4
+ createdAt: Date;
5
+ createdBy: string;
6
+ updatedAt: Date;
7
+ updatedBy: string;
8
+ version: number;
9
+ }
10
+ export declare const TECHNICAL_KEYS_BASE_ENTITY: (keyof BaseEntity)[];
11
+ export declare abstract class TenantEntity extends BaseEntity {
12
+ tenantId: string;
13
+ }
14
+ export declare const TECHNICAL_KEYS: (keyof TenantEntity)[];
@@ -0,0 +1,50 @@
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
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.TECHNICAL_KEYS = exports.TenantEntity = exports.TECHNICAL_KEYS_BASE_ENTITY = exports.BaseEntity = void 0;
13
+ const mongoose_1 = require("@nestjs/mongoose");
14
+ class BaseEntity {
15
+ }
16
+ exports.BaseEntity = BaseEntity;
17
+ __decorate([
18
+ (0, mongoose_1.Prop)(),
19
+ __metadata("design:type", String)
20
+ ], BaseEntity.prototype, "uuid", void 0);
21
+ __decorate([
22
+ (0, mongoose_1.Prop)(),
23
+ __metadata("design:type", Date)
24
+ ], BaseEntity.prototype, "createdAt", void 0);
25
+ __decorate([
26
+ (0, mongoose_1.Prop)(),
27
+ __metadata("design:type", String)
28
+ ], BaseEntity.prototype, "createdBy", void 0);
29
+ __decorate([
30
+ (0, mongoose_1.Prop)(),
31
+ __metadata("design:type", Date)
32
+ ], BaseEntity.prototype, "updatedAt", void 0);
33
+ __decorate([
34
+ (0, mongoose_1.Prop)(),
35
+ __metadata("design:type", String)
36
+ ], BaseEntity.prototype, "updatedBy", void 0);
37
+ __decorate([
38
+ (0, mongoose_1.Prop)(),
39
+ __metadata("design:type", Number)
40
+ ], BaseEntity.prototype, "version", void 0);
41
+ exports.TECHNICAL_KEYS_BASE_ENTITY = ['_id', 'uuid', 'createdAt', 'createdBy', 'updatedAt', 'updatedBy', 'version'];
42
+ class TenantEntity extends BaseEntity {
43
+ }
44
+ exports.TenantEntity = TenantEntity;
45
+ __decorate([
46
+ (0, mongoose_1.Prop)(),
47
+ __metadata("design:type", String)
48
+ ], TenantEntity.prototype, "tenantId", void 0);
49
+ exports.TECHNICAL_KEYS = [...exports.TECHNICAL_KEYS_BASE_ENTITY, 'tenantId'];
50
+ //# sourceMappingURL=entity.model.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"entity.model.js","sourceRoot":"","sources":["../../src/models/entity.model.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,+CAAwC;AAExC,MAAsB,UAAU;CAQ/B;AARD,gCAQC;AANgB;IAAd,IAAA,eAAI,GAAE;;wCAAqB;AACb;IAAd,IAAA,eAAI,GAAE;8BAAmB,IAAI;6CAAC;AAChB;IAAd,IAAA,eAAI,GAAE;;6CAA0B;AAClB;IAAd,IAAA,eAAI,GAAE;8BAAmB,IAAI;6CAAC;AAChB;IAAd,IAAA,eAAI,GAAE;;6CAA0B;AAClB;IAAd,IAAA,eAAI,GAAE;;2CAAwB;AAGpB,QAAA,0BAA0B,GAAyB,CAAC,KAAK,EAAE,MAAM,EAAE,WAAW,EAAE,WAAW,EAAE,WAAW,EAAE,WAAW,EAAE,SAAS,CAAC,CAAC;AAE/I,MAAsB,YAAa,SAAQ,UAAU;CAEpD;AAFD,oCAEC;AADgB;IAAd,IAAA,eAAI,GAAE;;8CAAyB;AAGrB,QAAA,cAAc,GAA2B,CAAC,GAAG,kCAA0B,EAAE,UAAU,CAAC,CAAC"}
@@ -0,0 +1,8 @@
1
+ export declare class StoredFile {
2
+ name: string;
3
+ location: string;
4
+ key: string;
5
+ }
6
+ export declare class StoredFileSignedUrl {
7
+ url: string;
8
+ }
@@ -0,0 +1,10 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.StoredFileSignedUrl = exports.StoredFile = void 0;
4
+ class StoredFile {
5
+ }
6
+ exports.StoredFile = StoredFile;
7
+ class StoredFileSignedUrl {
8
+ }
9
+ exports.StoredFileSignedUrl = StoredFileSignedUrl;
10
+ //# sourceMappingURL=stored-file.model.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stored-file.model.js","sourceRoot":"","sources":["../../src/models/stored-file.model.ts"],"names":[],"mappings":";;;AAAA,MAAa,UAAU;CAMtB;AAND,gCAMC;AAED,MAAa,mBAAmB;CAE/B;AAFD,kDAEC"}
package/package.json ADDED
@@ -0,0 +1,30 @@
1
+ {
2
+ "name": "@kominal/common-nestjs",
3
+ "version": "0.0.1",
4
+ "description": "",
5
+ "main": "index.js",
6
+ "scripts": {
7
+ "build": "nest build",
8
+ "postbuild": "cp package.json dist",
9
+ "publish": "npm run build && cd dist && npm publish"
10
+ },
11
+ "author": "",
12
+ "license": "ISC",
13
+ "publishConfig": {
14
+ "access": "public"
15
+ },
16
+ "dependencies": {
17
+ "@aws-sdk/client-s3": "^3.787.0",
18
+ "@aws-sdk/s3-request-presigner": "^3.787.0",
19
+ "@nestjs/common": "^11.0.20",
20
+ "@nestjs/mongoose": "^11.0.3",
21
+ "@nestjs/swagger": "^11.1.4",
22
+ "express": "^5.1.0",
23
+ "jsonwebtoken": "^9.0.2",
24
+ "jwks-rsa": "^3.2.0",
25
+ "uuid": "^11.1.0"
26
+ },
27
+ "devDependencies": {
28
+ "@types/node": "^22.14.1"
29
+ }
30
+ }
@@ -0,0 +1,4 @@
1
+ export declare class AuthService {
2
+ private jwksClient;
3
+ getClaims(bearerHeader: string): Promise<any>;
4
+ }
@@ -0,0 +1,34 @@
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
+ Object.defineProperty(exports, "__esModule", { value: true });
9
+ exports.AuthService = void 0;
10
+ const common_1 = require("@nestjs/common");
11
+ const jsonwebtoken_1 = require("jsonwebtoken");
12
+ const jwks_rsa_1 = require("jwks-rsa");
13
+ let AuthService = class AuthService {
14
+ constructor() {
15
+ this.jwksClient = new jwks_rsa_1.JwksClient({ jwksUri: process.env.JWKS_URI || '' });
16
+ }
17
+ async getClaims(bearerHeader) {
18
+ if (!bearerHeader) {
19
+ return undefined;
20
+ }
21
+ const token = bearerHeader.split(' ')[1];
22
+ const decodedToken = (0, jsonwebtoken_1.decode)(token, { complete: true });
23
+ if (!decodedToken) {
24
+ return undefined;
25
+ }
26
+ const publicKey = await this.jwksClient.getSigningKey(decodedToken.header.kid).then((key) => key.getPublicKey());
27
+ return (0, jsonwebtoken_1.verify)(token, publicKey);
28
+ }
29
+ };
30
+ exports.AuthService = AuthService;
31
+ exports.AuthService = AuthService = __decorate([
32
+ (0, common_1.Injectable)()
33
+ ], AuthService);
34
+ //# sourceMappingURL=auth.service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth.service.js","sourceRoot":"","sources":["../../src/services/auth.service.ts"],"names":[],"mappings":";;;;;;;;;AAAA,2CAA4C;AAC5C,+CAA8C;AAC9C,uCAAsC;AAG/B,IAAM,WAAW,GAAjB,MAAM,WAAW;IAAjB;QACG,eAAU,GAAG,IAAI,qBAAU,CAAC,EAAE,OAAO,EAAE,OAAO,CAAC,GAAG,CAAC,QAAQ,IAAI,EAAE,EAAE,CAAC,CAAC;IAmB/E,CAAC;IAjBQ,KAAK,CAAC,SAAS,CAAC,YAAoB;QACzC,IAAI,CAAC,YAAY,EAAE,CAAC;YAClB,OAAO,SAAS,CAAC;QACnB,CAAC;QAED,MAAM,KAAK,GAAG,YAAY,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QAEzC,MAAM,YAAY,GAAG,IAAA,qBAAM,EAAC,KAAK,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;QAEvD,IAAI,CAAC,YAAY,EAAE,CAAC;YAClB,OAAO,SAAS,CAAC;QACnB,CAAC;QAED,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC,YAAY,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,YAAY,EAAE,CAAC,CAAC;QAEjH,OAAO,IAAA,qBAAM,EAAC,KAAK,EAAE,SAAS,CAAC,CAAC;IAClC,CAAC;CACF,CAAA;AApBY,kCAAW;sBAAX,WAAW;IADvB,IAAA,mBAAU,GAAE;GACA,WAAW,CAoBvB"}
@@ -0,0 +1,7 @@
1
+ import { StoredFile, StoredFileSignedUrl } from '../models/stored-file.model';
2
+ export declare class FileService {
3
+ private s3Client;
4
+ private bucket;
5
+ storeFile(tenantId: string, buffer: Buffer, originalname: string, userId: string, email: string): Promise<StoredFile>;
6
+ getSignedUrl(tenantId: string, key: string): Promise<StoredFileSignedUrl>;
7
+ }
@@ -0,0 +1,57 @@
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
+ Object.defineProperty(exports, "__esModule", { value: true });
9
+ exports.FileService = void 0;
10
+ const client_s3_1 = require("@aws-sdk/client-s3");
11
+ const s3_request_presigner_1 = require("@aws-sdk/s3-request-presigner");
12
+ const common_1 = require("@nestjs/common");
13
+ const uuid_1 = require("uuid");
14
+ let FileService = class FileService {
15
+ constructor() {
16
+ this.s3Client = new client_s3_1.S3Client({
17
+ endpoint: process.env.S3_ENDPOINT,
18
+ forcePathStyle: true,
19
+ region: 'eu',
20
+ credentials: {
21
+ accessKeyId: process.env.S3_ACCESS_KEY || '',
22
+ secretAccessKey: process.env.S3_SECRET_KEY || '',
23
+ },
24
+ });
25
+ this.bucket = process.env.S3_BUCKET || '';
26
+ }
27
+ async storeFile(tenantId, buffer, originalname, userId, email) {
28
+ const fileName = `${(0, uuid_1.v4)()}_${(0, uuid_1.v4)()}_${originalname}`;
29
+ const key = `tenants/${tenantId}/${fileName}`;
30
+ await this.s3Client.send(new client_s3_1.PutObjectCommand({
31
+ Bucket: this.bucket,
32
+ Key: key,
33
+ Body: buffer,
34
+ ACL: 'private',
35
+ Metadata: {
36
+ tenantId,
37
+ userId,
38
+ email,
39
+ originalname,
40
+ },
41
+ }));
42
+ return { name: originalname, location: `${process.env.S3_ENDPOINT}/${process.env.S3_BUCKET}/${key}`, key };
43
+ }
44
+ async getSignedUrl(tenantId, key) {
45
+ const head = await this.s3Client.send(new client_s3_1.HeadObjectCommand({ Bucket: this.bucket, Key: key }));
46
+ if (head.Metadata?.tenantid !== tenantId) {
47
+ throw new Error('Unauthorized');
48
+ }
49
+ const url = await (0, s3_request_presigner_1.getSignedUrl)(this.s3Client, new client_s3_1.GetObjectCommand({ Bucket: this.bucket, Key: key }), { expiresIn: 3600 });
50
+ return { url };
51
+ }
52
+ };
53
+ exports.FileService = FileService;
54
+ exports.FileService = FileService = __decorate([
55
+ (0, common_1.Injectable)()
56
+ ], FileService);
57
+ //# sourceMappingURL=file.service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"file.service.js","sourceRoot":"","sources":["../../src/services/file.service.ts"],"names":[],"mappings":";;;;;;;;;AAAA,kDAAqG;AACrG,wEAA6D;AAC7D,2CAA4C;AAC5C,+BAA0B;AAInB,IAAM,WAAW,GAAjB,MAAM,WAAW;IAAjB;QACE,aAAQ,GAAG,IAAI,oBAAQ,CAAC;YAC/B,QAAQ,EAAE,OAAO,CAAC,GAAG,CAAC,WAAW;YACjC,cAAc,EAAE,IAAI;YACpB,MAAM,EAAE,IAAI;YACZ,WAAW,EAAE;gBACZ,WAAW,EAAE,OAAO,CAAC,GAAG,CAAC,aAAa,IAAI,EAAE;gBAC5C,eAAe,EAAE,OAAO,CAAC,GAAG,CAAC,aAAa,IAAI,EAAE;aAChD;SACD,CAAC,CAAC;QAEK,WAAM,GAAG,OAAO,CAAC,GAAG,CAAC,SAAS,IAAI,EAAE,CAAC;IAkC9C,CAAC;IAhCO,KAAK,CAAC,SAAS,CAAC,QAAgB,EAAE,MAAc,EAAE,YAAoB,EAAE,MAAc,EAAE,KAAa;QAC3G,MAAM,QAAQ,GAAG,GAAG,IAAA,SAAE,GAAE,IAAI,IAAA,SAAE,GAAE,IAAI,YAAY,EAAE,CAAC;QACnD,MAAM,GAAG,GAAG,WAAW,QAAQ,IAAI,QAAQ,EAAE,CAAC;QAC9C,MAAM,IAAI,CAAC,QAAQ,CAAC,IAAI,CACvB,IAAI,4BAAgB,CAAC;YACpB,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,GAAG,EAAE,GAAG;YACR,IAAI,EAAE,MAAM;YACZ,GAAG,EAAE,SAAS;YACd,QAAQ,EAAE;gBACT,QAAQ;gBACR,MAAM;gBACN,KAAK;gBACL,YAAY;aACZ;SACD,CAAC,CACF,CAAC;QAEF,OAAO,EAAE,IAAI,EAAE,YAAY,EAAE,QAAQ,EAAE,GAAG,OAAO,CAAC,GAAG,CAAC,WAAW,IAAI,OAAO,CAAC,GAAG,CAAC,SAAS,IAAI,GAAG,EAAE,EAAE,GAAG,EAAE,CAAC;IAC5G,CAAC;IAEM,KAAK,CAAC,YAAY,CAAC,QAAgB,EAAE,GAAW;QACtD,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,6BAAiB,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC;QAEhG,IAAI,IAAI,CAAC,QAAQ,EAAE,QAAQ,KAAK,QAAQ,EAAE,CAAC;YAC1C,MAAM,IAAI,KAAK,CAAC,cAAc,CAAC,CAAC;QACjC,CAAC;QAED,MAAM,GAAG,GAAG,MAAM,IAAA,mCAAY,EAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,4BAAgB,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAE5H,OAAO,EAAE,GAAG,EAAE,CAAC;IAChB,CAAC;CACD,CAAA;AA7CY,kCAAW;sBAAX,WAAW;IADvB,IAAA,mBAAU,GAAE;GACA,WAAW,CA6CvB"}
@@ -0,0 +1,3 @@
1
+ export declare class HealthService {
2
+ readHealth(): Promise<any>;
3
+ }