Website : rimsha.abasa.com
backdoor
Home
Console
Upload
information
Create File
Create Folder
About
Tools
:
/
var
/
www
/
ah7-backend
/
src
/
controllers
/
Filename :
foodLog.controller.js
back
Copy
import FoodLog from '../models/foodLog.model.js'; import responseHandler from '../utils/ResponseHandler.js'; import mongoose from 'mongoose'; import { uploadFileToS3 } from '../services/s3Service.js'; // Helper function to format numbers const formatNumber = (value) => { if (value === null || value === undefined) return null; const num = parseFloat(value); if (isNaN(num)) return null; return Number(num.toFixed(1)); // Ensures 2 → 2.0, 1.5 → 1.5 }; // QUICK ENTRY - Add Custom Food Log const addQuickEntryLog = async (req, res) => { try { const { userId } = req.params; const { food_name, calories, total_fat, protein, carbohydrates, sugars, fiber, sodium, cholesterol } = req.body; if (!food_name || !calories) { return responseHandler.error(res, "Food name and calories are required", 400); } let imageURL = null; if (req.file) { const { publicURL } = await uploadFileToS3(req.file); imageURL = publicURL; } const newLog = new FoodLog({ user: userId, custom_entry: { food_name, calories: formatNumber(calories), image: imageURL, total_fat: formatNumber(total_fat), protein: formatNumber(protein), carbohydrates: formatNumber(carbohydrates), sugars: formatNumber(sugars), fiber: formatNumber(fiber), sodium: formatNumber(sodium), cholesterol: formatNumber(cholesterol) } }); await newLog.save(); return responseHandler.success(res, "Quick entry food log added", newLog); } catch (error) { return responseHandler.error(res, "Failed to add quick entry log", 500, error.message); } }; // FOOD ENTRY - Add Log From Existing Food const addFoodEntryLog = async (req, res) => { try { const { userId } = req.body; // assuming userId comes from auth middleware const { foodId } = req.params; // foodId from the URL params if (!foodId) { return responseHandler.error(res, "foodId is required", 400); } const newLog = new FoodLog({ user: userId, food: foodId }); await newLog.save(); return responseHandler.success(res, "Food entry log added", newLog); } catch (error) { return responseHandler.error(res, "Failed to add food entry log", 500, error.message); } }; const getUserFoodLogs = async (req, res) => { try { const { userId } = req.params; const { dateFilter = 'today' } = req.query; // 'today', '7days', '14days', '30days', 'all' // Validate user ID if (!mongoose.Types.ObjectId.isValid(userId)) { return responseHandler.error(res, "Invalid user ID", 400); } // Calculate date ranges based on filter let startDate; const endDate = new Date(); switch (dateFilter.toLowerCase()) { case 'today': startDate = new Date(); startDate.setHours(0, 0, 0, 0); break; case '7days': startDate = new Date(); startDate.setDate(startDate.getDate() - 7); break; case '14days': startDate = new Date(); startDate.setDate(startDate.getDate() - 14); break; case '30days': startDate = new Date(); startDate.setDate(startDate.getDate() - 30); break; case 'all': startDate = null; // No date filtering break; default: return responseHandler.error(res, "Invalid date filter. Use: today, 7days, 14days, 30days, or all", 400); } // Build the query const query = { user: userId }; if (startDate) { query.date = { $gte: startDate, $lte: endDate }; } // Fetch logs with population for referenced food items const logs = await FoodLog.find(query) .sort({ date: -1 }) // Newest first .populate({ path: 'food', select: 'food_name image calories total_fat protein carbohydrates sugars fiber sodium cholesterol' }); // Transform the data for consistent response format const formattedLogs = logs.map(log => { if (log.food) { // Food Entry log (has reference to food) return { id: log._id, type: 'food-entry', date: log.date, details: { ...log.food._doc, source: 'database' } }; } else { // Quick Entry log (has custom data) return { id: log._id, type: 'quick-entry', date: log.date, details: { ...log.custom_entry, source: 'custom' } }; } }); return responseHandler.success(res, "Food logs retrieved successfully", { count: formattedLogs.length, logs: formattedLogs }); } catch (error) { return responseHandler.error(res, "Failed to retrieve food logs", 500, error.message); } }; export default getUserFoodLogs; export { addQuickEntryLog, addFoodEntryLog, getUserFoodLogs }