@alacard-project/shared 1.1.2 → 1.1.5
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/dist/constants/microservices.constants.d.ts +4 -0
- package/dist/constants/microservices.constants.js +4 -0
- package/dist/constants/microservices.constants.js.map +1 -1
- package/dist/contracts/card.contract.d.ts +98 -0
- package/dist/contracts/card.contract.js +3 -0
- package/dist/contracts/card.contract.js.map +1 -0
- package/dist/contracts/index.d.ts +3 -1
- package/dist/contracts/index.js +3 -0
- package/dist/contracts/index.js.map +1 -1
- package/dist/contracts/transaction.contract.d.ts +63 -0
- package/dist/contracts/transaction.contract.js +3 -0
- package/dist/contracts/transaction.contract.js.map +1 -0
- package/dist/dto/auth.dto.d.ts +3 -1
- package/dist/dto/auth.dto.js +11 -0
- package/dist/dto/auth.dto.js.map +1 -1
- package/dist/filters/global-exception.filter.d.ts +12 -0
- package/dist/filters/global-exception.filter.js +156 -0
- package/dist/filters/global-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 +8 -0
- package/dist/index.js +8 -0
- package/dist/index.js.map +1 -1
- package/dist/middleware/index.d.ts +2 -0
- package/dist/middleware/index.js +19 -0
- package/dist/middleware/index.js.map +1 -0
- package/dist/middleware/prisma-logging.middleware.d.ts +3 -0
- package/dist/middleware/prisma-logging.middleware.js +52 -0
- package/dist/middleware/prisma-logging.middleware.js.map +1 -0
- package/dist/middleware/tracing.middleware.d.ts +8 -0
- package/dist/middleware/tracing.middleware.js +33 -0
- package/dist/middleware/tracing.middleware.js.map +1 -0
- package/dist/resilience/circuit-breaker.service.d.ts +1 -1
- package/dist/resilience/circuit-breaker.service.js +2 -2
- package/dist/resilience/circuit-breaker.service.js.map +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/dist/types/logger.interface.d.ts +6 -0
- package/dist/types/logger.interface.js +3 -0
- package/dist/types/logger.interface.js.map +1 -0
- package/dist/utils/app-logger.d.ts +11 -0
- package/dist/utils/app-logger.js +65 -0
- package/dist/utils/app-logger.js.map +1 -0
- package/dist/utils/app.utils.d.ts +10 -1
- package/dist/utils/app.utils.js +26 -2
- package/dist/utils/app.utils.js.map +1 -1
- package/dist/utils/bootstrap.utils.d.ts +15 -0
- package/dist/utils/bootstrap.utils.js +70 -0
- package/dist/utils/bootstrap.utils.js.map +1 -0
- package/dist/utils/grpc-tracing-server.interceptor.d.ts +8 -0
- package/dist/utils/grpc-tracing-server.interceptor.js +48 -0
- package/dist/utils/grpc-tracing-server.interceptor.js.map +1 -0
- package/dist/utils/grpc-tracing.interceptor.d.ts +8 -0
- package/dist/utils/grpc-tracing.interceptor.js +35 -0
- package/dist/utils/grpc-tracing.interceptor.js.map +1 -0
- package/dist/utils/http-tracing.interceptor.d.ts +8 -0
- package/dist/utils/http-tracing.interceptor.js +35 -0
- package/dist/utils/http-tracing.interceptor.js.map +1 -0
- package/dist/utils/proto-path.js +1 -1
- package/dist/utils/proto-path.js.map +1 -1
- package/dist/utils/standard-health.module.d.ts +10 -0
- package/dist/utils/standard-health.module.js +59 -0
- package/dist/utils/standard-health.module.js.map +1 -0
- package/dist/utils/tracing.module.d.ts +2 -0
- package/dist/utils/tracing.module.js +22 -0
- package/dist/utils/tracing.module.js.map +1 -0
- package/dist/utils/tracing.service.d.ts +10 -0
- package/dist/utils/tracing.service.js +43 -0
- package/dist/utils/tracing.service.js.map +1 -0
- package/package.json +49 -45
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"microservices.constants.js","sourceRoot":"","sources":["../../src/constants/microservices.constants.ts"],"names":[],"mappings":";;;AAAa,QAAA,aAAa,GAAG;IACzB,MAAM,EAAE;QACJ,YAAY,EAAE,eAAe;QAC7B,OAAO,EAAE,QAAQ;KACpB;IACD,OAAO,EAAE;QACL,YAAY,EAAE,gBAAgB;QAC9B,OAAO,EAAE,SAAS;KACrB;IACD,KAAK,EAAE;QACH,YAAY,EAAE,cAAc;QAC5B,OAAO,EAAE,OAAO;KACnB;IACD,IAAI,EAAE;QACF,YAAY,EAAE,aAAa;QAC3B,OAAO,EAAE,MAAM;KAClB;IACD,IAAI,EAAE;QACF,YAAY,EAAE,aAAa;QAC3B,OAAO,EAAE,MAAM;KAClB;IACD,MAAM,EAAE;QACJ,YAAY,EAAE,eAAe;QAC7B,OAAO,EAAE,QAAQ;KACpB;IACD,IAAI,EAAE;QACF,YAAY,EAAE,aAAa;QAC3B,OAAO,EAAE,MAAM;KAClB;IACD,WAAW,EAAE;QACT,YAAY,EAAE,oBAAoB;QAClC,OAAO,EAAE,aAAa;KACzB;IACD,OAAO,EAAE;QACL,YAAY,EAAE,gBAAgB;QAC9B,OAAO,EAAE,SAAS;KACrB;IACD,OAAO,EAAE;QACL,YAAY,EAAE,gBAAgB;QAC9B,OAAO,EAAE,SAAS;KACrB;IACD,YAAY,EAAE;QACV,YAAY,EAAE,qBAAqB;QACnC,OAAO,EAAE,cAAc;KAC1B;IACD,UAAU,EAAE;QACR,YAAY,EAAE,mBAAmB;QACjC,OAAO,EAAE,YAAY;KACxB;IACD,QAAQ,EAAE;QACN,YAAY,EAAE,iBAAiB;QAC/B,OAAO,EAAE,UAAU;KACtB;IACD,OAAO,EAAE;QACL,YAAY,EAAE,gBAAgB;QAC9B,OAAO,EAAE,SAAS;KACrB;IACD,KAAK,EAAE;QACH,YAAY,EAAE,cAAc;QAC5B,OAAO,EAAE,OAAO;KACnB;CACK,CAAC"}
|
|
1
|
+
{"version":3,"file":"microservices.constants.js","sourceRoot":"","sources":["../../src/constants/microservices.constants.ts"],"names":[],"mappings":";;;AAAa,QAAA,aAAa,GAAG;IACzB,MAAM,EAAE;QACJ,YAAY,EAAE,eAAe;QAC7B,OAAO,EAAE,QAAQ;KACpB;IACD,OAAO,EAAE;QACL,YAAY,EAAE,gBAAgB;QAC9B,OAAO,EAAE,SAAS;KACrB;IACD,KAAK,EAAE;QACH,YAAY,EAAE,cAAc;QAC5B,OAAO,EAAE,OAAO;KACnB;IACD,IAAI,EAAE;QACF,YAAY,EAAE,aAAa;QAC3B,OAAO,EAAE,MAAM;KAClB;IACD,IAAI,EAAE;QACF,YAAY,EAAE,aAAa;QAC3B,OAAO,EAAE,MAAM;KAClB;IACD,MAAM,EAAE;QACJ,YAAY,EAAE,eAAe;QAC7B,OAAO,EAAE,QAAQ;KACpB;IACD,IAAI,EAAE;QACF,YAAY,EAAE,aAAa;QAC3B,OAAO,EAAE,MAAM;KAClB;IACD,WAAW,EAAE;QACT,YAAY,EAAE,oBAAoB;QAClC,OAAO,EAAE,aAAa;KACzB;IACD,OAAO,EAAE;QACL,YAAY,EAAE,gBAAgB;QAC9B,OAAO,EAAE,SAAS;KACrB;IACD,OAAO,EAAE;QACL,YAAY,EAAE,gBAAgB;QAC9B,OAAO,EAAE,SAAS;KACrB;IACD,YAAY,EAAE;QACV,YAAY,EAAE,qBAAqB;QACnC,OAAO,EAAE,cAAc;KAC1B;IACD,UAAU,EAAE;QACR,YAAY,EAAE,mBAAmB;QACjC,OAAO,EAAE,YAAY;KACxB;IACD,QAAQ,EAAE;QACN,YAAY,EAAE,iBAAiB;QAC/B,OAAO,EAAE,UAAU;KACtB;IACD,OAAO,EAAE;QACL,YAAY,EAAE,gBAAgB;QAC9B,OAAO,EAAE,SAAS;KACrB;IACD,KAAK,EAAE;QACH,YAAY,EAAE,cAAc;QAC5B,OAAO,EAAE,OAAO;KACnB;IACD,MAAM,EAAE;QACJ,YAAY,EAAE,eAAe;QAC7B,OAAO,EAAE,QAAQ;KACpB;CACK,CAAC"}
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
import { Observable } from 'rxjs';
|
|
2
|
+
import { CreateCardDto, UpdateCardDto } from '../dto/card.dto';
|
|
3
|
+
export interface Card {
|
|
4
|
+
id: string;
|
|
5
|
+
cardNumber: string;
|
|
6
|
+
cardType: string;
|
|
7
|
+
cardStatus: string;
|
|
8
|
+
clientId: string;
|
|
9
|
+
accountId: string;
|
|
10
|
+
balance: number;
|
|
11
|
+
issuedAt: string;
|
|
12
|
+
expiresAt: string;
|
|
13
|
+
createdAt: string;
|
|
14
|
+
updatedAt: string;
|
|
15
|
+
}
|
|
16
|
+
export interface FindCardsDto {
|
|
17
|
+
skip?: number;
|
|
18
|
+
take?: number;
|
|
19
|
+
page?: number;
|
|
20
|
+
limit?: number;
|
|
21
|
+
clientId?: string;
|
|
22
|
+
status?: string;
|
|
23
|
+
}
|
|
24
|
+
export interface FindByClientDto {
|
|
25
|
+
clientId: string;
|
|
26
|
+
clientNumber?: string;
|
|
27
|
+
}
|
|
28
|
+
export interface CardsResponse {
|
|
29
|
+
cards: Card[];
|
|
30
|
+
total: number;
|
|
31
|
+
}
|
|
32
|
+
export interface BalanceResponse {
|
|
33
|
+
cardId: string;
|
|
34
|
+
balance: number;
|
|
35
|
+
currency: string;
|
|
36
|
+
}
|
|
37
|
+
export interface SyncHistoryItem {
|
|
38
|
+
id: string;
|
|
39
|
+
cardId: string;
|
|
40
|
+
terminalId: string;
|
|
41
|
+
amount: number;
|
|
42
|
+
syncDate: string;
|
|
43
|
+
}
|
|
44
|
+
export interface SyncHistoryResponse {
|
|
45
|
+
items: SyncHistoryItem[];
|
|
46
|
+
total: number;
|
|
47
|
+
}
|
|
48
|
+
export interface CardStatsResponse {
|
|
49
|
+
totalCards: number;
|
|
50
|
+
activeCards: number;
|
|
51
|
+
blockedCards: number;
|
|
52
|
+
totalBalance: number;
|
|
53
|
+
}
|
|
54
|
+
export interface UpdatePhysicalBalanceDto {
|
|
55
|
+
id: string;
|
|
56
|
+
amountAdded: number;
|
|
57
|
+
terminalId?: string;
|
|
58
|
+
allocationId?: string;
|
|
59
|
+
rawData?: any;
|
|
60
|
+
}
|
|
61
|
+
export interface UpdateVirtualBalanceDto {
|
|
62
|
+
id: string;
|
|
63
|
+
amount: number;
|
|
64
|
+
reason?: string;
|
|
65
|
+
}
|
|
66
|
+
export interface UpdateBalanceModeDto {
|
|
67
|
+
id: string;
|
|
68
|
+
mode: 'OFFLINE' | 'ONLINE' | 'HYBRID';
|
|
69
|
+
}
|
|
70
|
+
export interface GetSyncHistoryDto {
|
|
71
|
+
id: string;
|
|
72
|
+
page?: number;
|
|
73
|
+
limit?: number;
|
|
74
|
+
}
|
|
75
|
+
export interface ICardService {
|
|
76
|
+
create(data: CreateCardDto): Observable<Card>;
|
|
77
|
+
findAll(data: FindCardsDto): Observable<CardsResponse>;
|
|
78
|
+
findByClient(data: FindByClientDto): Observable<CardsResponse>;
|
|
79
|
+
findOne(data: {
|
|
80
|
+
id: string;
|
|
81
|
+
}): Observable<Card>;
|
|
82
|
+
getStats(data: {}): Observable<CardStatsResponse>;
|
|
83
|
+
getSyncHistory(data: GetSyncHistoryDto): Observable<SyncHistoryResponse>;
|
|
84
|
+
getEffectiveBalance(data: {
|
|
85
|
+
id: string;
|
|
86
|
+
}): Observable<BalanceResponse>;
|
|
87
|
+
update(data: {
|
|
88
|
+
id: string;
|
|
89
|
+
} & UpdateCardDto): Observable<Card>;
|
|
90
|
+
updatePhysicalBalance(data: UpdatePhysicalBalanceDto): Observable<Card>;
|
|
91
|
+
updateVirtualBalance(data: UpdateVirtualBalanceDto): Observable<Card>;
|
|
92
|
+
updateBalanceMode(data: UpdateBalanceModeDto): Observable<Card>;
|
|
93
|
+
remove(data: {
|
|
94
|
+
id: string;
|
|
95
|
+
}): Observable<{
|
|
96
|
+
success: boolean;
|
|
97
|
+
}>;
|
|
98
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"card.contract.js","sourceRoot":"","sources":["../../src/contracts/card.contract.ts"],"names":[],"mappings":""}
|
|
@@ -1,4 +1,6 @@
|
|
|
1
1
|
export * from './config.contract';
|
|
2
2
|
export * from './logging.contract';
|
|
3
3
|
export * from './auth.contract';
|
|
4
|
-
export
|
|
4
|
+
export * from './token.contract';
|
|
5
|
+
export * from './card.contract';
|
|
6
|
+
export * from './transaction.contract';
|
package/dist/contracts/index.js
CHANGED
|
@@ -17,4 +17,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
17
17
|
__exportStar(require("./config.contract"), exports);
|
|
18
18
|
__exportStar(require("./logging.contract"), exports);
|
|
19
19
|
__exportStar(require("./auth.contract"), exports);
|
|
20
|
+
__exportStar(require("./token.contract"), exports);
|
|
21
|
+
__exportStar(require("./card.contract"), exports);
|
|
22
|
+
__exportStar(require("./transaction.contract"), exports);
|
|
20
23
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/contracts/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,oDAAkC;AAClC,qDAAmC;AACnC,kDAAgC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/contracts/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,oDAAkC;AAClC,qDAAmC;AACnC,kDAAgC;AAChC,mDAAiC;AACjC,kDAAgC;AAChC,yDAAuC"}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
import { Observable } from 'rxjs';
|
|
2
|
+
import { CreateTransactionDto, UpdateTransactionDto } from '../dto/transaction.dto';
|
|
3
|
+
export interface Transaction {
|
|
4
|
+
id: string;
|
|
5
|
+
externalId?: string;
|
|
6
|
+
cardId: string;
|
|
7
|
+
amount: number;
|
|
8
|
+
currency: string;
|
|
9
|
+
type: string;
|
|
10
|
+
status: string;
|
|
11
|
+
description?: string;
|
|
12
|
+
transactionDate: string;
|
|
13
|
+
createdAt: string;
|
|
14
|
+
metadata?: any;
|
|
15
|
+
}
|
|
16
|
+
export interface FindTransactionsDto {
|
|
17
|
+
cardId?: string;
|
|
18
|
+
skip?: number;
|
|
19
|
+
take?: number;
|
|
20
|
+
page?: number;
|
|
21
|
+
limit?: number;
|
|
22
|
+
year?: number;
|
|
23
|
+
month?: number;
|
|
24
|
+
}
|
|
25
|
+
export interface SearchTransactionsDto {
|
|
26
|
+
cardIds: string[];
|
|
27
|
+
clientId?: string;
|
|
28
|
+
skip?: number;
|
|
29
|
+
take?: number;
|
|
30
|
+
orderBy?: string;
|
|
31
|
+
}
|
|
32
|
+
export interface TransactionsResponse {
|
|
33
|
+
transactions: Transaction[];
|
|
34
|
+
total: number;
|
|
35
|
+
}
|
|
36
|
+
export interface TransactionsResult {
|
|
37
|
+
items: Transaction[];
|
|
38
|
+
count: number;
|
|
39
|
+
}
|
|
40
|
+
export interface StatsResponse {
|
|
41
|
+
totalSpent: number;
|
|
42
|
+
transactionCount: number;
|
|
43
|
+
lastTransactionDate?: string;
|
|
44
|
+
}
|
|
45
|
+
export interface ITransactionService {
|
|
46
|
+
create(data: CreateTransactionDto): Observable<Transaction>;
|
|
47
|
+
findAll(data: FindTransactionsDto): Observable<TransactionsResponse>;
|
|
48
|
+
search(data: SearchTransactionsDto): Observable<TransactionsResult>;
|
|
49
|
+
findOne(data: {
|
|
50
|
+
id: string;
|
|
51
|
+
}): Observable<Transaction>;
|
|
52
|
+
getStats(data: {
|
|
53
|
+
cardId?: string;
|
|
54
|
+
}): Observable<StatsResponse>;
|
|
55
|
+
update(data: {
|
|
56
|
+
id: string;
|
|
57
|
+
} & UpdateTransactionDto): Observable<Transaction>;
|
|
58
|
+
remove(data: {
|
|
59
|
+
id: string;
|
|
60
|
+
}): Observable<{
|
|
61
|
+
success: boolean;
|
|
62
|
+
}>;
|
|
63
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"transaction.contract.js","sourceRoot":"","sources":["../../src/contracts/transaction.contract.ts"],"names":[],"mappings":""}
|
package/dist/dto/auth.dto.d.ts
CHANGED
|
@@ -17,8 +17,10 @@ export declare class EmployeeLoginDto {
|
|
|
17
17
|
password: string;
|
|
18
18
|
}
|
|
19
19
|
export declare class PublicLoginDto {
|
|
20
|
-
username
|
|
20
|
+
username?: string;
|
|
21
|
+
email?: string;
|
|
21
22
|
password: string;
|
|
23
|
+
role?: string;
|
|
22
24
|
}
|
|
23
25
|
export interface UserResponse {
|
|
24
26
|
id: string;
|
package/dist/dto/auth.dto.js
CHANGED
|
@@ -73,13 +73,24 @@ class PublicLoginDto {
|
|
|
73
73
|
exports.PublicLoginDto = PublicLoginDto;
|
|
74
74
|
__decorate([
|
|
75
75
|
(0, class_validator_1.IsString)(),
|
|
76
|
+
(0, class_validator_1.IsOptional)(),
|
|
76
77
|
__metadata("design:type", String)
|
|
77
78
|
], PublicLoginDto.prototype, "username", void 0);
|
|
79
|
+
__decorate([
|
|
80
|
+
(0, class_validator_1.IsEmail)(),
|
|
81
|
+
(0, class_validator_1.IsOptional)(),
|
|
82
|
+
__metadata("design:type", String)
|
|
83
|
+
], PublicLoginDto.prototype, "email", void 0);
|
|
78
84
|
__decorate([
|
|
79
85
|
(0, class_validator_1.IsString)(),
|
|
80
86
|
(0, class_validator_1.MinLength)(8),
|
|
81
87
|
__metadata("design:type", String)
|
|
82
88
|
], PublicLoginDto.prototype, "password", void 0);
|
|
89
|
+
__decorate([
|
|
90
|
+
(0, class_validator_1.IsString)(),
|
|
91
|
+
(0, class_validator_1.IsOptional)(),
|
|
92
|
+
__metadata("design:type", String)
|
|
93
|
+
], PublicLoginDto.prototype, "role", void 0);
|
|
83
94
|
class InviteRequestBody {
|
|
84
95
|
}
|
|
85
96
|
exports.InviteRequestBody = InviteRequestBody;
|
package/dist/dto/auth.dto.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"auth.dto.js","sourceRoot":"","sources":["../../src/dto/auth.dto.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,qDAAmF;AACnF,kDAA8C;AAC9C,oCAA4D;AAE5D,MAAa,WAAW;CAuBvB;AAvBD,kCAuBC;AArBG;IADC,IAAA,yBAAO,GAAE;;0CACK;AAIf;IAFC,IAAA,0BAAQ,GAAE;IACV,IAAA,2BAAS,EAAC,CAAC,CAAC;;6CACK;AAIlB;IAFC,IAAA,wBAAM,EAAC,oBAAQ,CAAC;IAChB,IAAA,4BAAU,GAAE;;yCACG;AAIhB;IAFC,IAAA,0BAAQ,GAAE;IACV,IAAA,4BAAU,GAAE;;8CACM;AAInB;IAFC,IAAA,0BAAQ,GAAE;IACV,IAAA,4BAAU,GAAE;;6CACK;AAIlB;IAFC,IAAA,0BAAQ,GAAE;IACV,IAAA,4BAAU,GAAE;;2CACG;AAGpB,MAAa,QAAQ;CAMpB;AAND,4BAMC;AAJG;IADC,IAAA,yBAAO,GAAE;;uCACK;AAGf;IADC,IAAA,0BAAQ,GAAE;;0CACO;AAOtB,MAAa,gBAAgB;CAO5B;AAPD,4CAOC;AALG;IADC,IAAA,yBAAO,GAAE;;+CACK;AAIf;IAFC,IAAA,0BAAQ,GAAE;IACV,IAAA,2BAAS,EAAC,CAAC,CAAC;;kDACK;
|
|
1
|
+
{"version":3,"file":"auth.dto.js","sourceRoot":"","sources":["../../src/dto/auth.dto.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { ExceptionFilter, ArgumentsHost } from '@nestjs/common';
|
|
2
|
+
import type { IRemoteLogger } from '../types/logger.interface';
|
|
3
|
+
export declare class GlobalExceptionFilter implements ExceptionFilter {
|
|
4
|
+
private readonly logger;
|
|
5
|
+
private remoteLogger?;
|
|
6
|
+
constructor(remoteLogger?: IRemoteLogger);
|
|
7
|
+
catch(exception: any, host: ArgumentsHost): any;
|
|
8
|
+
private handleHttpException;
|
|
9
|
+
private handleRpcException;
|
|
10
|
+
private mapGrpcStatusToHttp;
|
|
11
|
+
private mapHttpStatusToGrpc;
|
|
12
|
+
}
|
|
@@ -0,0 +1,156 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
3
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
4
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
5
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
6
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
7
|
+
};
|
|
8
|
+
var __metadata = (this && this.__metadata) || function (k, v) {
|
|
9
|
+
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
10
|
+
};
|
|
11
|
+
var GlobalExceptionFilter_1;
|
|
12
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
13
|
+
exports.GlobalExceptionFilter = void 0;
|
|
14
|
+
const common_1 = require("@nestjs/common");
|
|
15
|
+
const microservices_1 = require("@nestjs/microservices");
|
|
16
|
+
const rxjs_1 = require("rxjs");
|
|
17
|
+
let GlobalExceptionFilter = GlobalExceptionFilter_1 = class GlobalExceptionFilter {
|
|
18
|
+
constructor(remoteLogger) {
|
|
19
|
+
this.logger = new common_1.Logger(GlobalExceptionFilter_1.name);
|
|
20
|
+
this.remoteLogger = remoteLogger;
|
|
21
|
+
}
|
|
22
|
+
catch(exception, host) {
|
|
23
|
+
const type = host.getType();
|
|
24
|
+
if (type === 'http') {
|
|
25
|
+
return this.handleHttpException(exception, host);
|
|
26
|
+
}
|
|
27
|
+
else if (type === 'rpc') {
|
|
28
|
+
return this.handleRpcException(exception, host);
|
|
29
|
+
}
|
|
30
|
+
this.logger.error(`Unhandled exception of type ${type}`, exception instanceof Error ? exception.stack : '');
|
|
31
|
+
return exception;
|
|
32
|
+
}
|
|
33
|
+
handleHttpException(exception, host) {
|
|
34
|
+
const ctx = host.switchToHttp();
|
|
35
|
+
const response = ctx.getResponse();
|
|
36
|
+
const request = ctx.getRequest();
|
|
37
|
+
let status = common_1.HttpStatus.INTERNAL_SERVER_ERROR;
|
|
38
|
+
let message = 'Internal server error';
|
|
39
|
+
let stack = '';
|
|
40
|
+
let errorDetails = null;
|
|
41
|
+
if (exception instanceof common_1.HttpException) {
|
|
42
|
+
status = exception.getStatus();
|
|
43
|
+
const res = exception.getResponse();
|
|
44
|
+
message = typeof res === 'string' ? res : res.message || exception.message;
|
|
45
|
+
errorDetails = typeof res === 'object' ? res : null;
|
|
46
|
+
stack = exception.stack || '';
|
|
47
|
+
}
|
|
48
|
+
else if (exception.code !== undefined && typeof exception.code === 'number') {
|
|
49
|
+
status = this.mapGrpcStatusToHttp(exception.code);
|
|
50
|
+
message = exception.details || exception.message || 'Microservice Error';
|
|
51
|
+
errorDetails = { grpcCode: exception.code, details: exception.details };
|
|
52
|
+
stack = exception.stack || '';
|
|
53
|
+
}
|
|
54
|
+
else if (exception instanceof Error) {
|
|
55
|
+
message = exception.message;
|
|
56
|
+
stack = exception.stack || '';
|
|
57
|
+
}
|
|
58
|
+
const logMetadata = {
|
|
59
|
+
method: request.method,
|
|
60
|
+
url: request.url,
|
|
61
|
+
body: request.body,
|
|
62
|
+
query: request.query,
|
|
63
|
+
params: request.params,
|
|
64
|
+
clientIp: request.ip,
|
|
65
|
+
status,
|
|
66
|
+
errorDetails,
|
|
67
|
+
stack,
|
|
68
|
+
};
|
|
69
|
+
const logPrefix = `[${request.method}] ${request.url} - ${status}`;
|
|
70
|
+
const isInfrastructurePath = request.url.includes('/metrics') || request.url.includes('/health');
|
|
71
|
+
const isNotFound = status === common_1.HttpStatus.NOT_FOUND;
|
|
72
|
+
if (!isInfrastructurePath || !isNotFound) {
|
|
73
|
+
if (status >= 500) {
|
|
74
|
+
this.logger.error(`${logPrefix} : ${message}`, stack);
|
|
75
|
+
}
|
|
76
|
+
else {
|
|
77
|
+
this.logger.warn(`${logPrefix} : ${message}`);
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
if (this.remoteLogger && (!isInfrastructurePath || !isNotFound)) {
|
|
81
|
+
if (status >= 500) {
|
|
82
|
+
this.remoteLogger.error(`${logPrefix} (Unhandled)`, 'GlobalExceptionFilter', logMetadata);
|
|
83
|
+
}
|
|
84
|
+
else {
|
|
85
|
+
this.remoteLogger.warn(`${logPrefix} (Handled)`, 'GlobalExceptionFilter', logMetadata);
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
return response.status(status).json({
|
|
89
|
+
statusCode: status,
|
|
90
|
+
timestamp: new Date().toISOString(),
|
|
91
|
+
path: request.url,
|
|
92
|
+
message: message,
|
|
93
|
+
errorDetails,
|
|
94
|
+
...(process.env.NODE_ENV === 'development' && { stack }),
|
|
95
|
+
});
|
|
96
|
+
}
|
|
97
|
+
handleRpcException(exception, host) {
|
|
98
|
+
let message = 'Internal RPC error';
|
|
99
|
+
let code = 13;
|
|
100
|
+
if (exception instanceof microservices_1.RpcException) {
|
|
101
|
+
const error = exception.getError();
|
|
102
|
+
message = typeof error === 'string' ? error : error.message || JSON.stringify(error);
|
|
103
|
+
code = error.code || 13;
|
|
104
|
+
}
|
|
105
|
+
else if (exception instanceof common_1.HttpException) {
|
|
106
|
+
message = exception.message;
|
|
107
|
+
code = this.mapHttpStatusToGrpc(exception.getStatus());
|
|
108
|
+
}
|
|
109
|
+
else if (exception instanceof Error) {
|
|
110
|
+
message = exception.message;
|
|
111
|
+
}
|
|
112
|
+
this.logger.error(`RPC Exception [${code}]: ${message}`, exception.stack);
|
|
113
|
+
if (this.remoteLogger) {
|
|
114
|
+
this.remoteLogger.error(`RPC Exception [${code}]`, 'GlobalExceptionFilter', {
|
|
115
|
+
message,
|
|
116
|
+
code,
|
|
117
|
+
stack: exception.stack
|
|
118
|
+
});
|
|
119
|
+
}
|
|
120
|
+
return (0, rxjs_1.throwError)(() => ({
|
|
121
|
+
code,
|
|
122
|
+
message,
|
|
123
|
+
timestamp: new Date().toISOString(),
|
|
124
|
+
}));
|
|
125
|
+
}
|
|
126
|
+
mapGrpcStatusToHttp(code) {
|
|
127
|
+
switch (code) {
|
|
128
|
+
case 5: return common_1.HttpStatus.NOT_FOUND;
|
|
129
|
+
case 3: return common_1.HttpStatus.BAD_REQUEST;
|
|
130
|
+
case 16: return common_1.HttpStatus.UNAUTHORIZED;
|
|
131
|
+
case 7: return common_1.HttpStatus.FORBIDDEN;
|
|
132
|
+
case 6: return common_1.HttpStatus.CONFLICT;
|
|
133
|
+
case 8: return common_1.HttpStatus.TOO_MANY_REQUESTS;
|
|
134
|
+
case 1: return common_1.HttpStatus.REQUEST_TIMEOUT;
|
|
135
|
+
case 14: return common_1.HttpStatus.SERVICE_UNAVAILABLE;
|
|
136
|
+
default: return common_1.HttpStatus.INTERNAL_SERVER_ERROR;
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
mapHttpStatusToGrpc(status) {
|
|
140
|
+
switch (status) {
|
|
141
|
+
case common_1.HttpStatus.NOT_FOUND: return 5;
|
|
142
|
+
case common_1.HttpStatus.BAD_REQUEST: return 3;
|
|
143
|
+
case common_1.HttpStatus.UNAUTHORIZED: return 16;
|
|
144
|
+
case common_1.HttpStatus.FORBIDDEN: return 7;
|
|
145
|
+
case common_1.HttpStatus.CONFLICT: return 6;
|
|
146
|
+
case common_1.HttpStatus.TOO_MANY_REQUESTS: return 8;
|
|
147
|
+
default: return 13;
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
};
|
|
151
|
+
exports.GlobalExceptionFilter = GlobalExceptionFilter;
|
|
152
|
+
exports.GlobalExceptionFilter = GlobalExceptionFilter = GlobalExceptionFilter_1 = __decorate([
|
|
153
|
+
(0, common_1.Catch)(),
|
|
154
|
+
__metadata("design:paramtypes", [Object])
|
|
155
|
+
], GlobalExceptionFilter);
|
|
156
|
+
//# sourceMappingURL=global-exception.filter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"global-exception.filter.js","sourceRoot":"","sources":["../../src/filters/global-exception.filter.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './global-exception.filter';
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
14
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
|
+
};
|
|
16
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
+
__exportStar(require("./global-exception.filter"), exports);
|
|
18
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/filters/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,4DAA0C"}
|
package/dist/index.d.ts
CHANGED
|
@@ -12,7 +12,15 @@ export * from './utils/user.utils';
|
|
|
12
12
|
export * from './utils/app.utils';
|
|
13
13
|
export * from './utils/health.utils';
|
|
14
14
|
export * from './utils/tracing.utils';
|
|
15
|
+
export * from './utils/tracing.service';
|
|
16
|
+
export * from './utils/tracing.module';
|
|
17
|
+
export * from './utils/grpc-tracing.interceptor';
|
|
18
|
+
export * from './utils/http-tracing.interceptor';
|
|
19
|
+
export * from './utils/grpc-tracing-server.interceptor';
|
|
15
20
|
export * from './resilience/circuit-breaker.service';
|
|
16
21
|
export * from './resilience/resilience.module';
|
|
17
22
|
export * from './utils/filters';
|
|
18
23
|
export * from './utils/interceptors';
|
|
24
|
+
export * from './utils/app-logger';
|
|
25
|
+
export * from './middleware';
|
|
26
|
+
export * from './types/logger.interface';
|
package/dist/index.js
CHANGED
|
@@ -28,8 +28,16 @@ __exportStar(require("./utils/user.utils"), exports);
|
|
|
28
28
|
__exportStar(require("./utils/app.utils"), exports);
|
|
29
29
|
__exportStar(require("./utils/health.utils"), exports);
|
|
30
30
|
__exportStar(require("./utils/tracing.utils"), exports);
|
|
31
|
+
__exportStar(require("./utils/tracing.service"), exports);
|
|
32
|
+
__exportStar(require("./utils/tracing.module"), exports);
|
|
33
|
+
__exportStar(require("./utils/grpc-tracing.interceptor"), exports);
|
|
34
|
+
__exportStar(require("./utils/http-tracing.interceptor"), exports);
|
|
35
|
+
__exportStar(require("./utils/grpc-tracing-server.interceptor"), exports);
|
|
31
36
|
__exportStar(require("./resilience/circuit-breaker.service"), exports);
|
|
32
37
|
__exportStar(require("./resilience/resilience.module"), exports);
|
|
33
38
|
__exportStar(require("./utils/filters"), exports);
|
|
34
39
|
__exportStar(require("./utils/interceptors"), exports);
|
|
40
|
+
__exportStar(require("./utils/app-logger"), exports);
|
|
41
|
+
__exportStar(require("./middleware"), exports);
|
|
42
|
+
__exportStar(require("./types/logger.interface"), exports);
|
|
35
43
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,4BAA0B;AAC1B,0CAAwB;AACxB,8CAA4B;AAC5B,0CAAwB;AACxB,8CAA4B;AAC5B,wCAAsB;AACtB,qDAAmC;AACnC,qDAAmC;AACnC,+CAA6B;AAC7B,qDAAmC;AACnC,qDAAmC;AACnC,oDAAkC;AAClC,uDAAqC;AACrC,wDAAsC;AACtC,uEAAqD;AACrD,iEAA+C;AAC/C,kDAAgC;AAChC,uDAAqC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,4BAA0B;AAC1B,0CAAwB;AACxB,8CAA4B;AAC5B,0CAAwB;AACxB,8CAA4B;AAC5B,wCAAsB;AACtB,qDAAmC;AACnC,qDAAmC;AACnC,+CAA6B;AAC7B,qDAAmC;AACnC,qDAAmC;AACnC,oDAAkC;AAClC,uDAAqC;AACrC,wDAAsC;AACtC,0DAAwC;AACxC,yDAAuC;AACvC,mEAAiD;AACjD,mEAAiD;AACjD,0EAAwD;AACxD,uEAAqD;AACrD,iEAA+C;AAC/C,kDAAgC;AAChC,uDAAqC;AAErC,qDAAmC;AACnC,+CAA6B;AAC7B,2DAAyC"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
14
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
|
+
};
|
|
16
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
+
__exportStar(require("./prisma-logging.middleware"), exports);
|
|
18
|
+
__exportStar(require("./tracing.middleware"), exports);
|
|
19
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/middleware/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,8DAA4C;AAC5C,uDAAqC"}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.createPrismaLoggingMiddleware = createPrismaLoggingMiddleware;
|
|
4
|
+
function createPrismaLoggingMiddleware(logger, remoteLogger) {
|
|
5
|
+
const SLOW_QUERY_THRESHOLD_MS = 100;
|
|
6
|
+
return async (params, next) => {
|
|
7
|
+
const before = Date.now();
|
|
8
|
+
let result;
|
|
9
|
+
let error;
|
|
10
|
+
try {
|
|
11
|
+
result = await next(params);
|
|
12
|
+
}
|
|
13
|
+
catch (e) {
|
|
14
|
+
error = e;
|
|
15
|
+
throw e;
|
|
16
|
+
}
|
|
17
|
+
finally {
|
|
18
|
+
const after = Date.now();
|
|
19
|
+
const duration = after - before;
|
|
20
|
+
const model = params.model;
|
|
21
|
+
const action = params.action;
|
|
22
|
+
const queryName = `${model}.${action}`;
|
|
23
|
+
const logMetadata = {
|
|
24
|
+
model,
|
|
25
|
+
action,
|
|
26
|
+
duration,
|
|
27
|
+
args: params.args,
|
|
28
|
+
};
|
|
29
|
+
if (error) {
|
|
30
|
+
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
31
|
+
logger.error(`[Prisma Failure] ${queryName} - ${duration}ms | Error: ${errorMessage}`);
|
|
32
|
+
if (remoteLogger) {
|
|
33
|
+
remoteLogger.error(`Prisma Query Failed: ${queryName}`, 'PrismaClient', {
|
|
34
|
+
...logMetadata,
|
|
35
|
+
error: errorMessage,
|
|
36
|
+
});
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
else if (duration >= SLOW_QUERY_THRESHOLD_MS) {
|
|
40
|
+
logger.warn(`[Slow Query] ${queryName} took ${duration}ms`);
|
|
41
|
+
if (remoteLogger) {
|
|
42
|
+
remoteLogger.warn(`Slow Database Query: ${queryName}`, 'PrismaClient', logMetadata);
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
else {
|
|
46
|
+
logger.debug(`[Query] ${queryName} took ${duration}ms`);
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
return result;
|
|
50
|
+
};
|
|
51
|
+
}
|
|
52
|
+
//# sourceMappingURL=prisma-logging.middleware.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prisma-logging.middleware.js","sourceRoot":"","sources":["../../src/middleware/prisma-logging.middleware.ts"],"names":[],"mappings":";;AAQA,sEAmDC;AAnDD,SAAgB,6BAA6B,CACzC,MAAc,EACd,YAA4B;IAE5B,MAAM,uBAAuB,GAAG,GAAG,CAAC;IAEpC,OAAO,KAAK,EAAE,MAAW,EAAE,IAAmC,EAAE,EAAE;QAC9D,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QAC1B,IAAI,MAAW,CAAC;QAChB,IAAI,KAAU,CAAC;QAEf,IAAI,CAAC;YACD,MAAM,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,CAAC;QAChC,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACT,KAAK,GAAG,CAAC,CAAC;YACV,MAAM,CAAC,CAAC;QACZ,CAAC;gBAAS,CAAC;YACP,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;YACzB,MAAM,QAAQ,GAAG,KAAK,GAAG,MAAM,CAAC;YAChC,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC;YAC3B,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC;YAC7B,MAAM,SAAS,GAAG,GAAG,KAAK,IAAI,MAAM,EAAE,CAAC;YAEvC,MAAM,WAAW,GAAG;gBAChB,KAAK;gBACL,MAAM;gBACN,QAAQ;gBACR,IAAI,EAAE,MAAM,CAAC,IAAI;aACpB,CAAC;YAEF,IAAI,KAAK,EAAE,CAAC;gBACR,MAAM,YAAY,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;gBAC5E,MAAM,CAAC,KAAK,CAAC,oBAAoB,SAAS,MAAM,QAAQ,eAAe,YAAY,EAAE,CAAC,CAAC;gBACvF,IAAI,YAAY,EAAE,CAAC;oBACf,YAAY,CAAC,KAAK,CAAC,wBAAwB,SAAS,EAAE,EAAE,cAAc,EAAE;wBACpE,GAAG,WAAW;wBACd,KAAK,EAAE,YAAY;qBACtB,CAAC,CAAC;gBACP,CAAC;YACL,CAAC;iBAAM,IAAI,QAAQ,IAAI,uBAAuB,EAAE,CAAC;gBAC7C,MAAM,CAAC,IAAI,CAAC,gBAAgB,SAAS,SAAS,QAAQ,IAAI,CAAC,CAAC;gBAC5D,IAAI,YAAY,EAAE,CAAC;oBACf,YAAY,CAAC,IAAI,CAAC,wBAAwB,SAAS,EAAE,EAAE,cAAc,EAAE,WAAW,CAAC,CAAC;gBACxF,CAAC;YACL,CAAC;iBAAM,CAAC;gBAEJ,MAAM,CAAC,KAAK,CAAC,WAAW,SAAS,SAAS,QAAQ,IAAI,CAAC,CAAC;YAC5D,CAAC;QACL,CAAC;QACD,OAAO,MAAM,CAAC;IAClB,CAAC,CAAC;AACN,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { NestMiddleware } from '@nestjs/common';
|
|
2
|
+
import { Request, Response, NextFunction } from 'express';
|
|
3
|
+
import { TracingService } from '../utils/tracing.service';
|
|
4
|
+
export declare class TracingMiddleware implements NestMiddleware {
|
|
5
|
+
private readonly tracingService;
|
|
6
|
+
constructor(tracingService: TracingService);
|
|
7
|
+
use(req: Request, res: Response, next: NextFunction): void;
|
|
8
|
+
}
|