@fabx.vn/core 1.0.0 → 1.0.2
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 +68 -131
- package/dist/core/core.module.js +11 -11
- package/dist/core/dtos/api-response.dto.js +1 -1
- package/dist/core/dtos/pagination.dto.js +1 -1
- package/dist/core/filters/http-exception.filter.js +2 -2
- package/dist/core/guards/internal-auth.guard.d.ts +1 -1
- package/dist/core/guards/internal-auth.guard.js +2 -2
- package/dist/core/guards/jwt-auth.guard.d.ts +2 -1
- package/dist/core/guards/jwt-auth.guard.js +12 -6
- package/dist/core/guards/jwt-auth.guard.js.map +1 -1
- package/dist/core/guards/permission.guard.d.ts +1 -1
- package/dist/core/guards/permission.guard.js +5 -5
- package/dist/core/interceptors/request-context.interceptor.d.ts +1 -1
- package/dist/core/interceptors/request-context.interceptor.js +2 -2
- package/dist/core/services/cache.service.js +1 -1
- package/dist/core/services/cookie.service.js +1 -1
- package/dist/core/services/jwt.service.d.ts +2 -1
- package/dist/core/services/jwt.service.js +11 -7
- package/dist/core/services/jwt.service.js.map +1 -1
- package/dist/core/services/rabbitmq-publisher.service.js +1 -1
- package/dist/core/services/redis.service.js +1 -1
- package/dist/core/services/request-context.service.d.ts +1 -1
- package/dist/core/services/session.service.d.ts +1 -1
- package/dist/core/services/session.service.js +1 -1
- package/dist/core/services/session.service.js.map +1 -1
- package/dist/core/strategies/jwt.strategy.d.ts +1 -1
- package/dist/core/strategies/jwt.strategy.js +2 -2
- package/dist/core/subscribers/audit.subscriber.js +1 -1
- package/dist/index.d.ts +22 -22
- package/dist/index.js +20 -20
- package/dist/index.js.map +1 -1
- package/dist/libs/axios/index.d.ts +1 -1
- package/dist/libs/axios/index.js +1 -1
- package/dist/libs/axios/index.js.map +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +9 -8
package/README.md
CHANGED
|
@@ -1,26 +1,13 @@
|
|
|
1
|
-
# @
|
|
1
|
+
# @fabx.vn/core
|
|
2
2
|
|
|
3
3
|
Shared core module for all ERP services. Contains reusable core functionality including JWT handling, session management, authentication guards, interceptors, and common utilities.
|
|
4
4
|
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
### 1. Update `tsconfig.json` in your service:
|
|
8
|
-
|
|
9
|
-
```json
|
|
10
|
-
{
|
|
11
|
-
"compilerOptions": {
|
|
12
|
-
"paths": {
|
|
13
|
-
"@package-core": ["../package-core/src"],
|
|
14
|
-
"@package-core/*": ["../package-core/src/*"]
|
|
15
|
-
}
|
|
16
|
-
}
|
|
17
|
-
}
|
|
18
|
-
```
|
|
5
|
+
**📦 Published on npm:** https://www.npmjs.com/package/@fabx.vn/core
|
|
19
6
|
|
|
20
|
-
|
|
7
|
+
## Installation
|
|
21
8
|
|
|
22
|
-
```
|
|
23
|
-
|
|
9
|
+
```bash
|
|
10
|
+
npm install @fabx.vn/core@latest
|
|
24
11
|
```
|
|
25
12
|
|
|
26
13
|
## Quick Start
|
|
@@ -29,15 +16,15 @@ import { CoreModule } from "@package-core";
|
|
|
29
16
|
|
|
30
17
|
```typescript
|
|
31
18
|
import { Module } from "@nestjs/common";
|
|
32
|
-
import { CoreModule } from "@
|
|
19
|
+
import { CoreModule } from "@fabx.vn/core";
|
|
33
20
|
|
|
34
21
|
@Module({
|
|
35
|
-
imports: [CoreModule], // @Global() - available everywhere
|
|
22
|
+
imports: [CoreModule], // @Global() - available everywhere
|
|
36
23
|
})
|
|
37
24
|
export class AppModule {}
|
|
38
25
|
```
|
|
39
26
|
|
|
40
|
-
### 2. Use Guards
|
|
27
|
+
### 2. Use Guards & Decorators
|
|
41
28
|
|
|
42
29
|
```typescript
|
|
43
30
|
import { Controller, Get, UseGuards } from "@nestjs/common";
|
|
@@ -46,7 +33,7 @@ import {
|
|
|
46
33
|
CurrentUser,
|
|
47
34
|
CurrentUserDto,
|
|
48
35
|
Public,
|
|
49
|
-
} from "@
|
|
36
|
+
} from "@fabx.vn/core";
|
|
50
37
|
|
|
51
38
|
@Controller("api")
|
|
52
39
|
export class MyController {
|
|
@@ -64,42 +51,23 @@ export class MyController {
|
|
|
64
51
|
}
|
|
65
52
|
```
|
|
66
53
|
|
|
67
|
-
### 3. Use
|
|
68
|
-
|
|
69
|
-
```typescript
|
|
70
|
-
import { Controller, Get, UseGuards } from "@nestjs/common";
|
|
71
|
-
import { PermissionGuard, RequirePermissions } from "@package-core";
|
|
72
|
-
|
|
73
|
-
@Controller("admin")
|
|
74
|
-
@UseGuards(PermissionGuard)
|
|
75
|
-
export class AdminController {
|
|
76
|
-
@Get("users")
|
|
77
|
-
@RequirePermissions("user:read", "user:list")
|
|
78
|
-
getUsers() {
|
|
79
|
-
return { users: [] };
|
|
80
|
-
}
|
|
81
|
-
}
|
|
82
|
-
```
|
|
83
|
-
|
|
84
|
-
### 4. Use Services
|
|
54
|
+
### 3. Use Services
|
|
85
55
|
|
|
86
56
|
```typescript
|
|
87
57
|
import { Injectable } from "@nestjs/common";
|
|
88
58
|
import {
|
|
89
59
|
CoreJwtService,
|
|
90
60
|
SessionService,
|
|
91
|
-
|
|
92
|
-
CookieService,
|
|
61
|
+
RedisService,
|
|
93
62
|
RabbitMQPublisher,
|
|
94
63
|
RABBITMQ_ROUTING_KEYS,
|
|
95
|
-
} from "@
|
|
64
|
+
} from "@fabx.vn/core";
|
|
96
65
|
|
|
97
66
|
@Injectable()
|
|
98
67
|
export class MyService {
|
|
99
68
|
constructor(
|
|
100
69
|
private coreJwtService: CoreJwtService,
|
|
101
|
-
private
|
|
102
|
-
private cacheService: CacheService,
|
|
70
|
+
private redisService: RedisService,
|
|
103
71
|
private rabbitmqPublisher: RabbitMQPublisher
|
|
104
72
|
) {}
|
|
105
73
|
|
|
@@ -107,14 +75,6 @@ export class MyService {
|
|
|
107
75
|
return await this.coreJwtService.signToken({ sub: userId });
|
|
108
76
|
}
|
|
109
77
|
|
|
110
|
-
async setSession(sessionId: string, userData: CurrentUserDto) {
|
|
111
|
-
await this.sessionService.setSession(sessionId, userData);
|
|
112
|
-
}
|
|
113
|
-
|
|
114
|
-
async cacheData(key: string, value: string, ttl: number = 3600) {
|
|
115
|
-
await this.cacheService.set(key, value, ttl);
|
|
116
|
-
}
|
|
117
|
-
|
|
118
78
|
async publishEvent(data: any) {
|
|
119
79
|
this.rabbitmqPublisher.publish(
|
|
120
80
|
RABBITMQ_ROUTING_KEYS.AUTH_USER_CREATED,
|
|
@@ -124,80 +84,61 @@ export class MyService {
|
|
|
124
84
|
}
|
|
125
85
|
```
|
|
126
86
|
|
|
127
|
-
### 5. Use Constants
|
|
128
|
-
|
|
129
|
-
```typescript
|
|
130
|
-
import { MESSAGES, ERROR_MESSAGES, SUCCESS_MESSAGES } from "@package-core";
|
|
131
|
-
import { BadRequestException } from "@nestjs/common";
|
|
132
|
-
|
|
133
|
-
throw new BadRequestException(MESSAGES.AUTH.INVALID_CREDENTIALS);
|
|
134
|
-
throw new BadRequestException(MESSAGES.VALIDATION.EMAIL_REQUIRED);
|
|
135
|
-
```
|
|
136
|
-
|
|
137
87
|
## Available Exports
|
|
138
88
|
|
|
139
89
|
### Core Module
|
|
140
90
|
|
|
141
|
-
-
|
|
91
|
+
- `CoreModule` - Global module (import once in AppModule)
|
|
142
92
|
|
|
143
93
|
### Services
|
|
144
94
|
|
|
145
|
-
-
|
|
146
|
-
-
|
|
147
|
-
-
|
|
148
|
-
-
|
|
149
|
-
-
|
|
150
|
-
-
|
|
151
|
-
-
|
|
95
|
+
- `CoreJwtService` - JWT token creation, validation
|
|
96
|
+
- `SessionService` - Redis-based session management
|
|
97
|
+
- `RedisService` - Redis operations
|
|
98
|
+
- `CookieService` - Cookie handling
|
|
99
|
+
- `RabbitMQPublisher` - RabbitMQ message publishing
|
|
100
|
+
- `RequestContextService` - Request context management
|
|
101
|
+
- `RequestInfoService` - Extract request info (IP, user agent)
|
|
102
|
+
- `PermissionService` - Permission management
|
|
152
103
|
|
|
153
104
|
### Guards
|
|
154
105
|
|
|
155
|
-
-
|
|
156
|
-
-
|
|
157
|
-
-
|
|
106
|
+
- `JwtAuthGuard` - JWT authentication guard
|
|
107
|
+
- `InternalAuthGuard` - Internal service-to-service auth
|
|
108
|
+
- `PermissionGuard` - Permission-based access control
|
|
158
109
|
|
|
159
110
|
### Decorators
|
|
160
111
|
|
|
161
|
-
-
|
|
162
|
-
-
|
|
163
|
-
-
|
|
164
|
-
-
|
|
112
|
+
- `@CurrentUser()` - Extract current user from request
|
|
113
|
+
- `@Public()` - Mark route as public
|
|
114
|
+
- `@RequirePermissions(...permissions)` - Require ALL permissions
|
|
115
|
+
- `@RequireAnyPermission(...permissions)` - Require ANY permission
|
|
165
116
|
|
|
166
117
|
### DTOs & Types
|
|
167
118
|
|
|
168
|
-
-
|
|
169
|
-
-
|
|
170
|
-
- **`PaginationDto`** - Pagination query parameters
|
|
171
|
-
- **`PaginationResponseDto<T>`** - Paginated response structure
|
|
172
|
-
- **`JwtTokenData`** - JWT token payload structure
|
|
173
|
-
- **`JwtValidationResult`** - JWT validation result
|
|
119
|
+
- `CurrentUserDto`, `ApiResponseDto<T>`, `PaginationDto`, `PaginationResponseDto<T>`, `PaginationMetaDto`
|
|
120
|
+
- `JwtTokenData`, `JwtValidationResult`
|
|
174
121
|
|
|
175
122
|
### Filters & Interceptors
|
|
176
123
|
|
|
177
|
-
-
|
|
178
|
-
-
|
|
124
|
+
- `HttpExceptionFilter` - Global exception filter
|
|
125
|
+
- `RequestContextInterceptor` - Auto-registered interceptor
|
|
179
126
|
|
|
180
127
|
### Config
|
|
181
128
|
|
|
182
|
-
-
|
|
183
|
-
-
|
|
184
|
-
- **`rabbitmqConfig`** - RabbitMQ configuration
|
|
185
|
-
- **`RABBITMQ_ROUTING_KEYS`** - RabbitMQ routing keys constants
|
|
186
|
-
- **`cookieConfig`** - Cookie configuration
|
|
187
|
-
- **`internalConfig`** - Internal service configuration
|
|
188
|
-
- **`corsConfig`** - CORS configuration
|
|
189
|
-
- **`googleOAuthConfig`** - Google OAuth configuration
|
|
129
|
+
- `jwtConfig`, `redisConfig`, `databaseConfig`, `rabbitmqConfig`, `RABBITMQ_ROUTING_KEYS`
|
|
130
|
+
- `cookieConfig`, `internalConfig`, `corsConfig`, `googleOAuthConfig`
|
|
190
131
|
|
|
191
132
|
### Constants
|
|
192
133
|
|
|
193
|
-
-
|
|
194
|
-
-
|
|
195
|
-
-
|
|
134
|
+
- `MESSAGES` - Vietnamese messages (AUTH, VALIDATION, API, etc.)
|
|
135
|
+
- `ERROR_MESSAGES`, `ERROR_RESPONSES`, `SUCCESS_MESSAGES`, `SUCCESS_RESPONSES`
|
|
136
|
+
- `PERMISSION_QUERIES` - SQL queries for permissions
|
|
196
137
|
|
|
197
138
|
### Utils & Libs
|
|
198
139
|
|
|
199
|
-
-
|
|
200
|
-
-
|
|
140
|
+
- `DateUtils` - Date utilities
|
|
141
|
+
- `AxiosClient`, `apiClient`, `createServiceClient` - Axios utilities
|
|
201
142
|
|
|
202
143
|
## Environment Variables
|
|
203
144
|
|
|
@@ -206,7 +147,6 @@ throw new BadRequestException(MESSAGES.VALIDATION.EMAIL_REQUIRED);
|
|
|
206
147
|
JWT_SECRET=your-jwt-secret
|
|
207
148
|
JWT_EXPIRES_IN=15m
|
|
208
149
|
JWT_REFRESH_EXPIRES_IN=7d
|
|
209
|
-
JWT_SESSION_EXPIRES_IN=24h
|
|
210
150
|
|
|
211
151
|
# Redis
|
|
212
152
|
SHARED_REDIS_HOST=localhost
|
|
@@ -227,44 +167,41 @@ AUTH_COOKIE_NAME=auth_tokens
|
|
|
227
167
|
|
|
228
168
|
# Internal Service
|
|
229
169
|
INTERNAL_SECRET=internal-secret
|
|
230
|
-
USER_MANAGEMENT_SERVICE_URL=http://service-user-management:3002
|
|
231
170
|
```
|
|
232
171
|
|
|
233
|
-
##
|
|
172
|
+
## Publishing
|
|
234
173
|
|
|
235
|
-
```
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
│ │ ├── dtos/ # 2 DTOs
|
|
245
|
-
│ │ ├── filters/ # 1 filter
|
|
246
|
-
│ │ ├── interceptors/ # 1 interceptor
|
|
247
|
-
│ │ ├── strategies/ # 1 strategy
|
|
248
|
-
│ │ └── subscribers/ # 1 subscriber
|
|
249
|
-
│ ├── config/ # 8 config files
|
|
250
|
-
│ ├── constants/ # 2 constant files
|
|
251
|
-
│ ├── utils/ # 1 util file
|
|
252
|
-
│ └── libs/ # 1 lib (axios)
|
|
253
|
-
├── package.json
|
|
254
|
-
├── tsconfig.json
|
|
255
|
-
└── README.md
|
|
174
|
+
```bash
|
|
175
|
+
npm login # First time only
|
|
176
|
+
npm run build # Build package
|
|
177
|
+
npm run publish:npm # Publish to npm
|
|
178
|
+
|
|
179
|
+
# Version management
|
|
180
|
+
npm version patch # 1.0.0 → 1.0.1
|
|
181
|
+
npm version minor # 1.0.0 → 1.1.0
|
|
182
|
+
npm version major # 1.0.0 → 2.0.0
|
|
256
183
|
```
|
|
257
184
|
|
|
258
|
-
##
|
|
185
|
+
## Docker Build
|
|
259
186
|
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
187
|
+
**Không cần token!** Package public trên npmjs.com:
|
|
188
|
+
|
|
189
|
+
```dockerfile
|
|
190
|
+
FROM node:18-alpine
|
|
191
|
+
WORKDIR /usr/src/app
|
|
192
|
+
COPY package*.json ./
|
|
193
|
+
RUN npm install # Tự động lấy @fabx.vn/core từ npmjs.com
|
|
194
|
+
COPY . .
|
|
195
|
+
RUN npm run build
|
|
263
196
|
```
|
|
264
197
|
|
|
265
198
|
## Notes
|
|
266
199
|
|
|
267
|
-
- **Global Module**: `CoreModule` is
|
|
268
|
-
- **Request Context**: `RequestContextInterceptor`
|
|
269
|
-
- **
|
|
270
|
-
- **
|
|
200
|
+
- **Global Module**: `CoreModule` is `@Global()`, import once in `AppModule`
|
|
201
|
+
- **Request Context**: `RequestContextInterceptor` auto-registered via `APP_INTERCEPTOR`
|
|
202
|
+
- **Type Safety**: All exports fully typed with TypeScript
|
|
203
|
+
- **Public Package**: Published on npmjs.com, no token required to install
|
|
204
|
+
|
|
205
|
+
## License
|
|
206
|
+
|
|
207
|
+
MIT
|
package/dist/core/core.module.js
CHANGED
|
@@ -11,17 +11,17 @@ const common_1 = require("@nestjs/common");
|
|
|
11
11
|
const passport_1 = require("@nestjs/passport");
|
|
12
12
|
const jwt_1 = require("@nestjs/jwt");
|
|
13
13
|
const core_1 = require("@nestjs/core");
|
|
14
|
-
const jwt_config_1 = require("
|
|
15
|
-
const request_info_service_1 = require("
|
|
16
|
-
const jwt_service_1 = require("
|
|
17
|
-
const session_service_1 = require("
|
|
18
|
-
const redis_service_1 = require("
|
|
19
|
-
const rabbitmq_publisher_service_1 = require("
|
|
20
|
-
const jwt_strategy_1 = require("
|
|
21
|
-
const jwt_auth_guard_1 = require("
|
|
22
|
-
const internal_auth_guard_1 = require("
|
|
23
|
-
const request_context_interceptor_1 = require("
|
|
24
|
-
const audit_subscriber_1 = require("
|
|
14
|
+
const jwt_config_1 = require("../config/jwt.config");
|
|
15
|
+
const request_info_service_1 = require("./services/request-info.service");
|
|
16
|
+
const jwt_service_1 = require("./services/jwt.service");
|
|
17
|
+
const session_service_1 = require("./services/session.service");
|
|
18
|
+
const redis_service_1 = require("./services/redis.service");
|
|
19
|
+
const rabbitmq_publisher_service_1 = require("./services/rabbitmq-publisher.service");
|
|
20
|
+
const jwt_strategy_1 = require("./strategies/jwt.strategy");
|
|
21
|
+
const jwt_auth_guard_1 = require("./guards/jwt-auth.guard");
|
|
22
|
+
const internal_auth_guard_1 = require("./guards/internal-auth.guard");
|
|
23
|
+
const request_context_interceptor_1 = require("./interceptors/request-context.interceptor");
|
|
24
|
+
const audit_subscriber_1 = require("./subscribers/audit.subscriber");
|
|
25
25
|
let CoreModule = class CoreModule {
|
|
26
26
|
};
|
|
27
27
|
exports.CoreModule = CoreModule;
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.ApiResponseDto = void 0;
|
|
4
4
|
const common_1 = require("@nestjs/common");
|
|
5
|
-
const messages_constants_1 = require("
|
|
5
|
+
const messages_constants_1 = require("../../constants/messages.constants");
|
|
6
6
|
class ApiResponseDto {
|
|
7
7
|
constructor(success, message, data, statusCode = common_1.HttpStatus.OK) {
|
|
8
8
|
this.success = success;
|
|
@@ -12,7 +12,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
12
12
|
exports.PaginationResponseDto = exports.PaginationMetaDto = exports.PaginationDto = void 0;
|
|
13
13
|
const class_validator_1 = require("class-validator");
|
|
14
14
|
const class_transformer_1 = require("class-transformer");
|
|
15
|
-
const messages_constants_1 = require("
|
|
15
|
+
const messages_constants_1 = require("../../constants/messages.constants");
|
|
16
16
|
class PaginationDto {
|
|
17
17
|
constructor() {
|
|
18
18
|
this.page = 1;
|
|
@@ -9,8 +9,8 @@ var HttpExceptionFilter_1;
|
|
|
9
9
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
10
10
|
exports.HttpExceptionFilter = void 0;
|
|
11
11
|
const common_1 = require("@nestjs/common");
|
|
12
|
-
const api_response_dto_1 = require("
|
|
13
|
-
const messages_constants_1 = require("
|
|
12
|
+
const api_response_dto_1 = require("../dtos/api-response.dto");
|
|
13
|
+
const messages_constants_1 = require("../../constants/messages.constants");
|
|
14
14
|
let HttpExceptionFilter = HttpExceptionFilter_1 = class HttpExceptionFilter {
|
|
15
15
|
constructor() {
|
|
16
16
|
this.logger = new common_1.Logger(HttpExceptionFilter_1.name);
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { CanActivate, ExecutionContext } from "@nestjs/common";
|
|
2
|
-
import { CoreJwtService } from "
|
|
2
|
+
import { CoreJwtService } from "../services/jwt.service";
|
|
3
3
|
export declare class InternalAuthGuard implements CanActivate {
|
|
4
4
|
private readonly coreJwtService;
|
|
5
5
|
constructor(coreJwtService: CoreJwtService);
|
|
@@ -11,8 +11,8 @@ var __metadata = (this && this.__metadata) || function (k, v) {
|
|
|
11
11
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
12
|
exports.InternalAuthGuard = void 0;
|
|
13
13
|
const common_1 = require("@nestjs/common");
|
|
14
|
-
const jwt_service_1 = require("
|
|
15
|
-
const messages_constants_1 = require("
|
|
14
|
+
const jwt_service_1 = require("../services/jwt.service");
|
|
15
|
+
const messages_constants_1 = require("../../constants/messages.constants");
|
|
16
16
|
let InternalAuthGuard = class InternalAuthGuard {
|
|
17
17
|
constructor(coreJwtService) {
|
|
18
18
|
this.coreJwtService = coreJwtService;
|
|
@@ -1,10 +1,11 @@
|
|
|
1
1
|
import { ExecutionContext } from "@nestjs/common";
|
|
2
2
|
import { Reflector } from "@nestjs/core";
|
|
3
|
-
import { CoreJwtService } from "
|
|
3
|
+
import { CoreJwtService } from "../services/jwt.service";
|
|
4
4
|
declare const JwtAuthGuard_base: import("@nestjs/passport").Type<import("@nestjs/passport").IAuthGuard>;
|
|
5
5
|
export declare class JwtAuthGuard extends JwtAuthGuard_base {
|
|
6
6
|
private reflector;
|
|
7
7
|
private coreJwtService;
|
|
8
|
+
private readonly logger;
|
|
8
9
|
constructor(reflector: Reflector, coreJwtService: CoreJwtService);
|
|
9
10
|
canActivate(context: ExecutionContext): Promise<boolean>;
|
|
10
11
|
handleRequest(err: any, user: any, info: any): any;
|
|
@@ -8,22 +8,25 @@ var __decorate = (this && this.__decorate) || function (decorators, target, key,
|
|
|
8
8
|
var __metadata = (this && this.__metadata) || function (k, v) {
|
|
9
9
|
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
10
10
|
};
|
|
11
|
+
var JwtAuthGuard_1;
|
|
11
12
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
13
|
exports.JwtAuthGuard = void 0;
|
|
13
14
|
const common_1 = require("@nestjs/common");
|
|
14
15
|
const passport_1 = require("@nestjs/passport");
|
|
15
16
|
const core_1 = require("@nestjs/core");
|
|
16
|
-
const jwt_service_1 = require("
|
|
17
|
-
const cookie_service_1 = require("
|
|
18
|
-
const messages_constants_1 = require("
|
|
19
|
-
|
|
17
|
+
const jwt_service_1 = require("../services/jwt.service");
|
|
18
|
+
const cookie_service_1 = require("../services/cookie.service");
|
|
19
|
+
const messages_constants_1 = require("../../constants/messages.constants");
|
|
20
|
+
const public_decorator_1 = require("../decorators/public.decorator");
|
|
21
|
+
let JwtAuthGuard = JwtAuthGuard_1 = class JwtAuthGuard extends (0, passport_1.AuthGuard)("jwt") {
|
|
20
22
|
constructor(reflector, coreJwtService) {
|
|
21
23
|
super();
|
|
22
24
|
this.reflector = reflector;
|
|
23
25
|
this.coreJwtService = coreJwtService;
|
|
26
|
+
this.logger = new common_1.Logger(JwtAuthGuard_1.name);
|
|
24
27
|
}
|
|
25
28
|
async canActivate(context) {
|
|
26
|
-
const isPublic = this.reflector.getAllAndOverride(
|
|
29
|
+
const isPublic = this.reflector.getAllAndOverride(public_decorator_1.IS_PUBLIC_KEY, [
|
|
27
30
|
context.getHandler(),
|
|
28
31
|
context.getClass(),
|
|
29
32
|
]);
|
|
@@ -31,10 +34,12 @@ let JwtAuthGuard = class JwtAuthGuard extends (0, passport_1.AuthGuard)("jwt") {
|
|
|
31
34
|
return true;
|
|
32
35
|
const request = context.switchToHttp().getRequest();
|
|
33
36
|
const tokens = cookie_service_1.CookieService.extractTokensFromCookie(request);
|
|
37
|
+
this.logger.log(`Access token: ${tokens?.accessToken}`);
|
|
34
38
|
if (!tokens?.accessToken) {
|
|
35
39
|
throw new common_1.UnauthorizedException(messages_constants_1.MESSAGES.AUTH.NO_TOKEN);
|
|
36
40
|
}
|
|
37
41
|
const currentUser = await this.coreJwtService.getCurrentUser(tokens.accessToken);
|
|
42
|
+
this.logger.log(`Current user: ${currentUser}`);
|
|
38
43
|
if (!currentUser) {
|
|
39
44
|
throw new common_1.UnauthorizedException(messages_constants_1.MESSAGES.AUTH.INVALID_TOKEN);
|
|
40
45
|
}
|
|
@@ -42,13 +47,14 @@ let JwtAuthGuard = class JwtAuthGuard extends (0, passport_1.AuthGuard)("jwt") {
|
|
|
42
47
|
return true;
|
|
43
48
|
}
|
|
44
49
|
handleRequest(err, user, info) {
|
|
50
|
+
this.logger.log(`Error: ${err}`);
|
|
45
51
|
if (err || !user)
|
|
46
52
|
new common_1.UnauthorizedException(messages_constants_1.MESSAGES.AUTH.INVALID_TOKEN);
|
|
47
53
|
return user;
|
|
48
54
|
}
|
|
49
55
|
};
|
|
50
56
|
exports.JwtAuthGuard = JwtAuthGuard;
|
|
51
|
-
exports.JwtAuthGuard = JwtAuthGuard = __decorate([
|
|
57
|
+
exports.JwtAuthGuard = JwtAuthGuard = JwtAuthGuard_1 = __decorate([
|
|
52
58
|
(0, common_1.Injectable)(),
|
|
53
59
|
__metadata("design:paramtypes", [core_1.Reflector,
|
|
54
60
|
jwt_service_1.CoreJwtService])
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"jwt-auth.guard.js","sourceRoot":"","sources":["../../../src/core/guards/jwt-auth.guard.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"jwt-auth.guard.js","sourceRoot":"","sources":["../../../src/core/guards/jwt-auth.guard.ts"],"names":[],"mappings":";;;;;;;;;;;;;AAAA,2CAKwB;AACxB,+CAA6C;AAC7C,uCAAyC;AACzC,4DAA4D;AAC5D,kEAA8D;AAC9D,sEAAyD;AACzD,wEAAkE;AAG3D,IAAM,YAAY,oBAAlB,MAAM,YAAa,SAAQ,IAAA,oBAAS,EAAC,KAAK,CAAC;IAGhD,YACU,SAAoB,EACpB,cAA8B;QAEtC,KAAK,EAAE,CAAC;QAHA,cAAS,GAAT,SAAS,CAAW;QACpB,mBAAc,GAAd,cAAc,CAAgB;QAJvB,WAAM,GAAG,IAAI,eAAM,CAAC,cAAY,CAAC,IAAI,CAAC,CAAC;IAOxD,CAAC;IAED,KAAK,CAAC,WAAW,CAAC,OAAyB;QAEzC,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAC,iBAAiB,CAAU,gCAAa,EAAE;YACxE,OAAO,CAAC,UAAU,EAAE;YACpB,OAAO,CAAC,QAAQ,EAAE;SACnB,CAAC,CAAC;QAEH,IAAI,QAAQ;YAAE,OAAO,IAAI,CAAC;QAE1B,MAAM,OAAO,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC,UAAU,EAAE,CAAC;QACpD,MAAM,MAAM,GAAG,8BAAa,CAAC,uBAAuB,CAAC,OAAO,CAAC,CAAC;QAE9D,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,iBAAiB,MAAM,EAAE,WAAW,EAAE,CAAC,CAAC;QACxD,IAAI,CAAC,MAAM,EAAE,WAAW,EAAE,CAAC;YACzB,MAAM,IAAI,8BAAqB,CAAC,6BAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAC1D,CAAC;QAED,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC,cAAc,CAAC,cAAc,CAC1D,MAAM,CAAC,WAAW,CACnB,CAAC;QAEF,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,iBAAiB,WAAW,EAAE,CAAC,CAAC;QAChD,IAAI,CAAC,WAAW,EAAE,CAAC;YACjB,MAAM,IAAI,8BAAqB,CAAC,6BAAQ,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;QAC/D,CAAC;QAED,OAAO,CAAC,IAAI,GAAG,WAAW,CAAC;QAE3B,OAAO,IAAI,CAAC;IACd,CAAC;IAED,aAAa,CAAC,GAAQ,EAAE,IAAS,EAAE,IAAS;QAC1C,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,UAAU,GAAG,EAAE,CAAC,CAAC;QACjC,IAAI,GAAG,IAAI,CAAC,IAAI;YAAE,IAAI,8BAAqB,CAAC,6BAAQ,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;QACzE,OAAO,IAAI,CAAC;IACd,CAAC;CACF,CAAA;AA9CY,oCAAY;uBAAZ,YAAY;IADxB,IAAA,mBAAU,GAAE;qCAKU,gBAAS;QACJ,4BAAc;GAL7B,YAAY,CA8CxB"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { CanActivate, ExecutionContext } from "@nestjs/common";
|
|
2
2
|
import { Reflector } from "@nestjs/core";
|
|
3
|
-
import { CoreJwtService } from "
|
|
3
|
+
import { CoreJwtService } from "../services/jwt.service";
|
|
4
4
|
export declare class PermissionGuard implements CanActivate {
|
|
5
5
|
private reflector;
|
|
6
6
|
private coreJwtService;
|
|
@@ -12,11 +12,11 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
12
12
|
exports.PermissionGuard = void 0;
|
|
13
13
|
const common_1 = require("@nestjs/common");
|
|
14
14
|
const core_1 = require("@nestjs/core");
|
|
15
|
-
const require_permissions_decorator_1 = require("
|
|
16
|
-
const public_decorator_1 = require("
|
|
17
|
-
const jwt_service_1 = require("
|
|
18
|
-
const cookie_service_1 = require("
|
|
19
|
-
const messages_constants_1 = require("
|
|
15
|
+
const require_permissions_decorator_1 = require("../decorators/require-permissions.decorator");
|
|
16
|
+
const public_decorator_1 = require("../decorators/public.decorator");
|
|
17
|
+
const jwt_service_1 = require("../services/jwt.service");
|
|
18
|
+
const cookie_service_1 = require("../services/cookie.service");
|
|
19
|
+
const messages_constants_1 = require("../../constants/messages.constants");
|
|
20
20
|
let PermissionGuard = class PermissionGuard {
|
|
21
21
|
constructor(reflector, coreJwtService) {
|
|
22
22
|
this.reflector = reflector;
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { NestInterceptor, ExecutionContext, CallHandler } from "@nestjs/common";
|
|
2
2
|
import { Observable } from "rxjs";
|
|
3
|
-
import { RequestInfoService } from "
|
|
3
|
+
import { RequestInfoService } from "../services/request-info.service";
|
|
4
4
|
export declare class RequestContextInterceptor implements NestInterceptor {
|
|
5
5
|
private requestInfoService;
|
|
6
6
|
constructor(requestInfoService: RequestInfoService);
|
|
@@ -11,8 +11,8 @@ var __metadata = (this && this.__metadata) || function (k, v) {
|
|
|
11
11
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
12
|
exports.RequestContextInterceptor = void 0;
|
|
13
13
|
const common_1 = require("@nestjs/common");
|
|
14
|
-
const request_context_service_1 = require("
|
|
15
|
-
const request_info_service_1 = require("
|
|
14
|
+
const request_context_service_1 = require("../services/request-context.service");
|
|
15
|
+
const request_info_service_1 = require("../services/request-info.service");
|
|
16
16
|
let RequestContextInterceptor = class RequestContextInterceptor {
|
|
17
17
|
constructor(requestInfoService) {
|
|
18
18
|
this.requestInfoService = requestInfoService;
|
|
@@ -9,7 +9,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
9
9
|
exports.CacheService = void 0;
|
|
10
10
|
const common_1 = require("@nestjs/common");
|
|
11
11
|
const ioredis_1 = require("ioredis");
|
|
12
|
-
const redis_config_1 = require("
|
|
12
|
+
const redis_config_1 = require("../../config/redis.config");
|
|
13
13
|
let CacheService = class CacheService {
|
|
14
14
|
async onModuleInit() {
|
|
15
15
|
this.redis = new ioredis_1.default(redis_config_1.redisConfig);
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.CookieService = void 0;
|
|
4
|
-
const cookie_config_1 = require("
|
|
4
|
+
const cookie_config_1 = require("../../config/cookie.config");
|
|
5
5
|
class CookieService {
|
|
6
6
|
static setAuthCookies(res, accessToken, refreshToken, refreshTokenExpiresAt) {
|
|
7
7
|
const authData = {
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { JwtService } from "@nestjs/jwt";
|
|
2
|
-
import { SessionService, CurrentUserDto } from "
|
|
2
|
+
import { SessionService, CurrentUserDto } from "../services/session.service";
|
|
3
3
|
export interface JwtTokenData {
|
|
4
4
|
sub: string | number;
|
|
5
5
|
sessionId?: string;
|
|
@@ -13,6 +13,7 @@ export interface JwtValidationResult {
|
|
|
13
13
|
export declare class CoreJwtService {
|
|
14
14
|
private readonly jwtService;
|
|
15
15
|
private readonly sessionService;
|
|
16
|
+
private readonly logger;
|
|
16
17
|
constructor(jwtService: JwtService, sessionService: SessionService);
|
|
17
18
|
createAccessToken(sessionData: CurrentUserDto): Promise<string>;
|
|
18
19
|
createSimpleAccessToken(userId: string | number, email: string): string;
|
|
@@ -8,19 +8,21 @@ var __decorate = (this && this.__decorate) || function (decorators, target, key,
|
|
|
8
8
|
var __metadata = (this && this.__metadata) || function (k, v) {
|
|
9
9
|
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
10
10
|
};
|
|
11
|
+
var CoreJwtService_1;
|
|
11
12
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
13
|
exports.CoreJwtService = void 0;
|
|
13
14
|
const common_1 = require("@nestjs/common");
|
|
14
15
|
const jwt_1 = require("@nestjs/jwt");
|
|
15
|
-
const session_service_1 = require("
|
|
16
|
-
const date_utils_1 = require("
|
|
17
|
-
const jwt_config_1 = require("
|
|
18
|
-
const internal_config_1 = require("
|
|
19
|
-
const messages_constants_1 = require("
|
|
20
|
-
let CoreJwtService = class CoreJwtService {
|
|
16
|
+
const session_service_1 = require("../services/session.service");
|
|
17
|
+
const date_utils_1 = require("../../utils/date.utils");
|
|
18
|
+
const jwt_config_1 = require("../../config/jwt.config");
|
|
19
|
+
const internal_config_1 = require("../../config/internal.config");
|
|
20
|
+
const messages_constants_1 = require("../../constants/messages.constants");
|
|
21
|
+
let CoreJwtService = CoreJwtService_1 = class CoreJwtService {
|
|
21
22
|
constructor(jwtService, sessionService) {
|
|
22
23
|
this.jwtService = jwtService;
|
|
23
24
|
this.sessionService = sessionService;
|
|
25
|
+
this.logger = new common_1.Logger(CoreJwtService_1.name);
|
|
24
26
|
}
|
|
25
27
|
async createAccessToken(sessionData) {
|
|
26
28
|
const ttlSec = date_utils_1.DateUtils.parseExpirationTime(jwt_config_1.jwtConfig.expiresIn);
|
|
@@ -164,9 +166,11 @@ let CoreJwtService = class CoreJwtService {
|
|
|
164
166
|
async getCurrentUser(accessToken) {
|
|
165
167
|
try {
|
|
166
168
|
const payload = this.decodeToken(accessToken);
|
|
169
|
+
this.logger.log(`Payload: ${JSON.stringify(payload)}`);
|
|
167
170
|
if (!payload?.sessionId)
|
|
168
171
|
return null;
|
|
169
172
|
const sessionData = await this.sessionService.getSession(payload.sessionId);
|
|
173
|
+
this.logger.log(`Session data: ${JSON.stringify(sessionData)}`);
|
|
170
174
|
return sessionData;
|
|
171
175
|
}
|
|
172
176
|
catch (error) {
|
|
@@ -179,7 +183,7 @@ let CoreJwtService = class CoreJwtService {
|
|
|
179
183
|
}
|
|
180
184
|
};
|
|
181
185
|
exports.CoreJwtService = CoreJwtService;
|
|
182
|
-
exports.CoreJwtService = CoreJwtService = __decorate([
|
|
186
|
+
exports.CoreJwtService = CoreJwtService = CoreJwtService_1 = __decorate([
|
|
183
187
|
(0, common_1.Injectable)(),
|
|
184
188
|
__metadata("design:paramtypes", [jwt_1.JwtService,
|
|
185
189
|
session_service_1.SessionService])
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"jwt.service.js","sourceRoot":"","sources":["../../../src/core/services/jwt.service.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"jwt.service.js","sourceRoot":"","sources":["../../../src/core/services/jwt.service.ts"],"names":[],"mappings":"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"}
|