@aifabrix/miso-client 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +147 -0
- package/dist/index.d.ts +111 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +199 -0
- package/dist/index.js.map +1 -0
- package/dist/services/auth.service.d.ts +33 -0
- package/dist/services/auth.service.d.ts.map +1 -0
- package/dist/services/auth.service.js +79 -0
- package/dist/services/auth.service.js.map +1 -0
- package/dist/services/logger.service.d.ts +107 -0
- package/dist/services/logger.service.d.ts.map +1 -0
- package/dist/services/logger.service.js +260 -0
- package/dist/services/logger.service.js.map +1 -0
- package/dist/services/permission.service.d.ts +37 -0
- package/dist/services/permission.service.d.ts.map +1 -0
- package/dist/services/permission.service.js +128 -0
- package/dist/services/permission.service.js.map +1 -0
- package/dist/services/redis.service.d.ts +18 -0
- package/dist/services/redis.service.d.ts.map +1 -0
- package/dist/services/redis.service.js +112 -0
- package/dist/services/redis.service.js.map +1 -0
- package/dist/services/role.service.d.ts +33 -0
- package/dist/services/role.service.d.ts.map +1 -0
- package/dist/services/role.service.js +106 -0
- package/dist/services/role.service.js.map +1 -0
- package/dist/types/config.types.d.ts +66 -0
- package/dist/types/config.types.d.ts.map +1 -0
- package/dist/types/config.types.js +6 -0
- package/dist/types/config.types.js.map +1 -0
- package/dist/utils/data-masker.d.ts +26 -0
- package/dist/utils/data-masker.d.ts.map +1 -0
- package/dist/utils/data-masker.js +121 -0
- package/dist/utils/data-masker.js.map +1 -0
- package/dist/utils/http-client.d.ts +16 -0
- package/dist/utils/http-client.d.ts.map +1 -0
- package/dist/utils/http-client.js +79 -0
- package/dist/utils/http-client.js.map +1 -0
- package/package.json +60 -0
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Logger service for application logging and audit events
|
|
3
|
+
*/
|
|
4
|
+
import { RedisService } from './redis.service';
|
|
5
|
+
import { MisoClientConfig } from '../types/config.types';
|
|
6
|
+
export interface ClientLoggingOptions {
|
|
7
|
+
applicationId?: string;
|
|
8
|
+
userId?: string;
|
|
9
|
+
correlationId?: string;
|
|
10
|
+
requestId?: string;
|
|
11
|
+
sessionId?: string;
|
|
12
|
+
token?: string;
|
|
13
|
+
maskSensitiveData?: boolean;
|
|
14
|
+
performanceMetrics?: boolean;
|
|
15
|
+
}
|
|
16
|
+
export interface PerformanceMetrics {
|
|
17
|
+
startTime: number;
|
|
18
|
+
endTime?: number;
|
|
19
|
+
duration?: number;
|
|
20
|
+
memoryUsage?: {
|
|
21
|
+
rss: number;
|
|
22
|
+
heapTotal: number;
|
|
23
|
+
heapUsed: number;
|
|
24
|
+
external: number;
|
|
25
|
+
arrayBuffers: number;
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
export declare class LoggerService {
|
|
29
|
+
private httpClient;
|
|
30
|
+
private redis;
|
|
31
|
+
private config;
|
|
32
|
+
private maskSensitiveData;
|
|
33
|
+
private correlationCounter;
|
|
34
|
+
private performanceMetrics;
|
|
35
|
+
constructor(config: MisoClientConfig, redis: RedisService);
|
|
36
|
+
/**
|
|
37
|
+
* Enable or disable sensitive data masking
|
|
38
|
+
*/
|
|
39
|
+
setMasking(enabled: boolean): void;
|
|
40
|
+
/**
|
|
41
|
+
* Generate unique correlation ID for request tracking
|
|
42
|
+
*/
|
|
43
|
+
private generateCorrelationId;
|
|
44
|
+
/**
|
|
45
|
+
* Extract JWT token information
|
|
46
|
+
*/
|
|
47
|
+
private extractJWTContext;
|
|
48
|
+
/**
|
|
49
|
+
* Extract metadata from environment (browser or Node.js)
|
|
50
|
+
*/
|
|
51
|
+
private extractMetadata;
|
|
52
|
+
/**
|
|
53
|
+
* Start performance tracking
|
|
54
|
+
*/
|
|
55
|
+
startPerformanceTracking(operationId: string): void;
|
|
56
|
+
/**
|
|
57
|
+
* End performance tracking and get metrics
|
|
58
|
+
*/
|
|
59
|
+
endPerformanceTracking(operationId: string): PerformanceMetrics | null;
|
|
60
|
+
/**
|
|
61
|
+
* Log error message with optional stack trace and enhanced options
|
|
62
|
+
*/
|
|
63
|
+
error(message: string, context?: Record<string, unknown>, stackTrace?: string, options?: ClientLoggingOptions): Promise<void>;
|
|
64
|
+
/**
|
|
65
|
+
* Log audit event with enhanced options
|
|
66
|
+
*/
|
|
67
|
+
audit(action: string, resource: string, context?: Record<string, unknown>, options?: ClientLoggingOptions): Promise<void>;
|
|
68
|
+
/**
|
|
69
|
+
* Log info message with enhanced options
|
|
70
|
+
*/
|
|
71
|
+
info(message: string, context?: Record<string, unknown>, options?: ClientLoggingOptions): Promise<void>;
|
|
72
|
+
/**
|
|
73
|
+
* Log debug message with enhanced options
|
|
74
|
+
*/
|
|
75
|
+
debug(message: string, context?: Record<string, unknown>, options?: ClientLoggingOptions): Promise<void>;
|
|
76
|
+
/**
|
|
77
|
+
* Internal log method with enhanced features
|
|
78
|
+
*/
|
|
79
|
+
private log;
|
|
80
|
+
/**
|
|
81
|
+
* Method chaining support for complex logging scenarios
|
|
82
|
+
*/
|
|
83
|
+
withContext(context: Record<string, unknown>): LoggerChain;
|
|
84
|
+
withToken(token: string): LoggerChain;
|
|
85
|
+
withPerformance(): LoggerChain;
|
|
86
|
+
withoutMasking(): LoggerChain;
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* Method chaining class for fluent logging API
|
|
90
|
+
*/
|
|
91
|
+
export declare class LoggerChain {
|
|
92
|
+
private logger;
|
|
93
|
+
private context;
|
|
94
|
+
private options;
|
|
95
|
+
constructor(logger: LoggerService, context?: Record<string, unknown>, options?: ClientLoggingOptions);
|
|
96
|
+
addContext(key: string, value: unknown): LoggerChain;
|
|
97
|
+
addUser(userId: string): LoggerChain;
|
|
98
|
+
addApplication(applicationId: string): LoggerChain;
|
|
99
|
+
addCorrelation(correlationId: string): LoggerChain;
|
|
100
|
+
withToken(token: string): LoggerChain;
|
|
101
|
+
withPerformance(): LoggerChain;
|
|
102
|
+
withoutMasking(): LoggerChain;
|
|
103
|
+
error(message: string, stackTrace?: string): Promise<void>;
|
|
104
|
+
info(message: string): Promise<void>;
|
|
105
|
+
audit(action: string, resource: string): Promise<void>;
|
|
106
|
+
}
|
|
107
|
+
//# sourceMappingURL=logger.service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logger.service.d.ts","sourceRoot":"","sources":["../../src/services/logger.service.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,260 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Logger service for application logging and audit events
|
|
4
|
+
*/
|
|
5
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
6
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
7
|
+
};
|
|
8
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9
|
+
exports.LoggerChain = exports.LoggerService = void 0;
|
|
10
|
+
const http_client_1 = require("../utils/http-client");
|
|
11
|
+
const data_masker_1 = require("../utils/data-masker");
|
|
12
|
+
const jsonwebtoken_1 = __importDefault(require("jsonwebtoken"));
|
|
13
|
+
class LoggerService {
|
|
14
|
+
constructor(config, redis) {
|
|
15
|
+
this.maskSensitiveData = true; // Default: mask sensitive data
|
|
16
|
+
this.correlationCounter = 0;
|
|
17
|
+
this.performanceMetrics = new Map();
|
|
18
|
+
this.config = config;
|
|
19
|
+
this.redis = redis;
|
|
20
|
+
this.httpClient = new http_client_1.HttpClient(config);
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Enable or disable sensitive data masking
|
|
24
|
+
*/
|
|
25
|
+
setMasking(enabled) {
|
|
26
|
+
this.maskSensitiveData = enabled;
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Generate unique correlation ID for request tracking
|
|
30
|
+
*/
|
|
31
|
+
generateCorrelationId() {
|
|
32
|
+
this.correlationCounter = (this.correlationCounter + 1) % 10000;
|
|
33
|
+
const timestamp = Date.now();
|
|
34
|
+
const random = Math.random().toString(36).substring(2, 8);
|
|
35
|
+
return `${this.config.applicationKey}-${timestamp}-${this.correlationCounter}-${random}`;
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Extract JWT token information
|
|
39
|
+
*/
|
|
40
|
+
extractJWTContext(token) {
|
|
41
|
+
if (!token)
|
|
42
|
+
return {};
|
|
43
|
+
try {
|
|
44
|
+
const decoded = jsonwebtoken_1.default.decode(token);
|
|
45
|
+
if (!decoded)
|
|
46
|
+
return {};
|
|
47
|
+
return {
|
|
48
|
+
userId: decoded.sub || decoded.userId || decoded.user_id,
|
|
49
|
+
applicationId: decoded.applicationId || decoded.app_id,
|
|
50
|
+
sessionId: decoded.sessionId || decoded.sid,
|
|
51
|
+
roles: decoded.roles || decoded.realm_access?.roles || [],
|
|
52
|
+
permissions: decoded.permissions || decoded.scope?.split(' ') || []
|
|
53
|
+
};
|
|
54
|
+
}
|
|
55
|
+
catch (error) {
|
|
56
|
+
// JWT parsing failed, return empty context
|
|
57
|
+
return {};
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Extract metadata from environment (browser or Node.js)
|
|
62
|
+
*/
|
|
63
|
+
extractMetadata() {
|
|
64
|
+
const metadata = {};
|
|
65
|
+
// Try to extract browser metadata
|
|
66
|
+
if (typeof globalThis !== 'undefined' && 'window' in globalThis) {
|
|
67
|
+
const win = globalThis;
|
|
68
|
+
metadata.userAgent = win.window?.navigator?.userAgent;
|
|
69
|
+
metadata.hostname = win.window?.location?.hostname;
|
|
70
|
+
}
|
|
71
|
+
// Try to extract Node.js metadata
|
|
72
|
+
if (typeof process !== 'undefined' && process.env) {
|
|
73
|
+
metadata.hostname = process.env['HOSTNAME'] || 'unknown';
|
|
74
|
+
}
|
|
75
|
+
return metadata;
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* Start performance tracking
|
|
79
|
+
*/
|
|
80
|
+
startPerformanceTracking(operationId) {
|
|
81
|
+
this.performanceMetrics.set(operationId, {
|
|
82
|
+
startTime: Date.now(),
|
|
83
|
+
memoryUsage: typeof process !== 'undefined' ? process.memoryUsage() : undefined
|
|
84
|
+
});
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* End performance tracking and get metrics
|
|
88
|
+
*/
|
|
89
|
+
endPerformanceTracking(operationId) {
|
|
90
|
+
const metrics = this.performanceMetrics.get(operationId);
|
|
91
|
+
if (!metrics)
|
|
92
|
+
return null;
|
|
93
|
+
metrics.endTime = Date.now();
|
|
94
|
+
metrics.duration = metrics.endTime - metrics.startTime;
|
|
95
|
+
if (typeof process !== 'undefined') {
|
|
96
|
+
metrics.memoryUsage = process.memoryUsage();
|
|
97
|
+
}
|
|
98
|
+
this.performanceMetrics.delete(operationId);
|
|
99
|
+
return metrics;
|
|
100
|
+
}
|
|
101
|
+
/**
|
|
102
|
+
* Log error message with optional stack trace and enhanced options
|
|
103
|
+
*/
|
|
104
|
+
async error(message, context, stackTrace, options) {
|
|
105
|
+
await this.log('error', message, context, stackTrace, options);
|
|
106
|
+
}
|
|
107
|
+
/**
|
|
108
|
+
* Log audit event with enhanced options
|
|
109
|
+
*/
|
|
110
|
+
async audit(action, resource, context, options) {
|
|
111
|
+
const auditContext = {
|
|
112
|
+
action,
|
|
113
|
+
resource,
|
|
114
|
+
...context
|
|
115
|
+
};
|
|
116
|
+
await this.log('audit', `Audit: ${action} on ${resource}`, auditContext, undefined, options);
|
|
117
|
+
}
|
|
118
|
+
/**
|
|
119
|
+
* Log info message with enhanced options
|
|
120
|
+
*/
|
|
121
|
+
async info(message, context, options) {
|
|
122
|
+
await this.log('info', message, context, undefined, options);
|
|
123
|
+
}
|
|
124
|
+
/**
|
|
125
|
+
* Log debug message with enhanced options
|
|
126
|
+
*/
|
|
127
|
+
async debug(message, context, options) {
|
|
128
|
+
if (this.config.logLevel === 'debug') {
|
|
129
|
+
await this.log('debug', message, context, undefined, options);
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
/**
|
|
133
|
+
* Internal log method with enhanced features
|
|
134
|
+
*/
|
|
135
|
+
async log(level, message, context, stackTrace, options) {
|
|
136
|
+
// Extract JWT context if token provided
|
|
137
|
+
const jwtContext = options?.token ? this.extractJWTContext(options.token) : {};
|
|
138
|
+
// Extract environment metadata
|
|
139
|
+
const metadata = this.extractMetadata();
|
|
140
|
+
// Generate correlation ID if not provided
|
|
141
|
+
const correlationId = options?.correlationId || this.generateCorrelationId();
|
|
142
|
+
// Mask sensitive data in context if enabled
|
|
143
|
+
const maskSensitive = options?.maskSensitiveData !== false && this.maskSensitiveData;
|
|
144
|
+
const maskedContext = maskSensitive && context
|
|
145
|
+
? data_masker_1.DataMasker.maskSensitiveData(context)
|
|
146
|
+
: context;
|
|
147
|
+
// Add performance metrics if requested
|
|
148
|
+
let enhancedContext = maskedContext;
|
|
149
|
+
if (options?.performanceMetrics && typeof process !== 'undefined') {
|
|
150
|
+
enhancedContext = {
|
|
151
|
+
...enhancedContext,
|
|
152
|
+
performance: {
|
|
153
|
+
memoryUsage: process.memoryUsage(),
|
|
154
|
+
uptime: process.uptime()
|
|
155
|
+
}
|
|
156
|
+
};
|
|
157
|
+
}
|
|
158
|
+
const logEntry = {
|
|
159
|
+
timestamp: new Date().toISOString(),
|
|
160
|
+
level,
|
|
161
|
+
environment: this.config.environment,
|
|
162
|
+
application: this.config.applicationKey,
|
|
163
|
+
applicationId: this.config.applicationId,
|
|
164
|
+
message,
|
|
165
|
+
context: enhancedContext,
|
|
166
|
+
stackTrace,
|
|
167
|
+
correlationId,
|
|
168
|
+
userId: options?.userId || jwtContext.userId,
|
|
169
|
+
sessionId: options?.sessionId || jwtContext.sessionId,
|
|
170
|
+
requestId: options?.requestId,
|
|
171
|
+
...metadata
|
|
172
|
+
};
|
|
173
|
+
// Try Redis first (if available)
|
|
174
|
+
if (this.redis.isConnected()) {
|
|
175
|
+
const queueName = `logs:${this.config.environment}:${this.config.applicationKey}`;
|
|
176
|
+
const success = await this.redis.rpush(queueName, JSON.stringify(logEntry));
|
|
177
|
+
if (success) {
|
|
178
|
+
return; // Successfully queued in Redis
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
// Fallback to HTTP endpoint with API key
|
|
182
|
+
try {
|
|
183
|
+
const headers = {};
|
|
184
|
+
if (this.config.apiKey) {
|
|
185
|
+
headers['x-api-key'] = this.config.apiKey;
|
|
186
|
+
}
|
|
187
|
+
await this.httpClient.post('/logs', logEntry, { headers });
|
|
188
|
+
}
|
|
189
|
+
catch (error) {
|
|
190
|
+
// Failed to send log to controller
|
|
191
|
+
// Silently fail to avoid infinite logging loops
|
|
192
|
+
// Application should implement retry or buffer strategy if needed
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
/**
|
|
196
|
+
* Method chaining support for complex logging scenarios
|
|
197
|
+
*/
|
|
198
|
+
withContext(context) {
|
|
199
|
+
return new LoggerChain(this, context);
|
|
200
|
+
}
|
|
201
|
+
withToken(token) {
|
|
202
|
+
return new LoggerChain(this, {}, { token });
|
|
203
|
+
}
|
|
204
|
+
withPerformance() {
|
|
205
|
+
return new LoggerChain(this, {}, { performanceMetrics: true });
|
|
206
|
+
}
|
|
207
|
+
withoutMasking() {
|
|
208
|
+
return new LoggerChain(this, {}, { maskSensitiveData: false });
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
exports.LoggerService = LoggerService;
|
|
212
|
+
/**
|
|
213
|
+
* Method chaining class for fluent logging API
|
|
214
|
+
*/
|
|
215
|
+
class LoggerChain {
|
|
216
|
+
constructor(logger, context = {}, options = {}) {
|
|
217
|
+
this.logger = logger;
|
|
218
|
+
this.context = context;
|
|
219
|
+
this.options = options;
|
|
220
|
+
}
|
|
221
|
+
addContext(key, value) {
|
|
222
|
+
this.context[key] = value;
|
|
223
|
+
return this;
|
|
224
|
+
}
|
|
225
|
+
addUser(userId) {
|
|
226
|
+
this.options.userId = userId;
|
|
227
|
+
return this;
|
|
228
|
+
}
|
|
229
|
+
addApplication(applicationId) {
|
|
230
|
+
this.options.applicationId = applicationId;
|
|
231
|
+
return this;
|
|
232
|
+
}
|
|
233
|
+
addCorrelation(correlationId) {
|
|
234
|
+
this.options.correlationId = correlationId;
|
|
235
|
+
return this;
|
|
236
|
+
}
|
|
237
|
+
withToken(token) {
|
|
238
|
+
this.options.token = token;
|
|
239
|
+
return this;
|
|
240
|
+
}
|
|
241
|
+
withPerformance() {
|
|
242
|
+
this.options.performanceMetrics = true;
|
|
243
|
+
return this;
|
|
244
|
+
}
|
|
245
|
+
withoutMasking() {
|
|
246
|
+
this.options.maskSensitiveData = false;
|
|
247
|
+
return this;
|
|
248
|
+
}
|
|
249
|
+
async error(message, stackTrace) {
|
|
250
|
+
await this.logger.error(message, this.context, stackTrace, this.options);
|
|
251
|
+
}
|
|
252
|
+
async info(message) {
|
|
253
|
+
await this.logger.info(message, this.context, this.options);
|
|
254
|
+
}
|
|
255
|
+
async audit(action, resource) {
|
|
256
|
+
await this.logger.audit(action, resource, this.context, this.options);
|
|
257
|
+
}
|
|
258
|
+
}
|
|
259
|
+
exports.LoggerChain = LoggerChain;
|
|
260
|
+
//# sourceMappingURL=logger.service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logger.service.js","sourceRoot":"","sources":["../../src/services/logger.service.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Permission service for user authorization with Redis caching
|
|
3
|
+
*/
|
|
4
|
+
import { RedisService } from './redis.service';
|
|
5
|
+
import { MisoClientConfig } from '../types/config.types';
|
|
6
|
+
export declare class PermissionService {
|
|
7
|
+
private httpClient;
|
|
8
|
+
private redis;
|
|
9
|
+
private config;
|
|
10
|
+
private permissionTTL;
|
|
11
|
+
constructor(config: MisoClientConfig, redis: RedisService);
|
|
12
|
+
/**
|
|
13
|
+
* Get user permissions with Redis caching
|
|
14
|
+
*/
|
|
15
|
+
getPermissions(token: string): Promise<string[]>;
|
|
16
|
+
/**
|
|
17
|
+
* Check if user has specific permission
|
|
18
|
+
*/
|
|
19
|
+
hasPermission(token: string, permission: string): Promise<boolean>;
|
|
20
|
+
/**
|
|
21
|
+
* Check if user has any of the specified permissions
|
|
22
|
+
*/
|
|
23
|
+
hasAnyPermission(token: string, permissions: string[]): Promise<boolean>;
|
|
24
|
+
/**
|
|
25
|
+
* Check if user has all of the specified permissions
|
|
26
|
+
*/
|
|
27
|
+
hasAllPermissions(token: string, permissions: string[]): Promise<boolean>;
|
|
28
|
+
/**
|
|
29
|
+
* Force refresh permissions from controller (bypass cache)
|
|
30
|
+
*/
|
|
31
|
+
refreshPermissions(token: string): Promise<string[]>;
|
|
32
|
+
/**
|
|
33
|
+
* Clear cached permissions for a user
|
|
34
|
+
*/
|
|
35
|
+
clearPermissionsCache(token: string): Promise<void>;
|
|
36
|
+
}
|
|
37
|
+
//# sourceMappingURL=permission.service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"permission.service.d.ts","sourceRoot":"","sources":["../../src/services/permission.service.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAC/C,OAAO,EAAE,gBAAgB,EAAoB,MAAM,uBAAuB,CAAC;AAE3E,qBAAa,iBAAiB;IAC5B,OAAO,CAAC,UAAU,CAAa;IAC/B,OAAO,CAAC,KAAK,CAAe;IAC5B,OAAO,CAAC,MAAM,CAAmB;IACjC,OAAO,CAAC,aAAa,CAAS;gBAElB,MAAM,EAAE,gBAAgB,EAAE,KAAK,EAAE,YAAY;IAOzD;;OAEG;IACG,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IAwDtD;;OAEG;IACG,aAAa,CAAC,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAKxE;;OAEG;IACG,gBAAgB,CAAC,KAAK,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,OAAO,CAAC;IAK9E;;OAEG;IACG,iBAAiB,CAAC,KAAK,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,OAAO,CAAC;IAK/E;;OAEG;IACG,kBAAkB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IA0C1D;;OAEG;IACG,qBAAqB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAyB1D"}
|
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Permission service for user authorization with Redis caching
|
|
4
|
+
*/
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.PermissionService = void 0;
|
|
7
|
+
const http_client_1 = require("../utils/http-client");
|
|
8
|
+
class PermissionService {
|
|
9
|
+
constructor(config, redis) {
|
|
10
|
+
this.config = config;
|
|
11
|
+
this.redis = redis;
|
|
12
|
+
this.httpClient = new http_client_1.HttpClient(config);
|
|
13
|
+
this.permissionTTL = config.cache?.permissionTTL || 900; // 15 minutes default
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Get user permissions with Redis caching
|
|
17
|
+
*/
|
|
18
|
+
async getPermissions(token) {
|
|
19
|
+
try {
|
|
20
|
+
// First get user info to extract userId
|
|
21
|
+
const userInfo = await this.httpClient.authenticatedRequest('POST', '/auth/validate', token);
|
|
22
|
+
if (!userInfo.user?.id) {
|
|
23
|
+
return [];
|
|
24
|
+
}
|
|
25
|
+
const userId = userInfo.user.id;
|
|
26
|
+
const cacheKey = `permissions:${userId}:${this.config.environment}:${this.config.applicationKey}`;
|
|
27
|
+
// Check Redis cache first
|
|
28
|
+
if (this.redis.isConnected()) {
|
|
29
|
+
const cachedPermissions = await this.redis.get(cacheKey);
|
|
30
|
+
if (cachedPermissions) {
|
|
31
|
+
try {
|
|
32
|
+
const parsed = JSON.parse(cachedPermissions);
|
|
33
|
+
return parsed.permissions || [];
|
|
34
|
+
}
|
|
35
|
+
catch (error) {
|
|
36
|
+
// eslint-disable-next-line no-console
|
|
37
|
+
console.warn('Failed to parse cached permissions:', error);
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
// Cache miss - fetch from controller
|
|
42
|
+
const permissionResult = await this.httpClient.authenticatedRequest('GET', '/auth/permissions', token);
|
|
43
|
+
const permissions = permissionResult.permissions || [];
|
|
44
|
+
// Cache the result in Redis
|
|
45
|
+
if (this.redis.isConnected()) {
|
|
46
|
+
await this.redis.set(cacheKey, JSON.stringify({ permissions, timestamp: Date.now() }), this.permissionTTL);
|
|
47
|
+
}
|
|
48
|
+
return permissions;
|
|
49
|
+
}
|
|
50
|
+
catch (error) {
|
|
51
|
+
// eslint-disable-next-line no-console
|
|
52
|
+
console.error('Failed to get permissions:', error);
|
|
53
|
+
return [];
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Check if user has specific permission
|
|
58
|
+
*/
|
|
59
|
+
async hasPermission(token, permission) {
|
|
60
|
+
const permissions = await this.getPermissions(token);
|
|
61
|
+
return permissions.includes(permission);
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Check if user has any of the specified permissions
|
|
65
|
+
*/
|
|
66
|
+
async hasAnyPermission(token, permissions) {
|
|
67
|
+
const userPermissions = await this.getPermissions(token);
|
|
68
|
+
return permissions.some((permission) => userPermissions.includes(permission));
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Check if user has all of the specified permissions
|
|
72
|
+
*/
|
|
73
|
+
async hasAllPermissions(token, permissions) {
|
|
74
|
+
const userPermissions = await this.getPermissions(token);
|
|
75
|
+
return permissions.every((permission) => userPermissions.includes(permission));
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* Force refresh permissions from controller (bypass cache)
|
|
79
|
+
*/
|
|
80
|
+
async refreshPermissions(token) {
|
|
81
|
+
try {
|
|
82
|
+
// Get user info to extract userId
|
|
83
|
+
const userInfo = await this.httpClient.authenticatedRequest('POST', '/auth/validate', token);
|
|
84
|
+
if (!userInfo.user?.id) {
|
|
85
|
+
return [];
|
|
86
|
+
}
|
|
87
|
+
const userId = userInfo.user.id;
|
|
88
|
+
const cacheKey = `permissions:${userId}:${this.config.environment}:${this.config.applicationKey}`;
|
|
89
|
+
// Fetch fresh permissions from controller
|
|
90
|
+
const permissionResult = await this.httpClient.authenticatedRequest('GET', '/auth/permissions', token);
|
|
91
|
+
const permissions = permissionResult.permissions || [];
|
|
92
|
+
// Update cache with fresh data
|
|
93
|
+
if (this.redis.isConnected()) {
|
|
94
|
+
await this.redis.set(cacheKey, JSON.stringify({ permissions, timestamp: Date.now() }), this.permissionTTL);
|
|
95
|
+
}
|
|
96
|
+
return permissions;
|
|
97
|
+
}
|
|
98
|
+
catch (error) {
|
|
99
|
+
// eslint-disable-next-line no-console
|
|
100
|
+
console.error('Failed to refresh permissions:', error);
|
|
101
|
+
return [];
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
/**
|
|
105
|
+
* Clear cached permissions for a user
|
|
106
|
+
*/
|
|
107
|
+
async clearPermissionsCache(token) {
|
|
108
|
+
try {
|
|
109
|
+
// Get user info to extract userId
|
|
110
|
+
const userInfo = await this.httpClient.authenticatedRequest('POST', '/auth/validate', token);
|
|
111
|
+
if (!userInfo.user?.id) {
|
|
112
|
+
return;
|
|
113
|
+
}
|
|
114
|
+
const userId = userInfo.user.id;
|
|
115
|
+
const cacheKey = `permissions:${userId}:${this.config.environment}:${this.config.applicationKey}`;
|
|
116
|
+
// Clear from Redis cache
|
|
117
|
+
if (this.redis.isConnected()) {
|
|
118
|
+
await this.redis.delete(cacheKey);
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
catch (error) {
|
|
122
|
+
// eslint-disable-next-line no-console
|
|
123
|
+
console.error('Failed to clear permissions cache:', error);
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
exports.PermissionService = PermissionService;
|
|
128
|
+
//# sourceMappingURL=permission.service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"permission.service.js","sourceRoot":"","sources":["../../src/services/permission.service.ts"],"names":[],"mappings":";AAAA;;GAEG;;;AAEH,sDAAkD;AAIlD,MAAa,iBAAiB;IAM5B,YAAY,MAAwB,EAAE,KAAmB;QACvD,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;QACnB,IAAI,CAAC,UAAU,GAAG,IAAI,wBAAU,CAAC,MAAM,CAAC,CAAC;QACzC,IAAI,CAAC,aAAa,GAAG,MAAM,CAAC,KAAK,EAAE,aAAa,IAAI,GAAG,CAAC,CAAC,qBAAqB;IAChF,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,cAAc,CAAC,KAAa;QAChC,IAAI,CAAC;YACH,wCAAwC;YACxC,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,oBAAoB,CACzD,MAAM,EACN,gBAAgB,EAChB,KAAK,CACN,CAAC;YAEF,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,EAAE,EAAE,CAAC;gBACvB,OAAO,EAAE,CAAC;YACZ,CAAC;YAED,MAAM,MAAM,GAAG,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;YAChC,MAAM,QAAQ,GAAG,eAAe,MAAM,IAAI,IAAI,CAAC,MAAM,CAAC,WAAW,IAAI,IAAI,CAAC,MAAM,CAAC,cAAc,EAAE,CAAC;YAElG,0BAA0B;YAC1B,IAAI,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE,EAAE,CAAC;gBAC7B,MAAM,iBAAiB,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;gBACzD,IAAI,iBAAiB,EAAE,CAAC;oBACtB,IAAI,CAAC;wBACH,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,iBAAiB,CAAC,CAAC;wBAC7C,OAAO,MAAM,CAAC,WAAW,IAAI,EAAE,CAAC;oBAClC,CAAC;oBAAC,OAAO,KAAK,EAAE,CAAC;wBACf,sCAAsC;wBACtC,OAAO,CAAC,IAAI,CAAC,qCAAqC,EAAE,KAAK,CAAC,CAAC;oBAC7D,CAAC;gBACH,CAAC;YACH,CAAC;YAED,qCAAqC;YACrC,MAAM,gBAAgB,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,oBAAoB,CACjE,KAAK,EACL,mBAAmB,EACnB,KAAK,CACN,CAAC;YAEF,MAAM,WAAW,GAAG,gBAAgB,CAAC,WAAW,IAAI,EAAE,CAAC;YAEvD,4BAA4B;YAC5B,IAAI,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE,EAAE,CAAC;gBAC7B,MAAM,IAAI,CAAC,KAAK,CAAC,GAAG,CAClB,QAAQ,EACR,IAAI,CAAC,SAAS,CAAC,EAAE,WAAW,EAAE,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC,EACtD,IAAI,CAAC,aAAa,CACnB,CAAC;YACJ,CAAC;YAED,OAAO,WAAW,CAAC;QACrB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,sCAAsC;YACtC,OAAO,CAAC,KAAK,CAAC,4BAA4B,EAAE,KAAK,CAAC,CAAC;YACnD,OAAO,EAAE,CAAC;QACZ,CAAC;IACH,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,aAAa,CAAC,KAAa,EAAE,UAAkB;QACnD,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC;QACrD,OAAO,WAAW,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC;IAC1C,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,gBAAgB,CAAC,KAAa,EAAE,WAAqB;QACzD,MAAM,eAAe,GAAG,MAAM,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC;QACzD,OAAO,WAAW,CAAC,IAAI,CAAC,CAAC,UAAU,EAAE,EAAE,CAAC,eAAe,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC,CAAC;IAChF,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,iBAAiB,CAAC,KAAa,EAAE,WAAqB;QAC1D,MAAM,eAAe,GAAG,MAAM,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC;QACzD,OAAO,WAAW,CAAC,KAAK,CAAC,CAAC,UAAU,EAAE,EAAE,CAAC,eAAe,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC,CAAC;IACjF,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,kBAAkB,CAAC,KAAa;QACpC,IAAI,CAAC;YACH,kCAAkC;YAClC,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,oBAAoB,CACzD,MAAM,EACN,gBAAgB,EAChB,KAAK,CACN,CAAC;YAEF,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,EAAE,EAAE,CAAC;gBACvB,OAAO,EAAE,CAAC;YACZ,CAAC;YAED,MAAM,MAAM,GAAG,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;YAChC,MAAM,QAAQ,GAAG,eAAe,MAAM,IAAI,IAAI,CAAC,MAAM,CAAC,WAAW,IAAI,IAAI,CAAC,MAAM,CAAC,cAAc,EAAE,CAAC;YAElG,0CAA0C;YAC1C,MAAM,gBAAgB,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,oBAAoB,CACjE,KAAK,EACL,mBAAmB,EACnB,KAAK,CACN,CAAC;YAEF,MAAM,WAAW,GAAG,gBAAgB,CAAC,WAAW,IAAI,EAAE,CAAC;YAEvD,+BAA+B;YAC/B,IAAI,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE,EAAE,CAAC;gBAC7B,MAAM,IAAI,CAAC,KAAK,CAAC,GAAG,CAClB,QAAQ,EACR,IAAI,CAAC,SAAS,CAAC,EAAE,WAAW,EAAE,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC,EACtD,IAAI,CAAC,aAAa,CACnB,CAAC;YACJ,CAAC;YAED,OAAO,WAAW,CAAC;QACrB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,sCAAsC;YACtC,OAAO,CAAC,KAAK,CAAC,gCAAgC,EAAE,KAAK,CAAC,CAAC;YACvD,OAAO,EAAE,CAAC;QACZ,CAAC;IACH,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,qBAAqB,CAAC,KAAa;QACvC,IAAI,CAAC;YACH,kCAAkC;YAClC,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,oBAAoB,CACzD,MAAM,EACN,gBAAgB,EAChB,KAAK,CACN,CAAC;YAEF,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,EAAE,EAAE,CAAC;gBACvB,OAAO;YACT,CAAC;YAED,MAAM,MAAM,GAAG,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;YAChC,MAAM,QAAQ,GAAG,eAAe,MAAM,IAAI,IAAI,CAAC,MAAM,CAAC,WAAW,IAAI,IAAI,CAAC,MAAM,CAAC,cAAc,EAAE,CAAC;YAElG,yBAAyB;YACzB,IAAI,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE,EAAE,CAAC;gBAC7B,MAAM,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;YACpC,CAAC;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,sCAAsC;YACtC,OAAO,CAAC,KAAK,CAAC,oCAAoC,EAAE,KAAK,CAAC,CAAC;QAC7D,CAAC;IACH,CAAC;CACF;AAzKD,8CAyKC"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Redis service for caching and log queuing
|
|
3
|
+
*/
|
|
4
|
+
import { RedisConfig } from '../types/config.types';
|
|
5
|
+
export declare class RedisService {
|
|
6
|
+
private redis?;
|
|
7
|
+
private config?;
|
|
8
|
+
private connected;
|
|
9
|
+
constructor(config?: RedisConfig);
|
|
10
|
+
connect(): Promise<void>;
|
|
11
|
+
disconnect(): Promise<void>;
|
|
12
|
+
get(key: string): Promise<string | null>;
|
|
13
|
+
set(key: string, value: string, ttl: number): Promise<boolean>;
|
|
14
|
+
delete(key: string): Promise<boolean>;
|
|
15
|
+
rpush(queue: string, value: string): Promise<boolean>;
|
|
16
|
+
isConnected(): boolean;
|
|
17
|
+
}
|
|
18
|
+
//# sourceMappingURL=redis.service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"redis.service.d.ts","sourceRoot":"","sources":["../../src/services/redis.service.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AAEpD,qBAAa,YAAY;IACvB,OAAO,CAAC,KAAK,CAAC,CAAQ;IACtB,OAAO,CAAC,MAAM,CAAC,CAAc;IAC7B,OAAO,CAAC,SAAS,CAAS;gBAEd,MAAM,CAAC,EAAE,WAAW;IAI1B,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IA8BxB,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAS3B,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAcxC,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAe9D,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAerC,KAAK,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAe3D,WAAW,IAAI,OAAO;CAGvB"}
|