All files / app/api/input input.ts

88.52% Statements 54/61
50% Branches 2/4
100% Functions 1/1
88.52% Lines 54/61

Press n or j to go to the next uncovered block, b, p or k for the previous block.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 621x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x         1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x       1x 1x 1x  
import { Request, Response, NextFunction } from 'express';
import { Logger } from '../../utils/logger.js';
import { QueueEnum } from '../../types/QueueEnum.js';
import { QueueHandler } from '../../queue/queueHandler.js';
import {
  ServiceFactory,
  ClassName,
  TicketService,
  RequestService,
  IdempotencyService,
} from '../../service/serviceFactory.js';
import { InputNumber } from './input.schema.js';
 
const RABBIT_URL = process.env.RABBIT_URL || 'amqp://localhost:5672';
 
const queueHandler = new QueueHandler(RABBIT_URL);
 
type TicketResponse = {
  ticket: number;
};
 
const input = async (req: Request, res: Response, next: NextFunction) => {
  try {
    const { number: inputNumber } = req.body as InputNumber;
    const ipAddress = req.ip;
    const userAgent = req.headers['user-agent'] || 'Unknown';
 
    const idempotencyKey = `${ipAddress}-${userAgent}-${inputNumber}`;
    const idempotencyService = await ServiceFactory.getInstanceOfClass<IdempotencyService>(
      ClassName.IdempotencyService,
    );
    const cachedResponse = await idempotencyService.getIdempotency<{
      responseStatus: number;
      responseBody: TicketResponse;
    }>(idempotencyKey);
 
    if (cachedResponse) {
      Logger.log(`Returning cached response for idempotency key: ${idempotencyKey}`);
      res.status(cachedResponse.responseStatus).json(cachedResponse.responseBody);
      return;
    }
 
    const ticketService = await ServiceFactory.getInstanceOfClass<TicketService>(ClassName.TicketService);
    const ticket = await ticketService.getTicket();
 
    const requestService = await ServiceFactory.getInstanceOfClass<RequestService>(ClassName.RequestService);
    await requestService.addRequest(ticket, inputNumber);
 
    await queueHandler.addJobToQueue(QueueEnum.Fibonacci, { ticket, inputNumber });
 
    await idempotencyService.setIdempotency(idempotencyKey, { responseStatus: 200, responseBody: { ticket } });
 
    res.status(200).json({ ticket });
    return;
  } catch (err) {
    next(err);
    return;
  }
};
 
export default input;