WeightTracker/server-api.js

68 lines
2.4 KiB
JavaScript

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');
}
try {
res.json(JSON.parse(data));
} catch (parseErr) {
console.error('Error parsing data file content:', parseErr);
// If file content is not valid JSON, perhaps return empty or handle error
res.status(500).send('Error parsing data file content');
}
});
});
// 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).send('Error writing data file');
}
console.log(`Data saved successfully to ${DATA_FILE_PATH}`);
res.status(200).send('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!');
});