@alacard-project/shared 1.0.10 → 1.1.0

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 (134) hide show
  1. package/README.md +24 -0
  2. package/dist/constants/auth-config.constants.d.ts +7 -0
  3. package/dist/constants/auth-config.constants.js +8 -1
  4. package/dist/constants/auth-config.constants.js.map +1 -1
  5. package/dist/constants/auth.constants.d.ts +25 -0
  6. package/dist/constants/auth.constants.js +15 -1
  7. package/dist/constants/auth.constants.js.map +1 -1
  8. package/dist/constants/index.d.ts +1 -0
  9. package/dist/constants/index.js +1 -0
  10. package/dist/constants/index.js.map +1 -1
  11. package/dist/constants/queue.constants.d.ts +8 -0
  12. package/dist/constants/queue.constants.js +12 -0
  13. package/dist/constants/queue.constants.js.map +1 -0
  14. package/dist/contracts/auth.contract.d.ts +12 -9
  15. package/dist/dto/account.dto.d.ts +10 -0
  16. package/dist/dto/account.dto.js +49 -0
  17. package/dist/dto/account.dto.js.map +1 -0
  18. package/dist/dto/auth.dto.d.ts +43 -0
  19. package/dist/dto/auth.dto.js +136 -1
  20. package/dist/dto/auth.dto.js.map +1 -1
  21. package/dist/dto/card.dto.js.map +1 -1
  22. package/dist/dto/client.dto.js.map +1 -1
  23. package/dist/dto/index.d.ts +2 -0
  24. package/dist/dto/index.js +2 -0
  25. package/dist/dto/index.js.map +1 -1
  26. package/dist/dto/logging.dto.js.map +1 -1
  27. package/dist/dto/partner.dto.d.ts +1 -1
  28. package/dist/dto/partner.dto.js +7 -9
  29. package/dist/dto/partner.dto.js.map +1 -1
  30. package/dist/dto/transaction.dto.d.ts +2 -1
  31. package/dist/dto/transaction.dto.js.map +1 -1
  32. package/dist/dto/user.dto.d.ts +11 -0
  33. package/dist/dto/user.dto.js +45 -0
  34. package/dist/dto/user.dto.js.map +1 -0
  35. package/dist/enums/auth.enum.d.ts +12 -0
  36. package/dist/enums/auth.enum.js +18 -0
  37. package/dist/enums/auth.enum.js.map +1 -0
  38. package/dist/enums/iam.enum.d.ts +14 -0
  39. package/dist/enums/iam.enum.js +21 -0
  40. package/dist/enums/iam.enum.js.map +1 -0
  41. package/dist/enums/index.d.ts +2 -0
  42. package/dist/enums/index.js +2 -0
  43. package/dist/enums/index.js.map +1 -1
  44. package/dist/errors/app.error.d.ts +1 -1
  45. package/dist/filters/http-exception.filter.d.ts +5 -0
  46. package/dist/filters/http-exception.filter.js +48 -0
  47. package/dist/filters/http-exception.filter.js.map +1 -0
  48. package/dist/filters/index.d.ts +1 -0
  49. package/dist/filters/index.js +18 -0
  50. package/dist/filters/index.js.map +1 -0
  51. package/dist/index.d.ts +5 -0
  52. package/dist/index.js +5 -0
  53. package/dist/index.js.map +1 -1
  54. package/dist/interceptors/index.d.ts +2 -0
  55. package/dist/interceptors/index.js +19 -0
  56. package/dist/interceptors/index.js.map +1 -0
  57. package/dist/interceptors/logging.interceptor.d.ts +6 -0
  58. package/dist/interceptors/logging.interceptor.js +41 -0
  59. package/dist/interceptors/logging.interceptor.js.map +1 -0
  60. package/dist/interceptors/transform.interceptor.d.ts +9 -0
  61. package/dist/interceptors/transform.interceptor.js +24 -0
  62. package/dist/interceptors/transform.interceptor.js.map +1 -0
  63. package/dist/observability/index.d.ts +2 -0
  64. package/dist/observability/index.js +19 -0
  65. package/dist/observability/index.js.map +1 -0
  66. package/dist/observability/metrics/metrics.module.d.ts +2 -0
  67. package/dist/observability/metrics/metrics.module.js +28 -0
  68. package/dist/observability/metrics/metrics.module.js.map +1 -0
  69. package/dist/observability/tracing.d.ts +1 -0
  70. package/dist/observability/tracing.js +28 -0
  71. package/dist/observability/tracing.js.map +1 -0
  72. package/dist/resilience/circuit-breaker.service.d.ts +7 -0
  73. package/dist/resilience/circuit-breaker.service.js +45 -0
  74. package/dist/resilience/circuit-breaker.service.js.map +1 -0
  75. package/dist/resilience/resilience.module.d.ts +2 -0
  76. package/dist/resilience/resilience.module.js +22 -0
  77. package/dist/resilience/resilience.module.js.map +1 -0
  78. package/dist/types/auth.types.d.ts +22 -4
  79. package/dist/types/common.types.d.ts +11 -0
  80. package/dist/types/common.types.js +3 -0
  81. package/dist/types/common.types.js.map +1 -0
  82. package/dist/types/iam.types.d.ts +46 -0
  83. package/dist/types/iam.types.js +3 -0
  84. package/dist/types/iam.types.js.map +1 -0
  85. package/dist/types/index.d.ts +2 -0
  86. package/dist/types/index.js +2 -0
  87. package/dist/types/index.js.map +1 -1
  88. package/dist/types/monitoring.types.d.ts +2 -1
  89. package/dist/types/user.types.d.ts +7 -3
  90. package/dist/utils/app.utils.d.ts +1 -0
  91. package/dist/utils/app.utils.js +7 -1
  92. package/dist/utils/app.utils.js.map +1 -1
  93. package/dist/utils/health.utils.d.ts +6 -2
  94. package/dist/utils/health.utils.js +2 -1
  95. package/dist/utils/health.utils.js.map +1 -1
  96. package/package.json +28 -15
  97. package/proto/dbf.proto +1 -1
  98. package/src/constants/auth-config.constants.ts +7 -0
  99. package/src/constants/auth.constants.ts +16 -0
  100. package/src/constants/index.ts +1 -0
  101. package/src/constants/queue.constants.ts +8 -0
  102. package/src/contracts/auth.contract.ts +10 -9
  103. package/src/dto/account.dto.ts +28 -0
  104. package/src/dto/auth.dto.ts +126 -0
  105. package/src/dto/card.dto.ts +1 -1
  106. package/src/dto/client.dto.ts +7 -7
  107. package/src/dto/index.ts +2 -0
  108. package/src/dto/logging.dto.ts +3 -3
  109. package/src/dto/partner.dto.ts +3 -6
  110. package/src/dto/transaction.dto.ts +4 -3
  111. package/src/dto/user.dto.ts +28 -0
  112. package/src/enums/auth.enum.ts +13 -0
  113. package/src/enums/iam.enum.ts +28 -0
  114. package/src/enums/index.ts +2 -0
  115. package/src/filters/http-exception.filter.ts +49 -0
  116. package/src/filters/index.ts +2 -0
  117. package/src/index.ts +5 -0
  118. package/src/interceptors/index.ts +3 -0
  119. package/src/interceptors/logging.interceptor.ts +37 -0
  120. package/src/interceptors/transform.interceptor.ts +21 -0
  121. package/src/observability/index.ts +3 -0
  122. package/src/observability/metrics/metrics.module.ts +16 -0
  123. package/src/observability/tracing.ts +33 -0
  124. package/src/resilience/circuit-breaker.service.ts +46 -0
  125. package/src/resilience/resilience.module.ts +9 -0
  126. package/src/types/auth.types.ts +23 -4
  127. package/src/types/common.types.ts +18 -0
  128. package/src/types/iam.types.ts +78 -0
  129. package/src/types/index.ts +2 -0
  130. package/src/types/monitoring.types.ts +2 -4
  131. package/src/types/user.types.ts +3 -3
  132. package/src/utils/app.utils.ts +9 -0
  133. package/src/utils/health.utils.ts +11 -4
  134. package/tsconfig.json +5 -1
@@ -0,0 +1,45 @@
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 CircuitBreakerService_1;
9
+ Object.defineProperty(exports, "__esModule", { value: true });
10
+ exports.CircuitBreakerService = void 0;
11
+ const common_1 = require("@nestjs/common");
12
+ const CircuitBreaker = require("opossum");
13
+ let CircuitBreakerService = CircuitBreakerService_1 = class CircuitBreakerService {
14
+ constructor() {
15
+ this.logger = new common_1.Logger(CircuitBreakerService_1.name);
16
+ this.breakers = new Map();
17
+ }
18
+ async execute(key, action, options) {
19
+ let breaker = this.breakers.get(key);
20
+ if (!breaker) {
21
+ const defaultOptions = {
22
+ timeout: 5000,
23
+ errorThresholdPercentage: 50,
24
+ resetTimeout: 10000,
25
+ ...options,
26
+ };
27
+ const passThrough = async (promiseFactory) => promiseFactory();
28
+ breaker = new CircuitBreaker(passThrough, defaultOptions);
29
+ this.bindEvents(breaker, key);
30
+ this.breakers.set(key, breaker);
31
+ }
32
+ return breaker.fire(action);
33
+ }
34
+ bindEvents(breaker, key) {
35
+ breaker.on('open', () => this.logger.warn(`Circuit Breaker OPEN for ${key}`));
36
+ breaker.on('halfOpen', () => this.logger.log(`Circuit Breaker HALF-OPEN for ${key}`));
37
+ breaker.on('close', () => this.logger.log(`Circuit Breaker CLOSED for ${key}`));
38
+ breaker.on('fallback', () => this.logger.warn(`Circuit Breaker FALLBACK for ${key}`));
39
+ }
40
+ };
41
+ exports.CircuitBreakerService = CircuitBreakerService;
42
+ exports.CircuitBreakerService = CircuitBreakerService = CircuitBreakerService_1 = __decorate([
43
+ (0, common_1.Injectable)()
44
+ ], CircuitBreakerService);
45
+ //# sourceMappingURL=circuit-breaker.service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"circuit-breaker.service.js","sourceRoot":"","sources":["../../src/resilience/circuit-breaker.service.ts"],"names":[],"mappings":";;;;;;;;;;AAAA,2CAAoD;AACpD,0CAA2C;AAGpC,IAAM,qBAAqB,6BAA3B,MAAM,qBAAqB;IAA3B;QACc,WAAM,GAAG,IAAI,eAAM,CAAC,uBAAqB,CAAC,IAAI,CAAC,CAAC;QAChD,aAAQ,GAAG,IAAI,GAAG,EAA0B,CAAC;IAuClE,CAAC;IA/BG,KAAK,CAAC,OAAO,CACT,GAAW,EACX,MAAwB,EACxB,OAAgC;QAEhC,IAAI,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAErC,IAAI,CAAC,OAAO,EAAE,CAAC;YACX,MAAM,cAAc,GAA2B;gBAC3C,OAAO,EAAE,IAAI;gBACb,wBAAwB,EAAE,EAAE;gBAC5B,YAAY,EAAE,KAAK;gBACnB,GAAG,OAAO;aACb,CAAC;YAGF,MAAM,WAAW,GAAG,KAAK,EAAE,cAAgC,EAAE,EAAE,CAAC,cAAc,EAAE,CAAC;YACjF,OAAO,GAAG,IAAI,cAAc,CAAC,WAAW,EAAE,cAAc,CAAC,CAAC;YAC1D,IAAI,CAAC,UAAU,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;YAC9B,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;QACpC,CAAC;QAED,OAAO,OAAO,CAAC,IAAI,CAAC,MAAM,CAAe,CAAC;IAC9C,CAAC;IAEO,UAAU,CAAC,OAAuB,EAAE,GAAW;QACnD,OAAO,CAAC,EAAE,CAAC,MAAM,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,4BAA4B,GAAG,EAAE,CAAC,CAAC,CAAC;QAC9E,OAAO,CAAC,EAAE,CAAC,UAAU,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,iCAAiC,GAAG,EAAE,CAAC,CAAC,CAAC;QACtF,OAAO,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,8BAA8B,GAAG,EAAE,CAAC,CAAC,CAAC;QAChF,OAAO,CAAC,EAAE,CAAC,UAAU,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,gCAAgC,GAAG,EAAE,CAAC,CAAC,CAAC;IAC1F,CAAC;CACJ,CAAA;AAzCY,sDAAqB;gCAArB,qBAAqB;IADjC,IAAA,mBAAU,GAAE;GACA,qBAAqB,CAyCjC"}
@@ -0,0 +1,2 @@
1
+ export declare class ResilienceModule {
2
+ }
@@ -0,0 +1,22 @@
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.ResilienceModule = void 0;
10
+ const common_1 = require("@nestjs/common");
11
+ const circuit_breaker_service_1 = require("./circuit-breaker.service");
12
+ let ResilienceModule = class ResilienceModule {
13
+ };
14
+ exports.ResilienceModule = ResilienceModule;
15
+ exports.ResilienceModule = ResilienceModule = __decorate([
16
+ (0, common_1.Global)(),
17
+ (0, common_1.Module)({
18
+ providers: [circuit_breaker_service_1.CircuitBreakerService],
19
+ exports: [circuit_breaker_service_1.CircuitBreakerService],
20
+ })
21
+ ], ResilienceModule);
22
+ //# sourceMappingURL=resilience.module.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resilience.module.js","sourceRoot":"","sources":["../../src/resilience/resilience.module.ts"],"names":[],"mappings":";;;;;;;;;AAAA,2CAAgD;AAChD,uEAAkE;AAO3D,IAAM,gBAAgB,GAAtB,MAAM,gBAAgB;CAAI,CAAA;AAApB,4CAAgB;2BAAhB,gBAAgB;IAL5B,IAAA,eAAM,GAAE;IACR,IAAA,eAAM,EAAC;QACJ,SAAS,EAAE,CAAC,+CAAqB,CAAC;QAClC,OAAO,EAAE,CAAC,+CAAqB,CAAC;KACnC,CAAC;GACW,gBAAgB,CAAI"}
@@ -1,7 +1,10 @@
1
- export interface JwtPayload {
1
+ import { JsonObject, JsonValue } from './common.types';
2
+ import { SubjectType } from '../enums/iam.enum';
3
+ export interface JwtPayload extends JsonObject {
2
4
  sub: string;
3
- email: string;
5
+ email?: string;
4
6
  role: string;
7
+ subjectType: SubjectType;
5
8
  scopes: string[];
6
9
  iat?: number;
7
10
  exp?: number;
@@ -13,6 +16,21 @@ export interface JwtTokens {
13
16
  expiresIn: number;
14
17
  }
15
18
  export interface AuthenticatedRequest {
16
- user: any;
17
- [key: string]: any;
19
+ user: JwtPayload;
20
+ [key: string]: JsonValue;
21
+ }
22
+ export interface ValidateServiceTokenResponse {
23
+ isValid: boolean;
24
+ identityId?: string;
25
+ tokenId?: string;
26
+ }
27
+ export interface Session {
28
+ sessionId: string;
29
+ identityId: string;
30
+ ipAddress?: string;
31
+ userAgent?: string;
32
+ deviceInfo?: string;
33
+ createdAt: Date;
34
+ expiresAt: Date;
35
+ isRevoked?: boolean;
18
36
  }
@@ -0,0 +1,11 @@
1
+ export type JsonPrimitive = string | number | boolean | null | undefined;
2
+ export interface JsonObject {
3
+ [key: string]: JsonValue;
4
+ }
5
+ export interface JsonArray extends Array<JsonValue> {
6
+ }
7
+ export type JsonValue = JsonPrimitive | JsonObject | JsonArray;
8
+ export interface Metadata {
9
+ [key: string]: JsonValue;
10
+ }
11
+ export type MetricType = 'counter' | 'gauge' | 'histogram' | 'summary';
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=common.types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"common.types.js","sourceRoot":"","sources":["../../src/types/common.types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,46 @@
1
+ import { SubjectType, IdentityStatus, UserRole, IdentifierType } from '../enums';
2
+ import { JsonValue } from './common.types';
3
+ export interface Identity {
4
+ identityId: string;
5
+ subjectType: SubjectType;
6
+ role: UserRole;
7
+ status: IdentityStatus;
8
+ createdAt?: Date;
9
+ updatedAt?: Date;
10
+ }
11
+ export interface IdentityAttributes {
12
+ department?: string;
13
+ companyId?: string;
14
+ permissions: string[];
15
+ metadata?: Record<string, JsonValue>;
16
+ }
17
+ export interface PolicyCheckRequest {
18
+ identityId: string;
19
+ resource: string;
20
+ action: string;
21
+ context?: Record<string, JsonValue>;
22
+ }
23
+ export interface PolicyCheckResponse {
24
+ allowed: boolean;
25
+ reason?: string;
26
+ }
27
+ export interface OwnershipCheckRequest {
28
+ identityId: string;
29
+ resourceId: string;
30
+ resourceType: string;
31
+ }
32
+ export interface ScopeCheckRequest {
33
+ identityId: string;
34
+ scope: string;
35
+ context?: Record<string, JsonValue>;
36
+ }
37
+ export interface Credential {
38
+ id: string;
39
+ identityId: string;
40
+ identifierType: IdentifierType;
41
+ identifierValue: string;
42
+ passwordHash: string;
43
+ status: string;
44
+ createdAt?: Date;
45
+ updatedAt?: Date;
46
+ }
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=iam.types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"iam.types.js","sourceRoot":"","sources":["../../src/types/iam.types.ts"],"names":[],"mappings":""}
@@ -1,4 +1,6 @@
1
1
  export * from './config.types';
2
2
  export * from './auth.types';
3
+ export * from './iam.types';
3
4
  export * from './user.types';
5
+ export * from './common.types';
4
6
  export * from './monitoring.types';
@@ -16,6 +16,8 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
16
16
  Object.defineProperty(exports, "__esModule", { value: true });
17
17
  __exportStar(require("./config.types"), exports);
18
18
  __exportStar(require("./auth.types"), exports);
19
+ __exportStar(require("./iam.types"), exports);
19
20
  __exportStar(require("./user.types"), exports);
21
+ __exportStar(require("./common.types"), exports);
20
22
  __exportStar(require("./monitoring.types"), exports);
21
23
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,iDAA+B;AAC/B,+CAA6B;AAC7B,+CAA6B;AAC7B,qDAAmC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,iDAA+B;AAC/B,+CAA6B;AAC7B,8CAA4B;AAC5B,+CAA6B;AAC7B,iDAA+B;AAC/B,qDAAmC"}
@@ -1,7 +1,8 @@
1
+ import { MetricType } from './common.types';
1
2
  export interface PrometheusMetric {
2
3
  name: string;
3
4
  help: string;
4
- type: 'counter' | 'gauge' | 'histogram' | 'summary';
5
+ type: MetricType;
5
6
  labelNames?: string[];
6
7
  }
7
8
  export interface MetricValue {
@@ -4,7 +4,11 @@ import { GetUserByIdGrpcRequest, GetUserByEmailGrpcRequest } from '../contracts/
4
4
  export interface IUserService {
5
5
  getUserById(data: GetUserByIdGrpcRequest): Observable<UserResponse>;
6
6
  getUserByEmail(data: GetUserByEmailGrpcRequest): Observable<UserResponse>;
7
- createUser(data: any): Observable<UserResponse>;
8
- updateUser(data: any): Observable<UserResponse>;
9
- deleteUser(data: any): Observable<any>;
7
+ createUser(data: unknown): Observable<UserResponse>;
8
+ updateUser(data: unknown): Observable<UserResponse>;
9
+ deleteUser(data: {
10
+ id: string;
11
+ }): Observable<{
12
+ success: boolean;
13
+ }>;
10
14
  }
@@ -4,5 +4,6 @@ export interface AppSetupOptions {
4
4
  apiPrefix?: string;
5
5
  helmet?: boolean;
6
6
  validation?: boolean;
7
+ shutdownHooks?: boolean;
7
8
  }
8
9
  export declare function setupStandardApp(app: INestApplication, options?: AppSetupOptions): void;
@@ -5,7 +5,10 @@ const common_1 = require("@nestjs/common");
5
5
  const http_constants_1 = require("../constants/http.constants");
6
6
  const helmet_1 = require("helmet");
7
7
  function setupStandardApp(app, options = {}) {
8
- const { corsOrigins = ['*'], apiPrefix = http_constants_1.API_PREFIX.V1, helmet: useHelmet = true, validation = true, } = options;
8
+ const { corsOrigins = ['*'], apiPrefix = http_constants_1.API_PREFIX.V1, helmet: useHelmet = true, validation = true, shutdownHooks = true, } = options;
9
+ if (shutdownHooks) {
10
+ app.enableShutdownHooks();
11
+ }
9
12
  app.enableCors({
10
13
  origin: corsOrigins,
11
14
  credentials: true,
@@ -19,6 +22,9 @@ function setupStandardApp(app, options = {}) {
19
22
  whitelist: true,
20
23
  forbidNonWhitelisted: true,
21
24
  transform: true,
25
+ transformOptions: {
26
+ enableImplicitConversion: true,
27
+ },
22
28
  }));
23
29
  }
24
30
  }
@@ -1 +1 @@
1
- {"version":3,"file":"app.utils.js","sourceRoot":"","sources":["../../src/utils/app.utils.ts"],"names":[],"mappings":";;AAWA,4CA+BC;AA1CD,2CAAkE;AAClE,gEAAyD;AACzD,mCAA4B;AAS5B,SAAgB,gBAAgB,CAC5B,GAAqB,EACrB,UAA2B,EAAE;IAE7B,MAAM,EACF,WAAW,GAAG,CAAC,GAAG,CAAC,EACnB,SAAS,GAAG,2BAAU,CAAC,EAAE,EACzB,MAAM,EAAE,SAAS,GAAG,IAAI,EACxB,UAAU,GAAG,IAAI,GACpB,GAAG,OAAO,CAAC;IAEZ,GAAG,CAAC,UAAU,CAAC;QACX,MAAM,EAAE,WAAW;QACnB,WAAW,EAAE,IAAI;KACpB,CAAC,CAAC;IAEH,GAAG,CAAC,eAAe,CAAC,SAAS,CAAC,CAAC;IAE/B,IAAI,SAAS,EAAE,CAAC;QACZ,GAAG,CAAC,GAAG,CAAC,IAAA,gBAAM,GAAE,CAAC,CAAC;IACtB,CAAC;IAED,IAAI,UAAU,EAAE,CAAC;QACb,GAAG,CAAC,cAAc,CACd,IAAI,uBAAc,CAAC;YACf,SAAS,EAAE,IAAI;YACf,oBAAoB,EAAE,IAAI;YAC1B,SAAS,EAAE,IAAI;SAClB,CAAC,CACL,CAAC;IACN,CAAC;AACL,CAAC"}
1
+ {"version":3,"file":"app.utils.js","sourceRoot":"","sources":["../../src/utils/app.utils.ts"],"names":[],"mappings":";;AAYA,4CAuCC;AAnDD,2CAAkE;AAClE,gEAAyD;AACzD,mCAA4B;AAU5B,SAAgB,gBAAgB,CAC5B,GAAqB,EACrB,UAA2B,EAAE;IAE7B,MAAM,EACF,WAAW,GAAG,CAAC,GAAG,CAAC,EACnB,SAAS,GAAG,2BAAU,CAAC,EAAE,EACzB,MAAM,EAAE,SAAS,GAAG,IAAI,EACxB,UAAU,GAAG,IAAI,EACjB,aAAa,GAAG,IAAI,GACvB,GAAG,OAAO,CAAC;IAEZ,IAAI,aAAa,EAAE,CAAC;QAChB,GAAG,CAAC,mBAAmB,EAAE,CAAC;IAC9B,CAAC;IAED,GAAG,CAAC,UAAU,CAAC;QACX,MAAM,EAAE,WAAW;QACnB,WAAW,EAAE,IAAI;KACpB,CAAC,CAAC;IAEH,GAAG,CAAC,eAAe,CAAC,SAAS,CAAC,CAAC;IAE/B,IAAI,SAAS,EAAE,CAAC;QACZ,GAAG,CAAC,GAAG,CAAC,IAAA,gBAAM,GAAE,CAAC,CAAC;IACtB,CAAC;IAED,IAAI,UAAU,EAAE,CAAC;QACb,GAAG,CAAC,cAAc,CACd,IAAI,uBAAc,CAAC;YACf,SAAS,EAAE,IAAI;YACf,oBAAoB,EAAE,IAAI;YAC1B,SAAS,EAAE,IAAI;YACf,gBAAgB,EAAE;gBACd,wBAAwB,EAAE,IAAI;aACjC;SACJ,CAAC,CACL,CAAC;IACN,CAAC;AACL,CAAC"}
@@ -1,6 +1,10 @@
1
+ import { JsonValue } from '../types/common.types';
1
2
  export type HealthCheckStatus = 'up' | 'down';
2
3
  export interface ComponentHealth {
3
4
  status: HealthCheckStatus;
4
- [key: string]: any;
5
+ [key: string]: JsonValue;
5
6
  }
6
- export declare const createPrismaHealthCheck: (prisma: any) => () => Promise<ComponentHealth>;
7
+ export interface PrismaLike {
8
+ $queryRaw: (query: TemplateStringsArray, ...values: unknown[]) => Promise<unknown>;
9
+ }
10
+ export declare const createPrismaHealthCheck: (prisma: PrismaLike) => () => Promise<ComponentHealth>;
@@ -8,7 +8,8 @@ const createPrismaHealthCheck = (prisma) => {
8
8
  return { status: 'up' };
9
9
  }
10
10
  catch (e) {
11
- return { status: 'down', error: e.message };
11
+ const message = e instanceof Error ? e.message : 'Unknown error';
12
+ return { status: 'down', error: message };
12
13
  }
13
14
  };
14
15
  };
@@ -1 +1 @@
1
- {"version":3,"file":"health.utils.js","sourceRoot":"","sources":["../../src/utils/health.utils.ts"],"names":[],"mappings":";;;AAOO,MAAM,uBAAuB,GAAG,CAAC,MAAW,EAAE,EAAE;IACnD,OAAO,KAAK,IAA8B,EAAE;QACxC,IAAI,CAAC;YACD,MAAM,MAAM,CAAC,SAAS,CAAA,UAAU,CAAC;YACjC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;QAC5B,CAAC;QAAC,OAAO,CAAM,EAAE,CAAC;YACd,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC;QAChD,CAAC;IACL,CAAC,CAAC;AACN,CAAC,CAAC;AATW,QAAA,uBAAuB,2BASlC"}
1
+ {"version":3,"file":"health.utils.js","sourceRoot":"","sources":["../../src/utils/health.utils.ts"],"names":[],"mappings":";;;AAaO,MAAM,uBAAuB,GAAG,CAAC,MAAkB,EAAE,EAAE;IAC1D,OAAO,KAAK,IAA8B,EAAE;QACxC,IAAI,CAAC;YACD,MAAM,MAAM,CAAC,SAAS,CAAA,UAAU,CAAC;YACjC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;QAC5B,CAAC;QAAC,OAAO,CAAU,EAAE,CAAC;YAClB,MAAM,OAAO,GAAG,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,CAAC;YACjE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC;QAC9C,CAAC;IACL,CAAC,CAAC;AACN,CAAC,CAAC;AAVW,QAAA,uBAAuB,2BAUlC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@alacard-project/shared",
3
- "version": "1.0.10",
3
+ "version": "1.1.0",
4
4
  "engines": {
5
5
  "node": ">=24.0.0"
6
6
  },
@@ -8,28 +8,41 @@
8
8
  "main": "dist/index.js",
9
9
  "types": "dist/index.d.ts",
10
10
  "exports": {
11
- ".": "./dist/index.js"
11
+ ".": "./dist/index.js",
12
+ "./dist/observability/tracing": "./dist/observability/tracing.js"
12
13
  },
13
14
  "scripts": {
14
15
  "build": "tsc",
15
16
  "watch": "tsc -w"
16
17
  },
18
+ "peerDependencies": {
19
+ "@nestjs/common": "^10.0.0",
20
+ "@nestjs/core": "^10.0.0",
21
+ "reflect-metadata": "^0.2.0",
22
+ "rxjs": "^7.8.1"
23
+ },
17
24
  "dependencies": {
18
- "@nestjs/common": "^11.1.12",
19
- "@nestjs/config": "^4.0.2",
20
- "@nestjs/core": "^11.1.12",
21
- "axios": "^1.13.2",
25
+ "@nestjs/bullmq": "^10.0.0",
26
+ "@opentelemetry/auto-instrumentations-node": "^0.69.0",
27
+ "@opentelemetry/exporter-trace-otlp-http": "^0.211.0",
28
+ "@opentelemetry/resources": "^2.5.0",
29
+ "@opentelemetry/sdk-node": "^0.211.0",
30
+ "@opentelemetry/semantic-conventions": "^1.39.0",
31
+ "@types/opossum": "^8.1.9",
32
+ "axios": "^1.6.0",
33
+ "bullmq": "^5.67.2",
22
34
  "class-transformer": "^0.5.1",
23
- "class-validator": "^0.14.3",
24
- "helmet": "^8.1.0",
25
- "reflect-metadata": "^0.2.2",
26
- "rxjs": "^7.8.2"
35
+ "class-validator": "^0.14.1",
36
+ "helmet": "^7.1.0",
37
+ "opossum": "^9.0.0"
27
38
  },
28
39
  "devDependencies": {
29
- "@nestjs/common": "^11.1.12",
40
+ "@nestjs/common": "^10.0.0",
30
41
  "@nestjs/config": "^4.0.2",
31
- "@nestjs/core": "^11.1.12",
32
- "@types/node": "^24.10.0",
33
- "typescript": "^5.9.3"
42
+ "@nestjs/core": "^10.0.0",
43
+ "@types/node": "^20.3.1",
44
+ "reflect-metadata": "^0.2.0",
45
+ "rxjs": "^7.8.1",
46
+ "typescript": "^5.1.3"
34
47
  }
35
- }
48
+ }
package/proto/dbf.proto CHANGED
@@ -4,7 +4,7 @@ package dbf;
4
4
 
5
5
  // ==================== Service Definition ====================
6
6
 
7
- service Dbf Service {
7
+ service DbfService {
8
8
  // Read DBF file with optional filtering
9
9
  rpc ReadDbf(ReadDbfRequest) returns (ReadDbfResponse);
10
10
 
@@ -7,3 +7,10 @@ export const PASSWORD_RESET_CONFIG = {
7
7
  TOKEN_EXPIRY_HOURS: 1,
8
8
  TOKEN_LENGTH: 32,
9
9
  };
10
+ export const AUTH_CONFIG = {
11
+ JWT_ACCESS_EXPIRATION: '15m',
12
+ JWT_REFRESH_EXPIRATION: '7d',
13
+ SESSION_EXPIRATION_HOURS: 24,
14
+ MAX_LOGIN_ATTEMPTS: 5,
15
+ LOCKOUT_DURATION_MINUTES: 30,
16
+ } as const;
@@ -13,6 +13,22 @@ export const AUTHENTICATION_MESSAGES = {
13
13
  INVALID_CREDENTIALS: 'The email or password you entered is incorrect.',
14
14
  };
15
15
 
16
+ export const AUTH_MESSAGES = {
17
+ ...AUTHENTICATION_MESSAGES,
18
+ USER_SUSPENDED: 'User account is suspended',
19
+ USER_LOCKED: 'User account is locked',
20
+ USER_DELETED: 'User account has been deleted',
21
+ TOKEN_EXPIRED: 'Token has expired',
22
+ TOKEN_INVALID: 'Invalid token',
23
+ TOKEN_REVOKED: 'Token has been revoked',
24
+ REFRESH_SUCCESS: 'Token refreshed successfully',
25
+ PASSWORD_CHANGED: 'Password changed successfully',
26
+ TWO_FACTOR_REQUIRED: 'PENDING_2FA',
27
+ TWO_FACTOR_VERIFIED: 'Two-factor authentication verified successfully',
28
+ TWO_FACTOR_INVALID: 'Invalid or expired two-factor code',
29
+ } as const;
30
+
31
+
16
32
  export const COOKIE_EXPIRATION = {
17
33
  REFRESH_TOKEN_MS: 7 * 24 * 60 * 60 * 1000, // 7 days
18
34
  ACCESS_TOKEN_MS: 15 * 60 * 1000, // 15 minutes
@@ -6,5 +6,6 @@ export * from './error-messages';
6
6
  export * from './auth.constants';
7
7
  export * from './logging-messages.constants';
8
8
  export * from './routes.constants';
9
+ export * from './queue.constants';
9
10
  export * from './common.constants';
10
11
  export * from './auth-config.constants';
@@ -0,0 +1,8 @@
1
+ export const QUEUE_CONSTANTS = {
2
+ QUEUES: {
3
+ NOTIFICATIONS: 'notifications-queue',
4
+ },
5
+ JOBS: {
6
+ SEND_NOTIFICATION: 'send-notification-job',
7
+ },
8
+ };
@@ -1,14 +1,15 @@
1
1
  import { Observable } from 'rxjs';
2
- import { RegisterDto, LoginDto } from '../dto/auth.dto';
2
+ import { RegisterDto, LoginDto, UserResponse } from '../dto/auth.dto';
3
3
  import { JwtTokens } from '../types/auth.types';
4
4
  import { GenerateTokensRequest } from './token.contract';
5
+ import { UserRole } from '../enums';
5
6
 
6
7
  export interface GetUserByIdGrpcRequest {
7
8
  userId: string;
8
9
  }
9
10
 
10
11
  export interface GetUserByIdGrpcResponse {
11
- user: any;
12
+ user: UserResponse;
12
13
  }
13
14
 
14
15
  export interface GetUserByEmailGrpcRequest {
@@ -16,7 +17,7 @@ export interface GetUserByEmailGrpcRequest {
16
17
  }
17
18
 
18
19
  export interface GetUserByEmailGrpcResponse {
19
- user: any;
20
+ user: UserResponse;
20
21
  }
21
22
 
22
23
  export interface ValidateTokenGrpcRequest {
@@ -25,7 +26,7 @@ export interface ValidateTokenGrpcRequest {
25
26
 
26
27
  export interface ValidateTokenGrpcResponse {
27
28
  valid: boolean;
28
- user?: any;
29
+ user?: UserResponse;
29
30
  }
30
31
 
31
32
  export interface RefreshTokenGrpcRequest {
@@ -60,7 +61,7 @@ export interface CreateIdentityRequest {
60
61
  password: string;
61
62
  name?: string;
62
63
  userId: string;
63
- role: string;
64
+ role: UserRole;
64
65
  }
65
66
 
66
67
  export interface GetUserPermissionsGrpcResponse {
@@ -72,7 +73,7 @@ export interface GetUserPermissionsGrpcResponse {
72
73
  export interface CreateUserRequest {
73
74
  userId?: string;
74
75
  email: string;
75
- role: string;
76
+ role: UserRole;
76
77
  password?: string;
77
78
 
78
79
  // Employee Fields
@@ -91,7 +92,7 @@ export interface CreateUserRequest {
91
92
  export interface UpdateUserRequest {
92
93
  userId: string;
93
94
  email?: string;
94
- role?: string;
95
+ role?: UserRole;
95
96
  password?: string;
96
97
  isActive?: boolean;
97
98
 
@@ -133,8 +134,8 @@ export type DeleteUserResponse = { success: boolean };
133
134
  export interface IAuthService {
134
135
  login(data: LoginDto): Observable<JwtTokens>;
135
136
  generateTokens(data: GenerateTokensRequest): Observable<JwtTokens>;
136
- createIdentity(data: CreateIdentityRequest): Observable<any>;
137
- validate(data: { token: string }): Observable<{ valid: boolean; userId?: string; email?: string; role?: string }>;
137
+ createIdentity(data: CreateIdentityRequest): Observable<{ identityId: string }>;
138
+ validate(data: { token: string }): Observable<{ valid: boolean; userId?: string; email?: string; role?: UserRole }>;
138
139
  validateToken(data: ValidateTokenGrpcRequest): Observable<ValidateTokenGrpcResponse>;
139
140
  refreshToken(data: RefreshTokenGrpcRequest): Observable<JwtTokens>;
140
141
  revokeToken(data: RevokeTokenGrpcRequest): Observable<RevokeTokenGrpcResponse>;
@@ -0,0 +1,28 @@
1
+ import { IsString, IsOptional } from 'class-validator';
2
+
3
+ export class CreateAccountDto {
4
+ @IsString()
5
+ accountNumber!: string;
6
+
7
+ @IsOptional()
8
+ @IsString()
9
+ clientNumber?: string;
10
+
11
+ @IsOptional()
12
+ @IsString()
13
+ currency?: string;
14
+
15
+ @IsOptional()
16
+ @IsString() // Or @IsNumber() depending on your schema. Assuming string for Decimal/Money
17
+ balance?: string;
18
+ }
19
+
20
+ export class UpdateAccountDto {
21
+ @IsOptional()
22
+ @IsString()
23
+ status?: string;
24
+
25
+ @IsOptional()
26
+ @IsString()
27
+ balance?: string;
28
+ }