import { Request, Response } from "express"; import { QueryResult } from "pg"; import db from "../database/postgres.js"; import redisClient from "../database/redis.js"; import { ErrorResponse } from "../types/error.js"; import { Robot, RobotsResponse } from "../types/robot.js"; const CACHE_TTL = 10; const ROBOTS_CACHE_KEY = "allMyRobots"; async function getRobots(_req: Request, res: Response) { try { // Check if Redis has cached data to send to frontend const cachedData = await redisClient.get(ROBOTS_CACHE_KEY); if (cachedData) { console.log("Data served from Redis cache."); const robots: Robot[] = JSON.parse(cachedData); const simulationRunning = robots?.every( (robot) => robot.status === "moving" ); const response: RobotsResponse = { source: "cache", robots, simulationRunning, }; return res.status(200).json(response); } // Else query database, then save in Redis cache and send to frontend const robotsQuery: QueryResult = await db.query( "SELECT * FROM robots ORDER BY id;" ); const robots = robotsQuery.rows; const simulationRunning = robots?.every( (robot) => robot.status === "moving" ); await redisClient.set(ROBOTS_CACHE_KEY, JSON.stringify(robots), { EX: CACHE_TTL, }); console.log("Cache miss: data queried from PostgreSQL."); const response: RobotsResponse = { source: "database", robots, simulationRunning, }; return res.status(200).json(response); } catch (error) { console.error("Failed to load the robots: ", error); const errorResponse: ErrorResponse = { message: "Internal server error while loading the robots.", error, }; return res.status(500).json(errorResponse); } } export default getRobots;