const express = require('express'); const fs = require('fs'); const path = require('path'); const auth = require('../middleware/auth'); const logger = require('../logger'); const router = express.Router(); const dataDir = '/data'; // Ensure the /data directory exists if (!fs.existsSync(dataDir)) { fs.mkdirSync(dataDir, { recursive: true }); } // Ensure the tags.json file exists const tagsFilePath = path.join(dataDir, 'tags.json'); if (!fs.existsSync(tagsFilePath)) { fs.writeFileSync(tagsFilePath, JSON.stringify([])); } // Protect the /add-task endpoint with authentication router.post('/add-task', auth, async (req, res) => { const { subject, description, scheduled } = req.body; const currentDateTime = new Date().toISOString().replace(/T/, ' ').replace(/\..+/, ''); // Format the scheduled date and time for Org mode const scheduledDate = new Date(scheduled); const dayNames = ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat']; const dayName = dayNames[scheduledDate.getUTCDay()]; let formattedScheduled; if (scheduledDate.getUTCHours() === 0 && scheduledDate.getUTCMinutes() === 0) { // No time provided, format without time formattedScheduled = `<${scheduledDate.getUTCFullYear()}-${String(scheduledDate.getUTCMonth() + 1).padStart(2, '0')}-${String(scheduledDate.getUTCDate()).padStart(2, '0')} ${dayName}>`; } else { // Time provided, format with time formattedScheduled = `<${scheduledDate.getUTCFullYear()}-${String(scheduledDate.getUTCMonth() + 1).padStart(2, '0')}-${String(scheduledDate.getUTCDate()).padStart(2, '0')} ${dayName} ${String(scheduledDate.getUTCHours()).padStart(2, '0')}:${String(scheduledDate.getUTCMinutes()).padStart(2, '0')}>`; } let orgFormattedData = `* TODO ${subject} SCHEDULED: ${formattedScheduled} :LOGBOOK: - State "TODO" from "TODO" [${currentDateTime}] :END: `; if (description) { orgFormattedData = `* TODO ${subject} ${description} SCHEDULED: ${formattedScheduled} :LOGBOOK: - State "TODO" from "TODO" [${currentDateTime}] :END: `; logger.info(`Task added: ${orgFormattedData}`); } const filePath = path.join(dataDir, 'tasks.org'); try { await fs.promises.appendFile(filePath, orgFormattedData); res.json({ message: 'Task added successfully' }); } catch (error) { logger.error('Error writing to tasks.org file:', error); res.status(500).json({ message: 'Error adding task' }); } }); // Endpoint to save tags router.post('/save-tags', auth, async (req, res) => { const { tags } = req.body; const filePath = path.join(dataDir, 'tags.json'); try { await fs.promises.writeFile(filePath, JSON.stringify(tags)); res.send({ message: 'Tags saved successfully!' }); logger.info(`New tags saved: ${tags}`); } catch (err) { logger.error('Error saving tags:', err); res.status(500).send('Error saving tags.'); } }); // Endpoint to retrieve tags router.get('/get-tags', auth, async (req, res) => { const filePath = path.join(dataDir, 'tags.json'); try { const data = await fs.promises.readFile(filePath, 'utf-8'); const tags = JSON.parse(data); res.json(tags); } catch (err) { logger.error('Error retrieving tags:', err); res.status(500).json({ error: 'Error retrieving tags' }); } }); module.exports = router;