@xfilecom/core-sdk 1.3.23
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 +664 -0
- package/dist/core.module.d.ts +39 -0
- package/dist/core.module.js +188 -0
- package/dist/core.module.js.map +1 -0
- package/dist/database/database.constants.d.ts +2 -0
- package/dist/database/database.constants.js +6 -0
- package/dist/database/database.constants.js.map +1 -0
- package/dist/database/database.module.d.ts +19 -0
- package/dist/database/database.module.js +56 -0
- package/dist/database/database.module.js.map +1 -0
- package/dist/database/database.query.d.ts +103 -0
- package/dist/database/database.query.example.d.ts +36 -0
- package/dist/database/database.query.example.js +148 -0
- package/dist/database/database.query.example.js.map +1 -0
- package/dist/database/database.query.js +369 -0
- package/dist/database/database.query.js.map +1 -0
- package/dist/database/database.service.d.ts +18 -0
- package/dist/database/database.service.js +110 -0
- package/dist/database/database.service.js.map +1 -0
- package/dist/database/example-usage.d.ts +0 -0
- package/dist/database/example-usage.js +1 -0
- package/dist/database/example-usage.js.map +1 -0
- package/dist/decorators/public.decorator.d.ts +2 -0
- package/dist/decorators/public.decorator.js +8 -0
- package/dist/decorators/public.decorator.js.map +1 -0
- package/dist/decorators/roles.decorator.d.ts +2 -0
- package/dist/decorators/roles.decorator.js +8 -0
- package/dist/decorators/roles.decorator.js.map +1 -0
- package/dist/decorators/user.decorator.d.ts +7 -0
- package/dist/decorators/user.decorator.js +10 -0
- package/dist/decorators/user.decorator.js.map +1 -0
- package/dist/filters/exception.filter.d.ts +36 -0
- package/dist/filters/exception.filter.js +201 -0
- package/dist/filters/exception.filter.js.map +1 -0
- package/dist/guards/jwt-auth.guard.d.ts +14 -0
- package/dist/guards/jwt-auth.guard.js +103 -0
- package/dist/guards/jwt-auth.guard.js.map +1 -0
- package/dist/guards/roles.guard.d.ts +7 -0
- package/dist/guards/roles.guard.js +47 -0
- package/dist/guards/roles.guard.js.map +1 -0
- package/dist/index.d.ts +29 -0
- package/dist/index.js +91 -0
- package/dist/index.js.map +1 -0
- package/dist/interceptors/database-check.interceptor.d.ts +12 -0
- package/dist/interceptors/database-check.interceptor.js +60 -0
- package/dist/interceptors/database-check.interceptor.js.map +1 -0
- package/dist/interceptors/error-handling.interceptor.d.ts +8 -0
- package/dist/interceptors/error-handling.interceptor.js +33 -0
- package/dist/interceptors/error-handling.interceptor.js.map +1 -0
- package/dist/interceptors/logging.interceptor.d.ts +21 -0
- package/dist/interceptors/logging.interceptor.js +167 -0
- package/dist/interceptors/logging.interceptor.js.map +1 -0
- package/dist/interceptors/response-transform.interceptor.d.ts +5 -0
- package/dist/interceptors/response-transform.interceptor.js +30 -0
- package/dist/interceptors/response-transform.interceptor.js.map +1 -0
- package/dist/utils/auth.helpers.d.ts +19 -0
- package/dist/utils/auth.helpers.js +77 -0
- package/dist/utils/auth.helpers.js.map +1 -0
- package/dist/utils/config-loader.utils.d.ts +22 -0
- package/dist/utils/config-loader.utils.js +77 -0
- package/dist/utils/config-loader.utils.js.map +1 -0
- package/dist/utils/config.validator.d.ts +13 -0
- package/dist/utils/config.validator.js +82 -0
- package/dist/utils/config.validator.js.map +1 -0
- package/dist/utils/controller.helpers.d.ts +58 -0
- package/dist/utils/controller.helpers.js +104 -0
- package/dist/utils/controller.helpers.js.map +1 -0
- package/dist/utils/crypto.utils.d.ts +12 -0
- package/dist/utils/crypto.utils.js +53 -0
- package/dist/utils/crypto.utils.js.map +1 -0
- package/dist/utils/email-hash.utils.d.ts +7 -0
- package/dist/utils/email-hash.utils.js +42 -0
- package/dist/utils/email-hash.utils.js.map +1 -0
- package/dist/utils/env.utils.d.ts +8 -0
- package/dist/utils/env.utils.js +27 -0
- package/dist/utils/env.utils.js.map +1 -0
- package/dist/utils/error.utils.d.ts +6 -0
- package/dist/utils/error.utils.js +65 -0
- package/dist/utils/error.utils.js.map +1 -0
- package/dist/utils/hash-verification.utils.d.ts +35 -0
- package/dist/utils/hash-verification.utils.js +133 -0
- package/dist/utils/hash-verification.utils.js.map +1 -0
- package/dist/utils/logger.helpers.d.ts +71 -0
- package/dist/utils/logger.helpers.js +293 -0
- package/dist/utils/logger.helpers.js.map +1 -0
- package/dist/utils/logging.config.d.ts +6 -0
- package/dist/utils/logging.config.js +42 -0
- package/dist/utils/logging.config.js.map +1 -0
- package/dist/utils/service.helpers.d.ts +22 -0
- package/dist/utils/service.helpers.js +73 -0
- package/dist/utils/service.helpers.js.map +1 -0
- package/dist/utils/yaml-config.loader.d.ts +15 -0
- package/dist/utils/yaml-config.loader.js +219 -0
- package/dist/utils/yaml-config.loader.js.map +1 -0
- package/package.json +47 -0
- package/scripts/publish-to-gitlab.mjs +209 -0
|
@@ -0,0 +1,201 @@
|
|
|
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 AllExceptionsFilter_1;
|
|
12
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
13
|
+
exports.AllExceptionsFilter = void 0;
|
|
14
|
+
const common_1 = require("@nestjs/common");
|
|
15
|
+
const error_utils_1 = require("../utils/error.utils");
|
|
16
|
+
let AllExceptionsFilter = AllExceptionsFilter_1 = class AllExceptionsFilter {
|
|
17
|
+
constructor(options = {}) {
|
|
18
|
+
this.logger = new common_1.Logger(AllExceptionsFilter_1.name);
|
|
19
|
+
this.errorUtils = new error_utils_1.ErrorUtils();
|
|
20
|
+
this.options = {
|
|
21
|
+
cors: {
|
|
22
|
+
enabled: options.cors?.enabled ?? true,
|
|
23
|
+
allowedOrigins: options.cors?.allowedOrigins || [
|
|
24
|
+
'http://localhost:3001',
|
|
25
|
+
'http://localhost:5173',
|
|
26
|
+
'http://localhost:5174',
|
|
27
|
+
'http://localhost:5175',
|
|
28
|
+
'http://localhost:5176',
|
|
29
|
+
...(process.env.FRONTEND_URL?.split(',') || []),
|
|
30
|
+
],
|
|
31
|
+
allowAllOriginsInDev: options.cors?.allowAllOriginsInDev ?? true,
|
|
32
|
+
},
|
|
33
|
+
meta: {
|
|
34
|
+
enabled: options.meta?.enabled ?? false,
|
|
35
|
+
includeTimestamp: options.meta?.includeTimestamp ?? true,
|
|
36
|
+
includePath: options.meta?.includePath ?? true,
|
|
37
|
+
includeMethod: options.meta?.includeMethod ?? true,
|
|
38
|
+
},
|
|
39
|
+
logging: {
|
|
40
|
+
enabled: options.logging?.enabled ?? true,
|
|
41
|
+
level: options.logging?.level || 'warn',
|
|
42
|
+
includeStack: options.logging?.includeStack ?? true,
|
|
43
|
+
debug: options.logging?.debug ?? false,
|
|
44
|
+
},
|
|
45
|
+
responseFormat: {
|
|
46
|
+
includeDetails: options.responseFormat?.includeDetails ?? false,
|
|
47
|
+
},
|
|
48
|
+
filterStaticFiles: options.filterStaticFiles ?? true,
|
|
49
|
+
};
|
|
50
|
+
}
|
|
51
|
+
catch(exception, host) {
|
|
52
|
+
const ctx = host.switchToHttp();
|
|
53
|
+
const response = ctx.getResponse();
|
|
54
|
+
const request = ctx.getRequest();
|
|
55
|
+
if (this.options.logging.debug) {
|
|
56
|
+
this.logger.debug(`[AllExceptionsFilter] Caught exception for ${request.method} ${request.url}`, {
|
|
57
|
+
exceptionType: exception?.constructor?.name,
|
|
58
|
+
isHttpException: exception instanceof common_1.HttpException,
|
|
59
|
+
isError: exception instanceof Error,
|
|
60
|
+
});
|
|
61
|
+
}
|
|
62
|
+
if (this.options.cors.enabled && request.method === 'OPTIONS') {
|
|
63
|
+
return this.handleOptionsRequest(request, response);
|
|
64
|
+
}
|
|
65
|
+
const status = exception instanceof common_1.HttpException
|
|
66
|
+
? exception.getStatus()
|
|
67
|
+
: common_1.HttpStatus.INTERNAL_SERVER_ERROR;
|
|
68
|
+
if (this.options.filterStaticFiles && this.isStaticFile404(request, status)) {
|
|
69
|
+
response.status(status).json(this.errorUtils.fromException(exception));
|
|
70
|
+
return;
|
|
71
|
+
}
|
|
72
|
+
const errorDto = this.errorUtils.fromException(exception);
|
|
73
|
+
if (this.options.meta.enabled) {
|
|
74
|
+
errorDto.meta = this.buildMeta(request);
|
|
75
|
+
}
|
|
76
|
+
if (this.options.responseFormat.includeDetails) {
|
|
77
|
+
const message = this.extractMessage(errorDto);
|
|
78
|
+
errorDto.error = {
|
|
79
|
+
message,
|
|
80
|
+
details: Array.isArray(message) ? message : [message],
|
|
81
|
+
};
|
|
82
|
+
}
|
|
83
|
+
if (this.options.logging.enabled) {
|
|
84
|
+
this.logError(exception, request, errorDto, status);
|
|
85
|
+
}
|
|
86
|
+
if (response.headersSent) {
|
|
87
|
+
this.logger.warn(`Response already sent for ${request.method} ${request.url}, cannot send error response`);
|
|
88
|
+
return;
|
|
89
|
+
}
|
|
90
|
+
try {
|
|
91
|
+
if (this.options.logging.debug) {
|
|
92
|
+
this.logger.debug(`[AllExceptionsFilter] Sending error response:`, {
|
|
93
|
+
status: errorDto.code,
|
|
94
|
+
message: this.extractMessage(errorDto),
|
|
95
|
+
path: request.url,
|
|
96
|
+
method: request.method,
|
|
97
|
+
});
|
|
98
|
+
}
|
|
99
|
+
response.status(errorDto.code).json(errorDto);
|
|
100
|
+
}
|
|
101
|
+
catch (error) {
|
|
102
|
+
this.logger.error(`Failed to send error response for ${request.method} ${request.url}:`, error);
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
handleOptionsRequest(request, response) {
|
|
106
|
+
const origin = request.headers.origin;
|
|
107
|
+
const allowedOrigin = this.options.cors.allowAllOriginsInDev && process.env.NODE_ENV !== 'production'
|
|
108
|
+
? origin || '*'
|
|
109
|
+
: origin && this.options.cors.allowedOrigins.includes(origin)
|
|
110
|
+
? origin
|
|
111
|
+
: this.options.cors.allowedOrigins[0] || '*';
|
|
112
|
+
response.status(common_1.HttpStatus.OK);
|
|
113
|
+
response.setHeader('Access-Control-Allow-Origin', allowedOrigin);
|
|
114
|
+
response.setHeader('Access-Control-Allow-Methods', 'GET, POST, PUT, DELETE, PATCH, OPTIONS, HEAD');
|
|
115
|
+
response.setHeader('Access-Control-Allow-Headers', 'Content-Type, Authorization, X-Requested-With, Accept, Origin, Access-Control-Request-Method, Access-Control-Request-Headers');
|
|
116
|
+
response.setHeader('Access-Control-Allow-Credentials', 'true');
|
|
117
|
+
response.setHeader('Access-Control-Max-Age', '86400');
|
|
118
|
+
response.end();
|
|
119
|
+
}
|
|
120
|
+
isStaticFile404(request, status) {
|
|
121
|
+
if (status !== common_1.HttpStatus.NOT_FOUND) {
|
|
122
|
+
return false;
|
|
123
|
+
}
|
|
124
|
+
const url = request.url;
|
|
125
|
+
return (url === '/favicon.ico' ||
|
|
126
|
+
url.includes('.ico') ||
|
|
127
|
+
url.includes('.png') ||
|
|
128
|
+
url.includes('.jpg') ||
|
|
129
|
+
url.includes('.jpeg') ||
|
|
130
|
+
url.includes('.gif') ||
|
|
131
|
+
url.includes('.svg') ||
|
|
132
|
+
url.includes('.css') ||
|
|
133
|
+
url.includes('.js') ||
|
|
134
|
+
url.includes('.woff') ||
|
|
135
|
+
url.includes('.woff2') ||
|
|
136
|
+
url.includes('.ttf'));
|
|
137
|
+
}
|
|
138
|
+
buildMeta(request) {
|
|
139
|
+
const meta = {};
|
|
140
|
+
if (this.options.meta.includeTimestamp) {
|
|
141
|
+
meta.timestamp = new Date().toISOString();
|
|
142
|
+
}
|
|
143
|
+
if (this.options.meta.includePath) {
|
|
144
|
+
meta.path = request.url;
|
|
145
|
+
}
|
|
146
|
+
if (this.options.meta.includeMethod) {
|
|
147
|
+
meta.method = request.method;
|
|
148
|
+
}
|
|
149
|
+
return meta;
|
|
150
|
+
}
|
|
151
|
+
extractMessage(errorDto) {
|
|
152
|
+
if (!errorDto.error) {
|
|
153
|
+
return 'Internal server error';
|
|
154
|
+
}
|
|
155
|
+
const message = errorDto.error.message;
|
|
156
|
+
if (typeof message === 'string') {
|
|
157
|
+
return message;
|
|
158
|
+
}
|
|
159
|
+
else if (Array.isArray(message)) {
|
|
160
|
+
return message;
|
|
161
|
+
}
|
|
162
|
+
else if (typeof message === 'object') {
|
|
163
|
+
if ('message' in message && typeof message.message === 'string') {
|
|
164
|
+
return message.message;
|
|
165
|
+
}
|
|
166
|
+
return JSON.stringify(message);
|
|
167
|
+
}
|
|
168
|
+
return String(message);
|
|
169
|
+
}
|
|
170
|
+
logError(exception, request, errorDto, status) {
|
|
171
|
+
const errorLog = {
|
|
172
|
+
status: errorDto.code,
|
|
173
|
+
message: this.extractMessage(errorDto),
|
|
174
|
+
path: request.url,
|
|
175
|
+
method: request.method,
|
|
176
|
+
timestamp: new Date().toISOString(),
|
|
177
|
+
};
|
|
178
|
+
if (status >= common_1.HttpStatus.INTERNAL_SERVER_ERROR) {
|
|
179
|
+
const logData = { ...errorLog };
|
|
180
|
+
if (this.options.logging.includeStack && exception instanceof Error) {
|
|
181
|
+
logData.exception = exception.stack;
|
|
182
|
+
}
|
|
183
|
+
else {
|
|
184
|
+
logData.exception = exception;
|
|
185
|
+
}
|
|
186
|
+
this.logger.error(`[${request.method}] ${request.url}`, logData);
|
|
187
|
+
}
|
|
188
|
+
else if (status === common_1.HttpStatus.NOT_FOUND) {
|
|
189
|
+
this.logger.debug(`[${request.method}] ${request.url}`, errorLog);
|
|
190
|
+
}
|
|
191
|
+
else {
|
|
192
|
+
this.logger.warn(`[${request.method}] ${request.url}`, errorLog);
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
};
|
|
196
|
+
exports.AllExceptionsFilter = AllExceptionsFilter;
|
|
197
|
+
exports.AllExceptionsFilter = AllExceptionsFilter = AllExceptionsFilter_1 = __decorate([
|
|
198
|
+
(0, common_1.Catch)(),
|
|
199
|
+
__metadata("design:paramtypes", [Object])
|
|
200
|
+
], AllExceptionsFilter);
|
|
201
|
+
//# sourceMappingURL=exception.filter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"exception.filter.js","sourceRoot":"","sources":["../../src/filters/exception.filter.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { ExecutionContext, CanActivate } from '@nestjs/common';
|
|
2
|
+
import { Reflector } from '@nestjs/core';
|
|
3
|
+
export declare class JwtAuthGuard implements CanActivate {
|
|
4
|
+
private reflector;
|
|
5
|
+
private readonly logger;
|
|
6
|
+
private passportJwtStrategy;
|
|
7
|
+
constructor(reflector: Reflector);
|
|
8
|
+
private loadPassportJwtStrategy;
|
|
9
|
+
canActivate(context: ExecutionContext): boolean | Promise<boolean>;
|
|
10
|
+
private isHttpContext;
|
|
11
|
+
private validateHttpRequest;
|
|
12
|
+
private extractTokenFromHeader;
|
|
13
|
+
handleRequest(err: any, user: any, info: any): any;
|
|
14
|
+
}
|
|
@@ -0,0 +1,103 @@
|
|
|
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 JwtAuthGuard_1;
|
|
12
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
13
|
+
exports.JwtAuthGuard = void 0;
|
|
14
|
+
const common_1 = require("@nestjs/common");
|
|
15
|
+
const core_1 = require("@nestjs/core");
|
|
16
|
+
const public_decorator_1 = require("../decorators/public.decorator");
|
|
17
|
+
let JwtAuthGuard = JwtAuthGuard_1 = class JwtAuthGuard {
|
|
18
|
+
constructor(reflector) {
|
|
19
|
+
this.reflector = reflector;
|
|
20
|
+
this.logger = new common_1.Logger(JwtAuthGuard_1.name);
|
|
21
|
+
this.passportJwtStrategy = null;
|
|
22
|
+
this.loadPassportJwtStrategy();
|
|
23
|
+
}
|
|
24
|
+
loadPassportJwtStrategy() {
|
|
25
|
+
try {
|
|
26
|
+
const passportJwt = require('passport-jwt');
|
|
27
|
+
this.passportJwtStrategy = passportJwt.Strategy;
|
|
28
|
+
}
|
|
29
|
+
catch (e) {
|
|
30
|
+
this.logger.warn('passport-jwt not found. JWT authentication will be skipped. ' +
|
|
31
|
+
'Install passport-jwt and @nestjs/passport to enable JWT authentication.');
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
canActivate(context) {
|
|
35
|
+
const isPublic = this.reflector.getAllAndOverride(public_decorator_1.IS_PUBLIC_KEY, [
|
|
36
|
+
context.getHandler(),
|
|
37
|
+
context.getClass(),
|
|
38
|
+
]);
|
|
39
|
+
if (isPublic) {
|
|
40
|
+
return true;
|
|
41
|
+
}
|
|
42
|
+
if (!this.passportJwtStrategy) {
|
|
43
|
+
this.logger.warn('JWT authentication is not configured. Endpoint is accessible without authentication. ' +
|
|
44
|
+
'This should not happen in production.');
|
|
45
|
+
return true;
|
|
46
|
+
}
|
|
47
|
+
if (this.isHttpContext(context)) {
|
|
48
|
+
return this.validateHttpRequest(context);
|
|
49
|
+
}
|
|
50
|
+
return true;
|
|
51
|
+
}
|
|
52
|
+
isHttpContext(context) {
|
|
53
|
+
return context.getType() === 'http';
|
|
54
|
+
}
|
|
55
|
+
async validateHttpRequest(context) {
|
|
56
|
+
const request = context.switchToHttp().getRequest();
|
|
57
|
+
const token = this.extractTokenFromHeader(request);
|
|
58
|
+
if (!token) {
|
|
59
|
+
throw new common_1.UnauthorizedException('No token provided');
|
|
60
|
+
}
|
|
61
|
+
try {
|
|
62
|
+
const jwtSecret = process.env.JWT_SECRET;
|
|
63
|
+
if (!jwtSecret) {
|
|
64
|
+
this.logger.warn('JWT_SECRET is not set. JWT validation will fail. ' +
|
|
65
|
+
'Set JWT_SECRET environment variable to enable JWT authentication.');
|
|
66
|
+
return true;
|
|
67
|
+
}
|
|
68
|
+
const jwt = require('jsonwebtoken');
|
|
69
|
+
const decoded = jwt.verify(token, jwtSecret);
|
|
70
|
+
request.user = decoded;
|
|
71
|
+
return true;
|
|
72
|
+
}
|
|
73
|
+
catch (error) {
|
|
74
|
+
if (error.name === 'JsonWebTokenError') {
|
|
75
|
+
throw new common_1.UnauthorizedException('Invalid token');
|
|
76
|
+
}
|
|
77
|
+
if (error.name === 'TokenExpiredError') {
|
|
78
|
+
throw new common_1.UnauthorizedException('Token expired');
|
|
79
|
+
}
|
|
80
|
+
throw new common_1.UnauthorizedException('Token validation failed');
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
extractTokenFromHeader(request) {
|
|
84
|
+
const authHeader = request.headers?.authorization;
|
|
85
|
+
if (!authHeader) {
|
|
86
|
+
return null;
|
|
87
|
+
}
|
|
88
|
+
const [type, token] = authHeader.split(' ') ?? [];
|
|
89
|
+
return type === 'Bearer' ? token : null;
|
|
90
|
+
}
|
|
91
|
+
handleRequest(err, user, info) {
|
|
92
|
+
if (err || !user) {
|
|
93
|
+
throw err || new common_1.UnauthorizedException('Invalid or expired token');
|
|
94
|
+
}
|
|
95
|
+
return user;
|
|
96
|
+
}
|
|
97
|
+
};
|
|
98
|
+
exports.JwtAuthGuard = JwtAuthGuard;
|
|
99
|
+
exports.JwtAuthGuard = JwtAuthGuard = JwtAuthGuard_1 = __decorate([
|
|
100
|
+
(0, common_1.Injectable)(),
|
|
101
|
+
__metadata("design:paramtypes", [core_1.Reflector])
|
|
102
|
+
], JwtAuthGuard);
|
|
103
|
+
//# sourceMappingURL=jwt-auth.guard.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"jwt-auth.guard.js","sourceRoot":"","sources":["../../src/guards/jwt-auth.guard.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { CanActivate, ExecutionContext } from '@nestjs/common';
|
|
2
|
+
import { Reflector } from '@nestjs/core';
|
|
3
|
+
export declare class RolesGuard implements CanActivate {
|
|
4
|
+
private reflector;
|
|
5
|
+
constructor(reflector: Reflector);
|
|
6
|
+
canActivate(context: ExecutionContext): boolean;
|
|
7
|
+
}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
3
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
4
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
5
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
6
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
7
|
+
};
|
|
8
|
+
var __metadata = (this && this.__metadata) || function (k, v) {
|
|
9
|
+
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
10
|
+
};
|
|
11
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
+
exports.RolesGuard = void 0;
|
|
13
|
+
const common_1 = require("@nestjs/common");
|
|
14
|
+
const core_1 = require("@nestjs/core");
|
|
15
|
+
const roles_decorator_1 = require("../decorators/roles.decorator");
|
|
16
|
+
const ROLE_KEY = 'role';
|
|
17
|
+
let RolesGuard = class RolesGuard {
|
|
18
|
+
constructor(reflector) {
|
|
19
|
+
this.reflector = reflector;
|
|
20
|
+
}
|
|
21
|
+
canActivate(context) {
|
|
22
|
+
const requiredRoles = this.reflector.getAllAndOverride(roles_decorator_1.ROLES_KEY, [
|
|
23
|
+
context.getHandler(),
|
|
24
|
+
context.getClass(),
|
|
25
|
+
]);
|
|
26
|
+
if (!requiredRoles?.length) {
|
|
27
|
+
return true;
|
|
28
|
+
}
|
|
29
|
+
const request = context.switchToHttp().getRequest();
|
|
30
|
+
const user = request?.user;
|
|
31
|
+
const userRole = user?.[ROLE_KEY];
|
|
32
|
+
if (userRole == null) {
|
|
33
|
+
throw new common_1.ForbiddenException('User role not found');
|
|
34
|
+
}
|
|
35
|
+
const allowed = requiredRoles.some((r) => String(r) === String(userRole));
|
|
36
|
+
if (!allowed) {
|
|
37
|
+
throw new common_1.ForbiddenException(`Required role(s): ${requiredRoles.join(', ')}. Current: ${userRole}`);
|
|
38
|
+
}
|
|
39
|
+
return true;
|
|
40
|
+
}
|
|
41
|
+
};
|
|
42
|
+
exports.RolesGuard = RolesGuard;
|
|
43
|
+
exports.RolesGuard = RolesGuard = __decorate([
|
|
44
|
+
(0, common_1.Injectable)(),
|
|
45
|
+
__metadata("design:paramtypes", [core_1.Reflector])
|
|
46
|
+
], RolesGuard);
|
|
47
|
+
//# sourceMappingURL=roles.guard.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"roles.guard.js","sourceRoot":"","sources":["../../src/guards/roles.guard.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,2CAKwB;AACxB,uCAAyC;AACzC,mEAA0D;AAG1D,MAAM,QAAQ,GAAG,MAAM,CAAC;AAmBjB,IAAM,UAAU,GAAhB,MAAM,UAAU;IACrB,YAAoB,SAAoB;QAApB,cAAS,GAAT,SAAS,CAAW;IAAG,CAAC;IAE5C,WAAW,CAAC,OAAyB;QACnC,MAAM,aAAa,GAAG,IAAI,CAAC,SAAS,CAAC,iBAAiB,CAAW,2BAAS,EAAE;YAC1E,OAAO,CAAC,UAAU,EAAE;YACpB,OAAO,CAAC,QAAQ,EAAE;SACnB,CAAC,CAAC;QAEH,IAAI,CAAC,aAAa,EAAE,MAAM,EAAE,CAAC;YAC3B,OAAO,IAAI,CAAC;QACd,CAAC;QAED,MAAM,OAAO,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC,UAAU,EAAE,CAAC;QACpD,MAAM,IAAI,GAAG,OAAO,EAAE,IAAI,CAAC;QAC3B,MAAM,QAAQ,GAAG,IAAI,EAAE,CAAC,QAAQ,CAAC,CAAC;QAElC,IAAI,QAAQ,IAAI,IAAI,EAAE,CAAC;YACrB,MAAM,IAAI,2BAAkB,CAAC,qBAAqB,CAAC,CAAC;QACtD,CAAC;QAED,MAAM,OAAO,GAAG,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC;QAC1E,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,MAAM,IAAI,2BAAkB,CAC1B,qBAAqB,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,cAAc,QAAQ,EAAE,CACtE,CAAC;QACJ,CAAC;QAED,OAAO,IAAI,CAAC;IACd,CAAC;CACF,CAAA;AA9BY,gCAAU;qBAAV,UAAU;IADtB,IAAA,mBAAU,GAAE;qCAEoB,gBAAS;GAD7B,UAAU,CA8BtB"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
export * from './core.module';
|
|
2
|
+
export * from './database/database.module';
|
|
3
|
+
export * from './database/database.service';
|
|
4
|
+
export * from './database/database.query';
|
|
5
|
+
export * from './utils/controller.helpers';
|
|
6
|
+
export { CommonResponseDto, CommonErrorDto, PaginationMeta, ResponseMeta } from './utils/controller.helpers';
|
|
7
|
+
export * from './utils/service.helpers';
|
|
8
|
+
export * from './utils/error.utils';
|
|
9
|
+
export * from './utils/auth.helpers';
|
|
10
|
+
export * from './utils/logger.helpers';
|
|
11
|
+
export { ILogWriter, ConsoleLogWriter, FileLogWriter, FileLogWriterOptions, LogLevelName, LOG_LEVEL_ORDER, isLevelEnabled, } from './utils/logger.helpers';
|
|
12
|
+
export * from './interceptors/logging.interceptor';
|
|
13
|
+
export { LoggingInterceptorOptions } from './interceptors/logging.interceptor';
|
|
14
|
+
export * from './interceptors/error-handling.interceptor';
|
|
15
|
+
export * from './interceptors/response-transform.interceptor';
|
|
16
|
+
export * from './interceptors/database-check.interceptor';
|
|
17
|
+
export * from './guards/jwt-auth.guard';
|
|
18
|
+
export * from './guards/roles.guard';
|
|
19
|
+
export { AllExceptionsFilter, ExceptionFilterOptions } from './filters/exception.filter';
|
|
20
|
+
export * from './decorators/public.decorator';
|
|
21
|
+
export { User, JwtUser } from './decorators/user.decorator';
|
|
22
|
+
export { Roles, ROLES_KEY } from './decorators/roles.decorator';
|
|
23
|
+
export * from './utils/config.validator';
|
|
24
|
+
export { getAppEnv, isDevelopment, isProduction, isStaging, currentAppEnv, isDev, isProd, type AppEnv, } from './utils/env.utils';
|
|
25
|
+
export { getLoggingConfigFromEnv } from './utils/logging.config';
|
|
26
|
+
export { loadApplicationYaml, loadApplicationYamlSync, LoadApplicationYamlOptions, DEFAULT_CONFIG_FILENAMES, ENV_CONFIG_FILENAME_PATTERN, CONFIG_SOURCE_ENV_KEY, type ConfigSource, } from './utils/yaml-config.loader';
|
|
27
|
+
export { resolveConfigRootDir, createConfigLoader, DEFAULT_CONFIG_ROOT_CANDIDATES, type ResolveConfigRootDirOptions, type CreateConfigLoaderOptions, type GetServiceConfigOverrides, } from './utils/config-loader.utils';
|
|
28
|
+
export { pbkdf2HashPassword, pbkdf2VerifyPassword, deriveKeySha256, PBKDF2_DEFAULT_ITERATIONS, PBKDF2_DEFAULT_KEYLEN, PBKDF2_DEFAULT_DIGEST, PBKDF2_SALT_BYTES, type Pbkdf2Options, } from './utils/crypto.utils';
|
|
29
|
+
export { hashValue, compareValue, hashEmail, compareEmail, emailNormalizer, digitsNormalizer, BUILT_IN_NORMALIZERS, getProfileConfig, hashByKey, compareByKey, lookupHash, compareLookupHash, HashVerificationConfig, HashVerificationConfigMap, type LookupHashOptions, } from './utils/hash-verification.utils';
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,91 @@
|
|
|
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
|
+
exports.compareLookupHash = exports.lookupHash = exports.compareByKey = exports.hashByKey = exports.getProfileConfig = exports.BUILT_IN_NORMALIZERS = exports.digitsNormalizer = exports.emailNormalizer = exports.compareEmail = exports.hashEmail = exports.compareValue = exports.hashValue = exports.PBKDF2_SALT_BYTES = exports.PBKDF2_DEFAULT_DIGEST = exports.PBKDF2_DEFAULT_KEYLEN = exports.PBKDF2_DEFAULT_ITERATIONS = exports.deriveKeySha256 = exports.pbkdf2VerifyPassword = exports.pbkdf2HashPassword = exports.DEFAULT_CONFIG_ROOT_CANDIDATES = exports.createConfigLoader = exports.resolveConfigRootDir = exports.CONFIG_SOURCE_ENV_KEY = exports.ENV_CONFIG_FILENAME_PATTERN = exports.DEFAULT_CONFIG_FILENAMES = exports.loadApplicationYamlSync = exports.loadApplicationYaml = exports.getLoggingConfigFromEnv = exports.isProd = exports.isDev = exports.currentAppEnv = exports.isStaging = exports.isProduction = exports.isDevelopment = exports.getAppEnv = exports.ROLES_KEY = exports.Roles = exports.User = exports.AllExceptionsFilter = exports.isLevelEnabled = exports.LOG_LEVEL_ORDER = exports.FileLogWriter = exports.ConsoleLogWriter = exports.CommonErrorDto = exports.CommonResponseDto = void 0;
|
|
18
|
+
__exportStar(require("./core.module"), exports);
|
|
19
|
+
__exportStar(require("./database/database.module"), exports);
|
|
20
|
+
__exportStar(require("./database/database.service"), exports);
|
|
21
|
+
__exportStar(require("./database/database.query"), exports);
|
|
22
|
+
__exportStar(require("./utils/controller.helpers"), exports);
|
|
23
|
+
var controller_helpers_1 = require("./utils/controller.helpers");
|
|
24
|
+
Object.defineProperty(exports, "CommonResponseDto", { enumerable: true, get: function () { return controller_helpers_1.CommonResponseDto; } });
|
|
25
|
+
Object.defineProperty(exports, "CommonErrorDto", { enumerable: true, get: function () { return controller_helpers_1.CommonErrorDto; } });
|
|
26
|
+
__exportStar(require("./utils/service.helpers"), exports);
|
|
27
|
+
__exportStar(require("./utils/error.utils"), exports);
|
|
28
|
+
__exportStar(require("./utils/auth.helpers"), exports);
|
|
29
|
+
__exportStar(require("./utils/logger.helpers"), exports);
|
|
30
|
+
var logger_helpers_1 = require("./utils/logger.helpers");
|
|
31
|
+
Object.defineProperty(exports, "ConsoleLogWriter", { enumerable: true, get: function () { return logger_helpers_1.ConsoleLogWriter; } });
|
|
32
|
+
Object.defineProperty(exports, "FileLogWriter", { enumerable: true, get: function () { return logger_helpers_1.FileLogWriter; } });
|
|
33
|
+
Object.defineProperty(exports, "LOG_LEVEL_ORDER", { enumerable: true, get: function () { return logger_helpers_1.LOG_LEVEL_ORDER; } });
|
|
34
|
+
Object.defineProperty(exports, "isLevelEnabled", { enumerable: true, get: function () { return logger_helpers_1.isLevelEnabled; } });
|
|
35
|
+
__exportStar(require("./interceptors/logging.interceptor"), exports);
|
|
36
|
+
__exportStar(require("./interceptors/error-handling.interceptor"), exports);
|
|
37
|
+
__exportStar(require("./interceptors/response-transform.interceptor"), exports);
|
|
38
|
+
__exportStar(require("./interceptors/database-check.interceptor"), exports);
|
|
39
|
+
__exportStar(require("./guards/jwt-auth.guard"), exports);
|
|
40
|
+
__exportStar(require("./guards/roles.guard"), exports);
|
|
41
|
+
var exception_filter_1 = require("./filters/exception.filter");
|
|
42
|
+
Object.defineProperty(exports, "AllExceptionsFilter", { enumerable: true, get: function () { return exception_filter_1.AllExceptionsFilter; } });
|
|
43
|
+
__exportStar(require("./decorators/public.decorator"), exports);
|
|
44
|
+
var user_decorator_1 = require("./decorators/user.decorator");
|
|
45
|
+
Object.defineProperty(exports, "User", { enumerable: true, get: function () { return user_decorator_1.User; } });
|
|
46
|
+
var roles_decorator_1 = require("./decorators/roles.decorator");
|
|
47
|
+
Object.defineProperty(exports, "Roles", { enumerable: true, get: function () { return roles_decorator_1.Roles; } });
|
|
48
|
+
Object.defineProperty(exports, "ROLES_KEY", { enumerable: true, get: function () { return roles_decorator_1.ROLES_KEY; } });
|
|
49
|
+
__exportStar(require("./utils/config.validator"), exports);
|
|
50
|
+
var env_utils_1 = require("./utils/env.utils");
|
|
51
|
+
Object.defineProperty(exports, "getAppEnv", { enumerable: true, get: function () { return env_utils_1.getAppEnv; } });
|
|
52
|
+
Object.defineProperty(exports, "isDevelopment", { enumerable: true, get: function () { return env_utils_1.isDevelopment; } });
|
|
53
|
+
Object.defineProperty(exports, "isProduction", { enumerable: true, get: function () { return env_utils_1.isProduction; } });
|
|
54
|
+
Object.defineProperty(exports, "isStaging", { enumerable: true, get: function () { return env_utils_1.isStaging; } });
|
|
55
|
+
Object.defineProperty(exports, "currentAppEnv", { enumerable: true, get: function () { return env_utils_1.currentAppEnv; } });
|
|
56
|
+
Object.defineProperty(exports, "isDev", { enumerable: true, get: function () { return env_utils_1.isDev; } });
|
|
57
|
+
Object.defineProperty(exports, "isProd", { enumerable: true, get: function () { return env_utils_1.isProd; } });
|
|
58
|
+
var logging_config_1 = require("./utils/logging.config");
|
|
59
|
+
Object.defineProperty(exports, "getLoggingConfigFromEnv", { enumerable: true, get: function () { return logging_config_1.getLoggingConfigFromEnv; } });
|
|
60
|
+
var yaml_config_loader_1 = require("./utils/yaml-config.loader");
|
|
61
|
+
Object.defineProperty(exports, "loadApplicationYaml", { enumerable: true, get: function () { return yaml_config_loader_1.loadApplicationYaml; } });
|
|
62
|
+
Object.defineProperty(exports, "loadApplicationYamlSync", { enumerable: true, get: function () { return yaml_config_loader_1.loadApplicationYamlSync; } });
|
|
63
|
+
Object.defineProperty(exports, "DEFAULT_CONFIG_FILENAMES", { enumerable: true, get: function () { return yaml_config_loader_1.DEFAULT_CONFIG_FILENAMES; } });
|
|
64
|
+
Object.defineProperty(exports, "ENV_CONFIG_FILENAME_PATTERN", { enumerable: true, get: function () { return yaml_config_loader_1.ENV_CONFIG_FILENAME_PATTERN; } });
|
|
65
|
+
Object.defineProperty(exports, "CONFIG_SOURCE_ENV_KEY", { enumerable: true, get: function () { return yaml_config_loader_1.CONFIG_SOURCE_ENV_KEY; } });
|
|
66
|
+
var config_loader_utils_1 = require("./utils/config-loader.utils");
|
|
67
|
+
Object.defineProperty(exports, "resolveConfigRootDir", { enumerable: true, get: function () { return config_loader_utils_1.resolveConfigRootDir; } });
|
|
68
|
+
Object.defineProperty(exports, "createConfigLoader", { enumerable: true, get: function () { return config_loader_utils_1.createConfigLoader; } });
|
|
69
|
+
Object.defineProperty(exports, "DEFAULT_CONFIG_ROOT_CANDIDATES", { enumerable: true, get: function () { return config_loader_utils_1.DEFAULT_CONFIG_ROOT_CANDIDATES; } });
|
|
70
|
+
var crypto_utils_1 = require("./utils/crypto.utils");
|
|
71
|
+
Object.defineProperty(exports, "pbkdf2HashPassword", { enumerable: true, get: function () { return crypto_utils_1.pbkdf2HashPassword; } });
|
|
72
|
+
Object.defineProperty(exports, "pbkdf2VerifyPassword", { enumerable: true, get: function () { return crypto_utils_1.pbkdf2VerifyPassword; } });
|
|
73
|
+
Object.defineProperty(exports, "deriveKeySha256", { enumerable: true, get: function () { return crypto_utils_1.deriveKeySha256; } });
|
|
74
|
+
Object.defineProperty(exports, "PBKDF2_DEFAULT_ITERATIONS", { enumerable: true, get: function () { return crypto_utils_1.PBKDF2_DEFAULT_ITERATIONS; } });
|
|
75
|
+
Object.defineProperty(exports, "PBKDF2_DEFAULT_KEYLEN", { enumerable: true, get: function () { return crypto_utils_1.PBKDF2_DEFAULT_KEYLEN; } });
|
|
76
|
+
Object.defineProperty(exports, "PBKDF2_DEFAULT_DIGEST", { enumerable: true, get: function () { return crypto_utils_1.PBKDF2_DEFAULT_DIGEST; } });
|
|
77
|
+
Object.defineProperty(exports, "PBKDF2_SALT_BYTES", { enumerable: true, get: function () { return crypto_utils_1.PBKDF2_SALT_BYTES; } });
|
|
78
|
+
var hash_verification_utils_1 = require("./utils/hash-verification.utils");
|
|
79
|
+
Object.defineProperty(exports, "hashValue", { enumerable: true, get: function () { return hash_verification_utils_1.hashValue; } });
|
|
80
|
+
Object.defineProperty(exports, "compareValue", { enumerable: true, get: function () { return hash_verification_utils_1.compareValue; } });
|
|
81
|
+
Object.defineProperty(exports, "hashEmail", { enumerable: true, get: function () { return hash_verification_utils_1.hashEmail; } });
|
|
82
|
+
Object.defineProperty(exports, "compareEmail", { enumerable: true, get: function () { return hash_verification_utils_1.compareEmail; } });
|
|
83
|
+
Object.defineProperty(exports, "emailNormalizer", { enumerable: true, get: function () { return hash_verification_utils_1.emailNormalizer; } });
|
|
84
|
+
Object.defineProperty(exports, "digitsNormalizer", { enumerable: true, get: function () { return hash_verification_utils_1.digitsNormalizer; } });
|
|
85
|
+
Object.defineProperty(exports, "BUILT_IN_NORMALIZERS", { enumerable: true, get: function () { return hash_verification_utils_1.BUILT_IN_NORMALIZERS; } });
|
|
86
|
+
Object.defineProperty(exports, "getProfileConfig", { enumerable: true, get: function () { return hash_verification_utils_1.getProfileConfig; } });
|
|
87
|
+
Object.defineProperty(exports, "hashByKey", { enumerable: true, get: function () { return hash_verification_utils_1.hashByKey; } });
|
|
88
|
+
Object.defineProperty(exports, "compareByKey", { enumerable: true, get: function () { return hash_verification_utils_1.compareByKey; } });
|
|
89
|
+
Object.defineProperty(exports, "lookupHash", { enumerable: true, get: function () { return hash_verification_utils_1.lookupHash; } });
|
|
90
|
+
Object.defineProperty(exports, "compareLookupHash", { enumerable: true, get: function () { return hash_verification_utils_1.compareLookupHash; } });
|
|
91
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;AACA,gDAA8B;AAG9B,6DAA2C;AAC3C,8DAA4C;AAC5C,4DAA0C;AAG1C,6DAA2C;AAC3C,iEAKoC;AAJlC,uHAAA,iBAAiB,OAAA;AACjB,oHAAA,cAAc,OAAA;AAIhB,0DAAwC;AACxC,sDAAoC;AACpC,uDAAqC;AACrC,yDAAuC;AACvC,yDAQgC;AAN9B,kHAAA,gBAAgB,OAAA;AAChB,+GAAA,aAAa,OAAA;AAGb,iHAAA,eAAe,OAAA;AACf,gHAAA,cAAc,OAAA;AAIhB,qEAAmD;AAEnD,4EAA0D;AAC1D,gFAA8D;AAC9D,4EAA0D;AAG1D,0DAAwC;AACxC,uDAAqC;AAGrC,+DAAyF;AAAhF,uHAAA,mBAAmB,OAAA;AAG5B,gEAA8C;AAC9C,8DAA4D;AAAnD,sGAAA,IAAI,OAAA;AACb,gEAAgE;AAAvD,wGAAA,KAAK,OAAA;AAAE,4GAAA,SAAS,OAAA;AAGzB,2DAAyC;AAGzC,+CAS2B;AARzB,sGAAA,SAAS,OAAA;AACT,0GAAA,aAAa,OAAA;AACb,yGAAA,YAAY,OAAA;AACZ,sGAAA,SAAS,OAAA;AACT,0GAAA,aAAa,OAAA;AACb,kGAAA,KAAK,OAAA;AACL,mGAAA,MAAM,OAAA;AAKR,yDAAiE;AAAxD,yHAAA,uBAAuB,OAAA;AAGhC,iEAQoC;AAPlC,yHAAA,mBAAmB,OAAA;AACnB,6HAAA,uBAAuB,OAAA;AAEvB,8HAAA,wBAAwB,OAAA;AACxB,iIAAA,2BAA2B,OAAA;AAC3B,2HAAA,qBAAqB,OAAA;AAKvB,mEAOqC;AANnC,2HAAA,oBAAoB,OAAA;AACpB,yHAAA,kBAAkB,OAAA;AAClB,qIAAA,8BAA8B,OAAA;AAOhC,qDAS8B;AAR5B,kHAAA,kBAAkB,OAAA;AAClB,oHAAA,oBAAoB,OAAA;AACpB,+GAAA,eAAe,OAAA;AACf,yHAAA,yBAAyB,OAAA;AACzB,qHAAA,qBAAqB,OAAA;AACrB,qHAAA,qBAAqB,OAAA;AACrB,iHAAA,iBAAiB,OAAA;AAKnB,2EAgByC;AAfvC,oHAAA,SAAS,OAAA;AACT,uHAAA,YAAY,OAAA;AACZ,oHAAA,SAAS,OAAA;AACT,uHAAA,YAAY,OAAA;AACZ,0HAAA,eAAe,OAAA;AACf,2HAAA,gBAAgB,OAAA;AAChB,+HAAA,oBAAoB,OAAA;AACpB,2HAAA,gBAAgB,OAAA;AAChB,oHAAA,SAAS,OAAA;AACT,uHAAA,YAAY,OAAA;AACZ,qHAAA,UAAU,OAAA;AACV,4HAAA,iBAAiB,OAAA"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { NestInterceptor, ExecutionContext, CallHandler } from '@nestjs/common';
|
|
2
|
+
import { Reflector } from '@nestjs/core';
|
|
3
|
+
import { Observable } from 'rxjs';
|
|
4
|
+
import { DatabaseService } from '../database/database.service';
|
|
5
|
+
export declare class DatabaseCheckInterceptor implements NestInterceptor {
|
|
6
|
+
private readonly databaseService?;
|
|
7
|
+
private readonly reflector;
|
|
8
|
+
constructor(databaseService?: DatabaseService, reflector?: Reflector);
|
|
9
|
+
intercept(context: ExecutionContext, next: CallHandler): Observable<any>;
|
|
10
|
+
private checkDatabase;
|
|
11
|
+
private isPublicEndpoint;
|
|
12
|
+
}
|
|
@@ -0,0 +1,60 @@
|
|
|
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 __param = (this && this.__param) || function (paramIndex, decorator) {
|
|
12
|
+
return function (target, key) { decorator(target, key, paramIndex); }
|
|
13
|
+
};
|
|
14
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
15
|
+
exports.DatabaseCheckInterceptor = void 0;
|
|
16
|
+
const common_1 = require("@nestjs/common");
|
|
17
|
+
const core_1 = require("@nestjs/core");
|
|
18
|
+
const database_service_1 = require("../database/database.service");
|
|
19
|
+
const public_decorator_1 = require("../decorators/public.decorator");
|
|
20
|
+
let DatabaseCheckInterceptor = class DatabaseCheckInterceptor {
|
|
21
|
+
constructor(databaseService, reflector = new core_1.Reflector()) {
|
|
22
|
+
this.databaseService = databaseService;
|
|
23
|
+
this.reflector = reflector;
|
|
24
|
+
}
|
|
25
|
+
intercept(context, next) {
|
|
26
|
+
const isPublic = this.isPublicEndpoint(context);
|
|
27
|
+
if (isPublic) {
|
|
28
|
+
return next.handle();
|
|
29
|
+
}
|
|
30
|
+
const contextType = context.getType();
|
|
31
|
+
if (contextType === 'rpc') {
|
|
32
|
+
return next.handle();
|
|
33
|
+
}
|
|
34
|
+
return this.checkDatabase(context, next);
|
|
35
|
+
}
|
|
36
|
+
checkDatabase(context, next) {
|
|
37
|
+
if (this.databaseService && !this.databaseService.isConnected()) {
|
|
38
|
+
throw new common_1.ServiceUnavailableException({
|
|
39
|
+
error: 'Database connection not available',
|
|
40
|
+
code: 'DB_NOT_CONNECTED',
|
|
41
|
+
message: 'The database service is currently unavailable. Please try again later.',
|
|
42
|
+
});
|
|
43
|
+
}
|
|
44
|
+
return next.handle();
|
|
45
|
+
}
|
|
46
|
+
isPublicEndpoint(context) {
|
|
47
|
+
return this.reflector.getAllAndOverride(public_decorator_1.IS_PUBLIC_KEY, [
|
|
48
|
+
context.getHandler(),
|
|
49
|
+
context.getClass(),
|
|
50
|
+
]);
|
|
51
|
+
}
|
|
52
|
+
};
|
|
53
|
+
exports.DatabaseCheckInterceptor = DatabaseCheckInterceptor;
|
|
54
|
+
exports.DatabaseCheckInterceptor = DatabaseCheckInterceptor = __decorate([
|
|
55
|
+
(0, common_1.Injectable)(),
|
|
56
|
+
__param(0, (0, common_1.Optional)()),
|
|
57
|
+
__metadata("design:paramtypes", [database_service_1.DatabaseService,
|
|
58
|
+
core_1.Reflector])
|
|
59
|
+
], DatabaseCheckInterceptor);
|
|
60
|
+
//# sourceMappingURL=database-check.interceptor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"database-check.interceptor.js","sourceRoot":"","sources":["../../src/interceptors/database-check.interceptor.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;AAAA,2CAOwB;AACxB,uCAAyC;AAEzC,mEAA+D;AAC/D,qEAA+D;AAWxD,IAAM,wBAAwB,GAA9B,MAAM,wBAAwB;IACnC,YAC+B,eAAiC,EAC7C,YAAuB,IAAI,gBAAS,EAAE;QAD1B,oBAAe,GAAf,eAAe,CAAkB;QAC7C,cAAS,GAAT,SAAS,CAA6B;IACtD,CAAC;IAEJ,SAAS,CAAC,OAAyB,EAAE,IAAiB;QAEpD,MAAM,QAAQ,GAAG,IAAI,CAAC,gBAAgB,CAAC,OAAO,CAAC,CAAC;QAChD,IAAI,QAAQ,EAAE,CAAC;YACb,OAAO,IAAI,CAAC,MAAM,EAAE,CAAC;QACvB,CAAC;QAGD,MAAM,WAAW,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC;QACtC,IAAI,WAAW,KAAK,KAAK,EAAE,CAAC;YAI1B,OAAO,IAAI,CAAC,MAAM,EAAE,CAAC;QACvB,CAAC;QAGD,OAAO,IAAI,CAAC,aAAa,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;IAC3C,CAAC;IAKO,aAAa,CACnB,OAAyB,EACzB,IAAiB;QAGjB,IAAI,IAAI,CAAC,eAAe,IAAI,CAAC,IAAI,CAAC,eAAe,CAAC,WAAW,EAAE,EAAE,CAAC;YAChE,MAAM,IAAI,oCAA2B,CAAC;gBACpC,KAAK,EAAE,mCAAmC;gBAC1C,IAAI,EAAE,kBAAkB;gBACxB,OAAO,EAAE,wEAAwE;aAClF,CAAC,CAAC;QACL,CAAC;QAED,OAAO,IAAI,CAAC,MAAM,EAAE,CAAC;IACvB,CAAC;IAKO,gBAAgB,CAAC,OAAyB;QAChD,OAAO,IAAI,CAAC,SAAS,CAAC,iBAAiB,CAAU,gCAAa,EAAE;YAC9D,OAAO,CAAC,UAAU,EAAE;YACpB,OAAO,CAAC,QAAQ,EAAE;SACnB,CAAC,CAAC;IACL,CAAC;CACF,CAAA;AAtDY,4DAAwB;mCAAxB,wBAAwB;IADpC,IAAA,mBAAU,GAAE;IAGR,WAAA,IAAA,iBAAQ,GAAE,CAAA;qCAAoC,kCAAe;QAClC,gBAAS;GAH5B,wBAAwB,CAsDpC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { NestInterceptor, ExecutionContext, CallHandler } from '@nestjs/common';
|
|
2
|
+
import { Observable } from 'rxjs';
|
|
3
|
+
import { ErrorUtils } from '../utils/error.utils';
|
|
4
|
+
export declare class ErrorHandlingInterceptor implements NestInterceptor {
|
|
5
|
+
private readonly errorUtils;
|
|
6
|
+
constructor(errorUtils: ErrorUtils);
|
|
7
|
+
intercept(context: ExecutionContext, next: CallHandler): Observable<any>;
|
|
8
|
+
}
|