Files
sf-nfc-server/src/main.ts

126 lines
3.4 KiB
TypeScript

import assert from 'assert';
import express, { Router, type NextFunction, type Request, type Response } from 'express';
import { errorHandler } from './aplication/middleware.js';
import { env } from './config/env.config.js';
import cors from 'cors';
import type { ServerContext } from 'domain/ServerContext.js';
import { httpclient } from 'config/httpclient.config.js';
import { pgClient } from 'config/pgclient.config.js';
import { NfcController } from 'aplication/Nfc.controller.js';
import { NfcUsecases } from 'aplication/Nfc.usecases.js';
import { NfcRepository } from 'infrastructure/Nfc.repository.js';
import { LogRepository, type LogCreateDTO } from 'infrastructure/Log.repository.js';
const PORT = env.PORT
const HOSTNAME = env.HOST
assert(HOSTNAME != undefined)
// Instancias de las dependencias
const serverContext: ServerContext = {
HttpClient: httpclient,
PostgresClient: pgClient
}
const nfcRepository = new NfcRepository(serverContext)
const logRepository = new LogRepository(serverContext)
const nfcUsecases = new NfcUsecases({
serverContext,
nfcRepository
})
const ncfControllers = new NfcController({
serverContext,
nfcUsecases
})
// middleware
const requestLogger = (req: Request, res: Response, next: NextFunction) => {
const timestamp = new Date().toISOString();
const method = req.method;
const url = req.url;
const body = req.body;
// 'origin' comes from the request headers
const origin = req.get('origin') || 'No Origin (likely direct request/Server-side)';
const log: LogCreateDTO = {
data: req.body,
endpoint: method + " " + req.url,
origin: origin
}
logRepository.createLog(log).then().catch(e => console.error("Error logueando ", log, e))
console.log(`[${timestamp}] ${method} ${url} - Origin: ${origin} - Body: ${JSON.stringify(body)}`);
// Crucial: Call next() so the request doesn't hang!
next();
};
const responseLogger = (req: Request, res: Response, next: NextFunction) => {
const timestamp = new Date().toISOString();
const start = Date.now();
const oldSend = res.send;
res.send = function (data: any): Response {
// @ts-ignore: Si, es poco ortodoxo
res.sendBody = data; // Store the result data
return oldSend.apply(res, [data]);
};
// Listen for the 'finish' event to log after the response is sent
res.on('finish', () => {
const duration = Date.now() - start;
const log: LogCreateDTO = {
// @ts-ignore: Por lo de antes
data: res.sendBody,
endpoint: req.method + " " + req.originalUrl,
origin: "SERVER"
}
logRepository.createLog(log)
console.log(`[${timestamp} ${req.method} ${req.originalUrl} ${res.statusCode} - ${duration}ms`);
});
next();
}
// Rutas
const router = Router();
router.get("/health", (req: Request, res: Response) => {
res.json({ ok: true })
})
router.post("/nfc/generate", ncfControllers.generateActivationTag())
router.head("/", (req, res) => res.status(200).send())
// Inicio de express
const app = express();
app.use(express.json());
app.use(cors({
origin: '*',
methods: 'GET,HEAD,PUT,PATCH,POST,DELETE',
allowedHeaders: ['Content-Type', 'Authorization']
}))
app.use(requestLogger)
app.use(responseLogger)
// Routes
app.use('/', router);
app.use(errorHandler);
app.listen(PORT, HOSTNAME, (n) => {
console.log(`[o] Servidor escuchando en ${HOSTNAME}:${PORT}`)
})