const express = require("express"); const { authenticateToken } = require("../middleware/auth"); const ConditionCheckService = require("../services/conditionCheckService"); const logger = require("../utils/logger"); const { validateS3Keys } = require("../utils/s3KeyValidator"); const { IMAGE_LIMITS } = require("../config/imageLimits"); const router = express.Router(); // Submit a condition check router.post("/:rentalId", authenticateToken, async (req, res) => { try { const { rentalId } = req.params; const { checkType, notes, imageFilenames: rawImageFilenames } = req.body; const userId = req.user.id; // Ensure imageFilenames is an array (S3 keys) const imageFilenamesArray = Array.isArray(rawImageFilenames) ? rawImageFilenames : []; // Validate S3 keys format and folder const keyValidation = validateS3Keys(imageFilenamesArray, "condition-checks", { maxKeys: IMAGE_LIMITS.conditionChecks, }); if (!keyValidation.valid) { return res.status(400).json({ success: false, error: keyValidation.error, details: keyValidation.invalidKeys, }); } const imageFilenames = imageFilenamesArray; const conditionCheck = await ConditionCheckService.submitConditionCheck( rentalId, checkType, userId, imageFilenames, notes ); const reqLogger = logger.withRequestId(req.id); reqLogger.info("Condition check submitted", { rentalId, checkType, userId, photoCount: imageFilenames.length, }); res.status(201).json({ success: true, conditionCheck, }); } catch (error) { const reqLogger = logger.withRequestId(req.id); reqLogger.error("Error submitting condition check", { error: error.message, rentalId: req.params.rentalId, userId: req.user?.id, }); res.status(400).json({ success: false, error: error.message, }); } }); // Get condition checks for a rental router.get("/:rentalId", authenticateToken, async (req, res) => { try { const { rentalId } = req.params; const conditionChecks = await ConditionCheckService.getConditionChecks( rentalId ); res.json({ success: true, conditionChecks, }); } catch (error) { const reqLogger = logger.withRequestId(req.id); reqLogger.error("Error fetching condition checks", { error: error.message, rentalId: req.params.rentalId, }); res.status(500).json({ success: false, error: "Failed to fetch condition checks", }); } }); // Get condition check timeline for a rental router.get("/:rentalId/timeline", authenticateToken, async (req, res) => { try { const { rentalId } = req.params; const timeline = await ConditionCheckService.getConditionCheckTimeline( rentalId ); res.json({ success: true, timeline, }); } catch (error) { const reqLogger = logger.withRequestId(req.id); reqLogger.error("Error fetching condition check timeline", { error: error.message, rentalId: req.params.rentalId, }); res.status(500).json({ success: false, error: error.message, }); } }); // Get available condition checks for current user router.get("/", authenticateToken, async (req, res) => { try { const userId = req.user.id; const availableChecks = await ConditionCheckService.getAvailableChecks( userId ); res.json({ success: true, availableChecks, }); } catch (error) { const reqLogger = logger.withRequestId(req.id); reqLogger.error("Error fetching available checks", { error: error.message, userId: req.user?.id, }); res.status(500).json({ success: false, error: "Failed to fetch available checks", }); } }); module.exports = router;