@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.
- package/README.md +24 -0
- package/dist/constants/auth-config.constants.d.ts +7 -0
- package/dist/constants/auth-config.constants.js +8 -1
- package/dist/constants/auth-config.constants.js.map +1 -1
- package/dist/constants/auth.constants.d.ts +25 -0
- package/dist/constants/auth.constants.js +15 -1
- package/dist/constants/auth.constants.js.map +1 -1
- package/dist/constants/index.d.ts +1 -0
- package/dist/constants/index.js +1 -0
- package/dist/constants/index.js.map +1 -1
- package/dist/constants/queue.constants.d.ts +8 -0
- package/dist/constants/queue.constants.js +12 -0
- package/dist/constants/queue.constants.js.map +1 -0
- package/dist/contracts/auth.contract.d.ts +12 -9
- package/dist/dto/account.dto.d.ts +10 -0
- package/dist/dto/account.dto.js +49 -0
- package/dist/dto/account.dto.js.map +1 -0
- package/dist/dto/auth.dto.d.ts +43 -0
- package/dist/dto/auth.dto.js +136 -1
- package/dist/dto/auth.dto.js.map +1 -1
- package/dist/dto/card.dto.js.map +1 -1
- package/dist/dto/client.dto.js.map +1 -1
- package/dist/dto/index.d.ts +2 -0
- package/dist/dto/index.js +2 -0
- package/dist/dto/index.js.map +1 -1
- package/dist/dto/logging.dto.js.map +1 -1
- package/dist/dto/partner.dto.d.ts +1 -1
- package/dist/dto/partner.dto.js +7 -9
- package/dist/dto/partner.dto.js.map +1 -1
- package/dist/dto/transaction.dto.d.ts +2 -1
- package/dist/dto/transaction.dto.js.map +1 -1
- package/dist/dto/user.dto.d.ts +11 -0
- package/dist/dto/user.dto.js +45 -0
- package/dist/dto/user.dto.js.map +1 -0
- package/dist/enums/auth.enum.d.ts +12 -0
- package/dist/enums/auth.enum.js +18 -0
- package/dist/enums/auth.enum.js.map +1 -0
- package/dist/enums/iam.enum.d.ts +14 -0
- package/dist/enums/iam.enum.js +21 -0
- package/dist/enums/iam.enum.js.map +1 -0
- package/dist/enums/index.d.ts +2 -0
- package/dist/enums/index.js +2 -0
- package/dist/enums/index.js.map +1 -1
- package/dist/errors/app.error.d.ts +1 -1
- package/dist/filters/http-exception.filter.d.ts +5 -0
- package/dist/filters/http-exception.filter.js +48 -0
- package/dist/filters/http-exception.filter.js.map +1 -0
- package/dist/filters/index.d.ts +1 -0
- package/dist/filters/index.js +18 -0
- package/dist/filters/index.js.map +1 -0
- package/dist/index.d.ts +5 -0
- package/dist/index.js +5 -0
- package/dist/index.js.map +1 -1
- package/dist/interceptors/index.d.ts +2 -0
- package/dist/interceptors/index.js +19 -0
- package/dist/interceptors/index.js.map +1 -0
- package/dist/interceptors/logging.interceptor.d.ts +6 -0
- package/dist/interceptors/logging.interceptor.js +41 -0
- package/dist/interceptors/logging.interceptor.js.map +1 -0
- package/dist/interceptors/transform.interceptor.d.ts +9 -0
- package/dist/interceptors/transform.interceptor.js +24 -0
- package/dist/interceptors/transform.interceptor.js.map +1 -0
- package/dist/observability/index.d.ts +2 -0
- package/dist/observability/index.js +19 -0
- package/dist/observability/index.js.map +1 -0
- package/dist/observability/metrics/metrics.module.d.ts +2 -0
- package/dist/observability/metrics/metrics.module.js +28 -0
- package/dist/observability/metrics/metrics.module.js.map +1 -0
- package/dist/observability/tracing.d.ts +1 -0
- package/dist/observability/tracing.js +28 -0
- package/dist/observability/tracing.js.map +1 -0
- package/dist/resilience/circuit-breaker.service.d.ts +7 -0
- package/dist/resilience/circuit-breaker.service.js +45 -0
- package/dist/resilience/circuit-breaker.service.js.map +1 -0
- package/dist/resilience/resilience.module.d.ts +2 -0
- package/dist/resilience/resilience.module.js +22 -0
- package/dist/resilience/resilience.module.js.map +1 -0
- package/dist/types/auth.types.d.ts +22 -4
- package/dist/types/common.types.d.ts +11 -0
- package/dist/types/common.types.js +3 -0
- package/dist/types/common.types.js.map +1 -0
- package/dist/types/iam.types.d.ts +46 -0
- package/dist/types/iam.types.js +3 -0
- package/dist/types/iam.types.js.map +1 -0
- package/dist/types/index.d.ts +2 -0
- package/dist/types/index.js +2 -0
- package/dist/types/index.js.map +1 -1
- package/dist/types/monitoring.types.d.ts +2 -1
- package/dist/types/user.types.d.ts +7 -3
- package/dist/utils/app.utils.d.ts +1 -0
- package/dist/utils/app.utils.js +7 -1
- package/dist/utils/app.utils.js.map +1 -1
- package/dist/utils/health.utils.d.ts +6 -2
- package/dist/utils/health.utils.js +2 -1
- package/dist/utils/health.utils.js.map +1 -1
- package/package.json +28 -15
- package/proto/dbf.proto +1 -1
- package/src/constants/auth-config.constants.ts +7 -0
- package/src/constants/auth.constants.ts +16 -0
- package/src/constants/index.ts +1 -0
- package/src/constants/queue.constants.ts +8 -0
- package/src/contracts/auth.contract.ts +10 -9
- package/src/dto/account.dto.ts +28 -0
- package/src/dto/auth.dto.ts +126 -0
- package/src/dto/card.dto.ts +1 -1
- package/src/dto/client.dto.ts +7 -7
- package/src/dto/index.ts +2 -0
- package/src/dto/logging.dto.ts +3 -3
- package/src/dto/partner.dto.ts +3 -6
- package/src/dto/transaction.dto.ts +4 -3
- package/src/dto/user.dto.ts +28 -0
- package/src/enums/auth.enum.ts +13 -0
- package/src/enums/iam.enum.ts +28 -0
- package/src/enums/index.ts +2 -0
- package/src/filters/http-exception.filter.ts +49 -0
- package/src/filters/index.ts +2 -0
- package/src/index.ts +5 -0
- package/src/interceptors/index.ts +3 -0
- package/src/interceptors/logging.interceptor.ts +37 -0
- package/src/interceptors/transform.interceptor.ts +21 -0
- package/src/observability/index.ts +3 -0
- package/src/observability/metrics/metrics.module.ts +16 -0
- package/src/observability/tracing.ts +33 -0
- package/src/resilience/circuit-breaker.service.ts +46 -0
- package/src/resilience/resilience.module.ts +9 -0
- package/src/types/auth.types.ts +23 -4
- package/src/types/common.types.ts +18 -0
- package/src/types/iam.types.ts +78 -0
- package/src/types/index.ts +2 -0
- package/src/types/monitoring.types.ts +2 -4
- package/src/types/user.types.ts +3 -3
- package/src/utils/app.utils.ts +9 -0
- package/src/utils/health.utils.ts +11 -4
- 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,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
|
-
|
|
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
|
|
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:
|
|
17
|
-
[key: string]:
|
|
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 @@
|
|
|
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 @@
|
|
|
1
|
+
{"version":3,"file":"iam.types.js","sourceRoot":"","sources":["../../src/types/iam.types.ts"],"names":[],"mappings":""}
|
package/dist/types/index.d.ts
CHANGED
package/dist/types/index.js
CHANGED
|
@@ -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
|
package/dist/types/index.js.map
CHANGED
|
@@ -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"}
|
|
@@ -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:
|
|
8
|
-
updateUser(data:
|
|
9
|
-
deleteUser(data:
|
|
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
|
}
|
package/dist/utils/app.utils.js
CHANGED
|
@@ -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":";;
|
|
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]:
|
|
5
|
+
[key: string]: JsonValue;
|
|
5
6
|
}
|
|
6
|
-
export
|
|
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
|
-
|
|
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":";;;
|
|
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
|
|
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/
|
|
19
|
-
"@
|
|
20
|
-
"@
|
|
21
|
-
"
|
|
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.
|
|
24
|
-
"helmet": "^
|
|
25
|
-
"
|
|
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": "^
|
|
40
|
+
"@nestjs/common": "^10.0.0",
|
|
30
41
|
"@nestjs/config": "^4.0.2",
|
|
31
|
-
"@nestjs/core": "^
|
|
32
|
-
"@types/node": "^
|
|
33
|
-
"
|
|
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
|
@@ -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
|
package/src/constants/index.ts
CHANGED
|
@@ -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';
|
|
@@ -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:
|
|
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:
|
|
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?:
|
|
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:
|
|
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:
|
|
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?:
|
|
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<
|
|
137
|
-
validate(data: { token: string }): Observable<{ valid: boolean; userId?: string; email?: string; role?:
|
|
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
|
+
}
|