nestjs-universal-logger-v2
Version:
Universal logging package for NestJS - Automatic system-wide logging with per-service MongoDB collections and TTL-based cleanup
124 lines (123 loc) • 4.61 kB
JavaScript
;
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
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;
return c > 3 && r && Object.defineProperty(target, key, r), r;
};
var __metadata = (this && this.__metadata) || function (k, v) {
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.UniversalLoggerGuard = void 0;
const common_1 = require("@nestjs/common");
const universal_logger_client_1 = require("./universal-logger-client");
let UniversalLoggerGuard = class UniversalLoggerGuard {
constructor(logger) {
this.logger = logger;
}
canActivate(context) {
const request = context.switchToHttp().getRequest();
const method = request.method;
const url = request.originalUrl || request.url;
const userAgent = request.headers['user-agent'] || '';
const ip = this.getClientIp(request);
const requestId = request.headers['x-request-id'];
const authHeader = request.headers.authorization;
const token = this.extractToken(authHeader);
const userId = request.user?.id;
this.logger.log('Authentication check started', 'AUTH', {
requestId,
method,
url,
ip,
userAgent,
userId,
hasToken: !!token,
tokenType: this.getTokenType(authHeader),
timestamp: new Date().toISOString()
});
try {
const isAuthenticated = this.validateAuthentication(request);
if (isAuthenticated) {
this.logger.logAuthEvent('authentication_success', userId, true, {
requestId,
method,
url,
ip,
userAgent,
tokenType: this.getTokenType(authHeader)
});
return true;
}
else {
this.logger.logAuthEvent('authentication_failed', userId, false, {
requestId,
method,
url,
ip,
userAgent,
reason: 'invalid_token',
tokenType: this.getTokenType(authHeader)
});
throw new common_1.UnauthorizedException('Invalid authentication token');
}
}
catch (error) {
this.logger.logAuthEvent('authentication_error', userId, false, {
requestId,
method,
url,
ip,
userAgent,
errorName: error.name,
errorMessage: error.message,
tokenType: this.getTokenType(authHeader)
});
throw error;
}
}
validateAuthentication(request) {
const authHeader = request.headers.authorization;
if (!authHeader) {
return false;
}
const token = this.extractToken(authHeader);
if (!token) {
return false;
}
return true;
}
extractToken(authHeader) {
if (!authHeader) {
return null;
}
const parts = authHeader.split(' ');
if (parts.length !== 2) {
return null;
}
return parts[1];
}
getTokenType(authHeader) {
if (!authHeader) {
return 'none';
}
const parts = authHeader.split(' ');
if (parts.length !== 2) {
return 'invalid';
}
return parts[0].toLowerCase();
}
getClientIp(request) {
return (request.headers['x-forwarded-for'] ||
request.headers['x-real-ip'] ||
request.connection.remoteAddress ||
request.socket.remoteAddress ||
'unknown');
}
};
exports.UniversalLoggerGuard = UniversalLoggerGuard;
exports.UniversalLoggerGuard = UniversalLoggerGuard = __decorate([
(0, common_1.Injectable)(),
__metadata("design:paramtypes", [universal_logger_client_1.UniversalLoggerClient])
], UniversalLoggerGuard);