Files
api_builder/backend/src/middleware/logging.ts
GEgorov 8943f5a070 new file: .claude/settings.local.json
new file:   .gitignore
	new file:   backend/.env.example
	new file:   backend/.gitignore
	new file:   backend/ecosystem.config.js
	new file:   backend/nodemon.json
	new file:   backend/package-lock.json
	new file:   backend/package.json
	new file:   backend/src/config/database.ts
	new file:   backend/src/config/dynamicSwagger.ts
	new file:   backend/src/config/environment.ts
	new file:   backend/src/config/swagger.ts
	new file:   backend/src/controllers/apiKeyController.ts
	new file:   backend/src/controllers/authController.ts
	new file:   backend/src/controllers/databaseController.ts
	new file:   backend/src/controllers/databaseManagementController.ts
	new file:   backend/src/controllers/dynamicApiController.ts
	new file:   backend/src/controllers/endpointController.ts
	new file:   backend/src/controllers/folderController.ts
	new file:   backend/src/controllers/logsController.ts
	new file:   backend/src/controllers/userController.ts
	new file:   backend/src/middleware/apiKey.ts
	new file:   backend/src/middleware/auth.ts
	new file:   backend/src/middleware/logging.ts
	new file:   backend/src/migrations/001_initial_schema.sql
	new file:   backend/src/migrations/002_add_logging.sql
	new file:   backend/src/migrations/003_add_scripting.sql
	new file:   backend/src/migrations/004_add_superadmin.sql
	new file:   backend/src/migrations/run.ts
	new file:   backend/src/migrations/seed.ts
	new file:   backend/src/routes/apiKeys.ts
	new file:   backend/src/routes/auth.ts
	new file:   backend/src/routes/databaseManagement.ts
	new file:   backend/src/routes/databases.ts
	new file:   backend/src/routes/dynamic.ts
	new file:   backend/src/routes/endpoints.ts
	new file:   backend/src/routes/folders.ts
	new file:   backend/src/routes/logs.ts
	new file:   backend/src/routes/users.ts
	new file:   backend/src/server.ts
	new file:   backend/src/services/DatabasePoolManager.ts
	new file:   backend/src/services/ScriptExecutor.ts
	new file:   backend/src/services/SqlExecutor.ts
	new file:   backend/src/types/index.ts
	new file:   backend/tsconfig.json
	new file:   frontend/.gitignore
	new file:   frontend/index.html
	new file:   frontend/nginx.conf
	new file:   frontend/package-lock.json
	new file:   frontend/package.json
	new file:   frontend/postcss.config.js
	new file:   frontend/src/App.tsx
	new file:   frontend/src/components/CodeEditor.tsx
2025-10-07 00:04:04 +03:00

108 lines
3.0 KiB
TypeScript

import { Response, NextFunction } from 'express';
import { ApiKeyRequest } from './apiKey';
import { mainPool } from '../config/database';
interface LogData {
endpoint_id: string | null;
api_key_id: string | null;
method: string;
path: string;
request_params: any;
request_body: any;
response_status: number;
response_data: any;
execution_time: number;
error_message: string | null;
ip_address: string;
user_agent: string;
}
export const createLoggingMiddleware = (endpointId: string, shouldLog: boolean) => {
return async (req: ApiKeyRequest, res: Response, next: NextFunction) => {
if (!shouldLog) {
return next();
}
const startTime = Date.now();
// Capture original methods
const originalJson = res.json.bind(res);
const originalSend = res.send.bind(res);
let responseData: any = null;
let isLogged = false;
const logRequest = async (data: any, status: number, errorMsg: string | null = null) => {
if (isLogged) return; // Prevent duplicate logging
isLogged = true;
const executionTime = Date.now() - startTime;
const logData: LogData = {
endpoint_id: endpointId,
api_key_id: req.apiKey?.id || null,
method: req.method,
path: req.path,
request_params: req.query || {},
request_body: req.body || {},
response_status: status,
response_data: data,
execution_time: executionTime,
error_message: errorMsg,
ip_address: req.ip || req.socket.remoteAddress || 'unknown',
user_agent: req.headers['user-agent'] || 'unknown',
};
try {
await mainPool.query(
`INSERT INTO request_logs (
endpoint_id, api_key_id, method, path,
request_params, request_body, response_status,
response_data, execution_time, error_message,
ip_address, user_agent
) VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12)`,
[
logData.endpoint_id,
logData.api_key_id,
logData.method,
logData.path,
JSON.stringify(logData.request_params),
JSON.stringify(logData.request_body),
logData.response_status,
JSON.stringify(logData.response_data),
logData.execution_time,
logData.error_message,
logData.ip_address,
logData.user_agent,
]
);
} catch (error) {
console.error('Failed to log request:', error);
}
};
// Override res.json
res.json = function (data: any) {
responseData = data;
logRequest(data, res.statusCode);
return originalJson(data);
};
// Override res.send
res.send = function (data: any) {
responseData = data;
logRequest(data, res.statusCode);
return originalSend(data);
};
// Handle errors
res.on('finish', () => {
if (!isLogged && responseData === null) {
logRequest(null, res.statusCode);
}
});
next();
};
};