@zola_do/crud 0.2.18 → 0.3.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/shared/exceptions/global-exception.filter.d.ts +11 -0
- package/dist/shared/exceptions/global-exception.filter.js +28 -1
- package/dist/shared/exceptions/global-exception.filter.js.map +1 -1
- package/dist/shared/utils/crud-policy.presets.d.ts +4 -0
- package/dist/shared/utils/crud-policy.presets.js +30 -0
- package/dist/shared/utils/crud-policy.presets.js.map +1 -0
- package/dist/shared/utils/index.d.ts +1 -0
- package/dist/shared/utils/index.js +1 -0
- package/dist/shared/utils/index.js.map +1 -1
- package/package.json +1 -1
|
@@ -1,10 +1,21 @@
|
|
|
1
1
|
import { ArgumentsHost, ExceptionFilter } from '@nestjs/common';
|
|
2
2
|
export type GlobalExceptionFilterOptions = {
|
|
3
3
|
includePath?: boolean;
|
|
4
|
+
responseFormat?: 'default' | 'problem-details';
|
|
5
|
+
};
|
|
6
|
+
export type CrudProblemDetailsResponse = {
|
|
7
|
+
type: string;
|
|
8
|
+
title: string;
|
|
9
|
+
status: number;
|
|
10
|
+
detail: string | string[];
|
|
11
|
+
instance?: string;
|
|
12
|
+
timestamp: string;
|
|
4
13
|
};
|
|
5
14
|
export declare class GlobalExceptionFilter implements ExceptionFilter {
|
|
6
15
|
private readonly logger;
|
|
7
16
|
private readonly includePath;
|
|
17
|
+
private readonly responseFormat;
|
|
8
18
|
constructor(options?: GlobalExceptionFilterOptions);
|
|
9
19
|
catch(exception: any, host: ArgumentsHost): void;
|
|
20
|
+
private emitObservabilityException;
|
|
10
21
|
}
|
|
@@ -31,8 +31,10 @@ function normalizeHttpExceptionMessage(exception) {
|
|
|
31
31
|
}
|
|
32
32
|
let GlobalExceptionFilter = GlobalExceptionFilter_1 = class GlobalExceptionFilter {
|
|
33
33
|
constructor(options = {}) {
|
|
34
|
+
var _a;
|
|
34
35
|
this.logger = new common_1.Logger(GlobalExceptionFilter_1.name);
|
|
35
36
|
this.includePath = options.includePath !== false;
|
|
37
|
+
this.responseFormat = (_a = options.responseFormat) !== null && _a !== void 0 ? _a : 'default';
|
|
36
38
|
}
|
|
37
39
|
catch(exception, host) {
|
|
38
40
|
var _a, _b, _c;
|
|
@@ -66,10 +68,35 @@ let GlobalExceptionFilter = GlobalExceptionFilter_1 = class GlobalExceptionFilte
|
|
|
66
68
|
responseData.path = request.url;
|
|
67
69
|
}
|
|
68
70
|
const err = exception instanceof Error ? exception : undefined;
|
|
69
|
-
|
|
71
|
+
const logPayload = Object.assign(Object.assign({}, responseData), { exceptionMessage: err === null || err === void 0 ? void 0 : err.message, stack: err === null || err === void 0 ? void 0 : err.stack, name: err === null || err === void 0 ? void 0 : err.name, clientIp: (0, get_client_ip_helper_1.getClientIp)(request), remoteAddress: (_b = (_a = request.socket) === null || _a === void 0 ? void 0 : _a.remoteAddress) !== null && _b !== void 0 ? _b : (_c = request.connection) === null || _c === void 0 ? void 0 : _c.remoteAddress });
|
|
72
|
+
this.logger.error(logPayload);
|
|
73
|
+
this.emitObservabilityException(logPayload);
|
|
74
|
+
if (this.responseFormat === 'problem-details') {
|
|
75
|
+
const title = Array.isArray(message) ? message[0] : message;
|
|
76
|
+
const problemDetails = {
|
|
77
|
+
type: `https://httpstatuses.com/${status}`,
|
|
78
|
+
title: title || 'HTTP error',
|
|
79
|
+
status,
|
|
80
|
+
detail: message,
|
|
81
|
+
timestamp: responseData.timestamp,
|
|
82
|
+
};
|
|
83
|
+
if (this.includePath) {
|
|
84
|
+
problemDetails.instance = request.url;
|
|
85
|
+
}
|
|
86
|
+
response.status(status).json(problemDetails);
|
|
87
|
+
return;
|
|
88
|
+
}
|
|
70
89
|
response.status(status).json(responseData);
|
|
71
90
|
return;
|
|
72
91
|
}
|
|
92
|
+
emitObservabilityException(payload) {
|
|
93
|
+
try {
|
|
94
|
+
const { emitExceptionLog } = require('@zola_do/observability');
|
|
95
|
+
emitExceptionLog(payload);
|
|
96
|
+
}
|
|
97
|
+
catch (_a) {
|
|
98
|
+
}
|
|
99
|
+
}
|
|
73
100
|
};
|
|
74
101
|
exports.GlobalExceptionFilter = GlobalExceptionFilter;
|
|
75
102
|
exports.GlobalExceptionFilter = GlobalExceptionFilter = GlobalExceptionFilter_1 = __decorate([
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"global-exception.filter.js","sourceRoot":"","sources":["../../../src/shared/exceptions/global-exception.filter.ts"],"names":[],"mappings":";;;;;;;;;;;;;AAAA,2CAOwB;AACxB,wEAA4D;
|
|
1
|
+
{"version":3,"file":"global-exception.filter.js","sourceRoot":"","sources":["../../../src/shared/exceptions/global-exception.filter.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import { CrudPolicy } from '../types';
|
|
2
|
+
export declare function tenantPolicy(field?: string): CrudPolicy;
|
|
3
|
+
export declare function ownerPolicy(field?: string, userField?: string): CrudPolicy;
|
|
4
|
+
export declare function adminOrOwnerPolicy(ownerField?: string, userField?: string, adminField?: string): CrudPolicy;
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.tenantPolicy = tenantPolicy;
|
|
4
|
+
exports.ownerPolicy = ownerPolicy;
|
|
5
|
+
exports.adminOrOwnerPolicy = adminOrOwnerPolicy;
|
|
6
|
+
function tenantPolicy(field = 'tenantId') {
|
|
7
|
+
return {
|
|
8
|
+
scopeQuery: ({ req }) => { var _a; return ({ [field]: (_a = req === null || req === void 0 ? void 0 : req.user) === null || _a === void 0 ? void 0 : _a[field] }); },
|
|
9
|
+
canRead: ({ req }, entity) => { var _a; return !entity || entity[field] === ((_a = req === null || req === void 0 ? void 0 : req.user) === null || _a === void 0 ? void 0 : _a[field]); },
|
|
10
|
+
canUpdate: ({ req }, entity) => { var _a; return (entity === null || entity === void 0 ? void 0 : entity[field]) === ((_a = req === null || req === void 0 ? void 0 : req.user) === null || _a === void 0 ? void 0 : _a[field]); },
|
|
11
|
+
canDelete: ({ req }, entity) => { var _a; return (entity === null || entity === void 0 ? void 0 : entity[field]) === ((_a = req === null || req === void 0 ? void 0 : req.user) === null || _a === void 0 ? void 0 : _a[field]); },
|
|
12
|
+
};
|
|
13
|
+
}
|
|
14
|
+
function ownerPolicy(field = 'ownerId', userField = 'id') {
|
|
15
|
+
return {
|
|
16
|
+
scopeQuery: ({ req }) => { var _a; return ({ [field]: (_a = req === null || req === void 0 ? void 0 : req.user) === null || _a === void 0 ? void 0 : _a[userField] }); },
|
|
17
|
+
canRead: ({ req }, entity) => { var _a; return !entity || entity[field] === ((_a = req === null || req === void 0 ? void 0 : req.user) === null || _a === void 0 ? void 0 : _a[userField]); },
|
|
18
|
+
canUpdate: ({ req }, entity) => { var _a; return (entity === null || entity === void 0 ? void 0 : entity[field]) === ((_a = req === null || req === void 0 ? void 0 : req.user) === null || _a === void 0 ? void 0 : _a[userField]); },
|
|
19
|
+
canDelete: ({ req }, entity) => { var _a; return (entity === null || entity === void 0 ? void 0 : entity[field]) === ((_a = req === null || req === void 0 ? void 0 : req.user) === null || _a === void 0 ? void 0 : _a[userField]); },
|
|
20
|
+
};
|
|
21
|
+
}
|
|
22
|
+
function adminOrOwnerPolicy(ownerField = 'ownerId', userField = 'id', adminField = 'isAdmin') {
|
|
23
|
+
const isOwnerOrAdmin = ({ req }, entity) => { var _a, _b; return ((_a = req === null || req === void 0 ? void 0 : req.user) === null || _a === void 0 ? void 0 : _a[adminField]) === true || (entity === null || entity === void 0 ? void 0 : entity[ownerField]) === ((_b = req === null || req === void 0 ? void 0 : req.user) === null || _b === void 0 ? void 0 : _b[userField]); };
|
|
24
|
+
return {
|
|
25
|
+
canRead: isOwnerOrAdmin,
|
|
26
|
+
canUpdate: isOwnerOrAdmin,
|
|
27
|
+
canDelete: isOwnerOrAdmin,
|
|
28
|
+
};
|
|
29
|
+
}
|
|
30
|
+
//# sourceMappingURL=crud-policy.presets.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"crud-policy.presets.js","sourceRoot":"","sources":["../../../src/shared/utils/crud-policy.presets.ts"],"names":[],"mappings":"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"}
|
|
@@ -23,4 +23,5 @@ __exportStar(require("./in-memory-idempotency.store"), exports);
|
|
|
23
23
|
__exportStar(require("./redis-idempotency.store"), exports);
|
|
24
24
|
__exportStar(require("./transactional-repository.helper"), exports);
|
|
25
25
|
__exportStar(require("./crud-transaction.decorators"), exports);
|
|
26
|
+
__exportStar(require("./crud-policy.presets"), exports);
|
|
26
27
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/shared/utils/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,wDAAsC;AACtC,iDAA+B;AAC/B,sDAAoC;AACpC,wDAAsC;AACtC,2DAAyC;AACzC,gEAA8C;AAC9C,4DAA0C;AAC1C,oEAAkD;AAClD,gEAA8C"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/shared/utils/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,wDAAsC;AACtC,iDAA+B;AAC/B,sDAAoC;AACpC,wDAAsC;AACtC,2DAAyC;AACzC,gEAA8C;AAC9C,4DAA0C;AAC1C,oEAAkD;AAClD,gEAA8C;AAC9C,wDAAsC"}
|