const express = require("express"); const multer = require("multer"); const { authenticateToken } = require("../middleware/auth"); const ConditionCheckService = require("../services/conditionCheckService"); const logger = require("../utils/logger"); const router = express.Router(); // Configure multer for photo uploads const upload = multer({ dest: "uploads/condition-checks/", limits: { fileSize: 10 * 1024 * 1024, // 10MB limit files: 20, // Maximum 20 files }, fileFilter: (req, file, cb) => { // Accept only image files if (file.mimetype.startsWith("image/")) { cb(null, true); } else { cb(new Error("Only image files are allowed"), false); } }, }); // Submit a condition check router.post( "/:rentalId", authenticateToken, upload.array("photos"), async (req, res) => { try { const { rentalId } = req.params; const { checkType, notes } = req.body; const userId = req.user.id; // Get uploaded file paths const photos = req.files ? req.files.map((file) => file.path) : []; // Extract metadata from request const metadata = { userAgent: req.get("User-Agent"), ipAddress: req.ip, deviceType: req.get("X-Device-Type") || "web", }; const conditionCheck = await ConditionCheckService.submitConditionCheck( rentalId, checkType, userId, photos, notes, metadata ); const reqLogger = logger.withRequestId(req.id); reqLogger.info("Condition check submitted", { rentalId, checkType, userId, photoCount: photos.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;