const express = require('express'); const bodyParser = require('body-parser'); const fs = require('fs'); const path = require('path'); const app = express(); const PORT = process.env.PORT || 3000; const DATA_FILE_PATH = process.env.DATA_FILE_PATH || path.join(__dirname, 'data', 'weight-tracker-data.json'); // Default path for local dev, override in Docker // Ensure data directory exists (especially for local dev, Docker volume handles it in container) const dataDir = path.dirname(DATA_FILE_PATH); if (!fs.existsSync(dataDir)) { fs.mkdirSync(dataDir, { recursive: true }); } app.use(bodyParser.json({ limit: '10mb' })); // Generous limit for the data file // Middleware to log requests app.use((req, res, next) => { console.log(`${new Date().toISOString()} - ${req.method} ${req.originalUrl}`); next(); }); // GET endpoint to retrieve data app.get('/', (req, res) => { fs.readFile(DATA_FILE_PATH, 'utf8', (err, data) => { if (err) { if (err.code === 'ENOENT') { console.log(`Data file not found at ${DATA_FILE_PATH}, returning empty object.`); return res.json({}); // If file doesn't exist, return empty JSON object } console.error('Error reading data file:', err); return res.status(500).send('Error reading data file'); } // If file is empty or just whitespace, treat as empty object if (!data || data.trim() === '') { console.log(`Data file at ${DATA_FILE_PATH} is empty, returning empty object.`); return res.json({}); } try { res.json(JSON.parse(data)); } catch (parseErr) { console.error(`Error parsing data file content from ${DATA_FILE_PATH}:`, parseErr); return res.status(500).json({ message: 'Error parsing data file content. File may be corrupted.', error: parseErr.message }); } }); }); // PUT endpoint to save data app.put('/', (req, res) => { const dataToSave = JSON.stringify(req.body, null, 2); // Pretty print JSON fs.writeFile(DATA_FILE_PATH, dataToSave, 'utf8', (err) => { if (err) { console.error('Error writing data file:', err); return res.status(500).json({ message: 'Error writing data file', error: err.message || 'Unknown error' }); } console.log(`Data saved successfully to ${DATA_FILE_PATH}`); res.status(200).json({ message: 'Data saved successfully' }); }); }); app.listen(PORT, '0.0.0.0', () => { console.log(`Server API listening on port ${PORT}`); console.log(`Data file path: ${DATA_FILE_PATH}`); }); // Basic error handler app.use((err, req, res, next) => { console.error(err.stack); res.status(500).send('Something broke!'); });