Skip to content

Commit 8aa7d28

Browse files
committed
Improve api-rest & elk on backend-javascript
1 parent 2f07b6b commit 8aa7d28

File tree

12 files changed

+115
-196
lines changed

12 files changed

+115
-196
lines changed

backend-javascript/.env.development

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ APP_VERSION=1.1.1
55

66
# === SERVEUR APPLICATION ===
77
HOST=localhost
8-
PORT=3001
8+
PORT=3000
99
# CORS_ORIGIN=http://localhost:4200
1010
CORS_ORIGIN=*
1111

backend-javascript/src/__tests__/e2e/server.e2e.test.js

Lines changed: 0 additions & 48 deletions
This file was deleted.

backend-javascript/src/app.js

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -56,9 +56,7 @@ app.use(appRoutes);
5656
app.use(rootRoutes);
5757

5858
app.use(notFoundHandler);
59-
6059
app.use(responseHandler);
61-
6260
app.use(errorHandler);
6361

6462
export default app;

backend-javascript/src/infrastructure/logger/request-logger.js

Lines changed: 33 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,45 @@
1+
import os from 'os';
12
import logger from './logger.js';
23
import { incrementHttpRequests } from '../metrics/metrics.js';
34

45
const requestLogger = (req, res, next) => {
6+
const startTime = Date.now();
57

68
res.on('finish', () => {
79
incrementHttpRequests(req.method, req.originalUrl, res.statusCode);
8-
});
910

10-
logger.info(`[${req.method}] ${req.originalUrl}`, {
11-
method: req.method,
12-
route: req.originalUrl,
13-
correlationId: req.correlationId,
14-
ip: req.ip,
15-
userAgent: req.headers['user-agent'],
11+
const responseTime = Date.now() - startTime;
12+
const logLevel = res.statusCode >= 400 ? 'warn' : 'info';
13+
14+
logger[logLevel](`[${req.method}] ${req.originalUrl} - ${res.statusCode}`, {
15+
environment: process.env.NODE_ENV || 'development',
16+
hostname: os.hostname(),
17+
processId: process.pid,
18+
correlationId: req.correlationId,
19+
requestId: req.id,
20+
sessionId: req.sessionID,
21+
userId: req.user?.id,
22+
method: req.method,
23+
route: req.originalUrl,
24+
statusCode: res.statusCode,
25+
protocol: req.protocol,
26+
httpVersion: req.httpVersion,
27+
responseTime: responseTime,
28+
contentLength: res.getHeader('content-length') || 0,
29+
bodySize: req.headers['content-length'] ? parseInt(req.headers['content-length']) : 0,
30+
ip: req.ip,
31+
xForwardedFor: req.headers['x-forwarded-for'] || null,
32+
userAgent: req.headers['user-agent'],
33+
referer: req.headers['referer'] || null,
34+
origin: req.headers['origin'] || null,
35+
host: req.headers['host'] || null,
36+
accept: req.headers['accept'] || null,
37+
acceptLanguage: req.headers['accept-language'] || null,
38+
query: Object.keys(req.query).length > 0 ? req.query : undefined,
39+
timestamp: new Date().toISOString(),
40+
});
1641
});
42+
1743
next();
1844
};
1945

backend-javascript/src/middlewares/error/__tests__/unit/not-found-handler.test.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ describe('notFoundHandler Middleware', () => {
2222
expect(next).toHaveBeenCalledTimes(1);
2323
const errorArg = next.mock.calls[0][0];
2424
expect(errorArg).toBeInstanceOf(Error);
25-
expect(errorArg.message).toBe('Resource not found');
25+
expect(errorArg.message).toBe('Route not found');
2626
expect(errorArg.statusCode).toBe(404);
2727
expect(errorArg.context).toBe('GET /non-existing-route');
2828
expect(errorArg.details).toEqual(

backend-javascript/src/middlewares/error/error-handler.js

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,18 +11,31 @@ function errorHandler(err, req, res, next) {
1111
};
1212

1313
const logMessage = `[${req.method}] ${req.originalUrl} - ${statusCode} ${message}`;
14+
let errorStack = err.stack;
15+
if (statusCode === 404) {
16+
if (err.isTechnical404) {
17+
errorStack = 'stack unknown';
18+
}
19+
}
20+
1421
const logData = {
1522
method: req.method,
1623
route: req.originalUrl,
1724
statusCode: statusCode,
1825
message: message,
1926
context: context,
2027
details: details,
21-
stack: err.stack,
28+
stack: errorStack,
2229
correlationId: req.correlationId,
2330
};
2431

25-
if (statusCode >= 500 || statusCode === 401 || statusCode === 403 || statusCode === 409) {
32+
if (statusCode === 404) {
33+
if (err.isTechnical404) {
34+
logger.warn('404 unknown route', logData);
35+
} else {
36+
logger.warn('404 resource not found', logData);
37+
}
38+
} else if (statusCode >= 500 || statusCode === 401 || statusCode === 403 || statusCode === 409) {
2639
logger.error(logMessage, logData);
2740
} else {
2841
logger.warn(logMessage, logData);
@@ -35,4 +48,3 @@ function errorHandler(err, req, res, next) {
3548
}
3649

3750
export default errorHandler;
38-

backend-javascript/src/middlewares/error/not-found-handler.js

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
11
const notFoundHandler = (req, res, next) => {
22
if (res.locals.data === undefined) {
3-
const error = new Error('Resource not found');
3+
const error = new Error('Route not found');
44
error.statusCode = 404;
5+
error.isTechnical404 = true;
56
error.context = `${req.method} ${req.originalUrl}`;
67
error.details = {
78
path: req.originalUrl,

backend-javascript/src/middlewares/response/response-handler.js

Lines changed: 0 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -14,33 +14,9 @@ function responseHandler(req, res, next) {
1414
} else {
1515
response.data = payload;
1616
}
17-
1817
res.status(statusCode).json(response);
1918

2019
return next();
2120
}
2221

2322
export default responseHandler;
24-
25-
// function responseHandler(req, res, next) {
26-
// if (res.headersSent) {
27-
// return next();
28-
// }
29-
30-
// const statusCode = res.locals.statusCode || 200;
31-
// const payload = res.locals.data || null;
32-
// const success = statusCode >= 200 && statusCode < 300;
33-
34-
// const response = { success };
35-
36-
// if (payload && payload.metadata && payload.data) {
37-
// response.metadata = payload.metadata;
38-
// response.data = payload.data;
39-
// } else {
40-
// response.data = payload;
41-
// }
42-
43-
// res.status(statusCode).json(response);
44-
// }
45-
46-
// export default responseHandler;

backend-javascript/src/modules/continent/continent.controller.js

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,9 +52,11 @@ class Controller {
5252
return next();
5353
} catch (error) {
5454
if (error.message === ITEM_CONSTANTS.ALREADY_EXISTS) {
55+
5556
return next({ statusCode: HTTP_STATUS.CONFLICT, message: error.message });
5657
}
5758
if (error.name === 'ValidationError') {
59+
5860
return next({ statusCode: HTTP_STATUS.BAD_REQUEST, message: error.message });
5961
}
6062

0 commit comments

Comments
 (0)