Files
timeline/server/routes/calendar.js
licsber 96042461f9
Some checks failed
Build and Push Docker Image / buildx (push) Has been cancelled
feat: update time tooltip.
2025-11-11 16:42:49 +08:00

132 lines
3.8 KiB
JavaScript

const express = require('express');
const { db } = require('../database');
const router = express.Router();
router.get('/', (req, res) => {
const userId = req.user.userId;
db.all(
'SELECT date, status, updated_at FROM calendar_marks WHERE user_id = ?',
[userId],
(err, rows) => {
if (err) {
return res.status(500).json({ success: false, error: '获取数据失败' });
}
const markedDates = {};
rows.forEach((row) => {
markedDates[row.date] = {
status: row.status,
updatedAt: row.updated_at
};
});
res.json({ success: true, markedDates });
}
);
});
router.post('/', (req, res) => {
const userId = req.user.userId;
const { markedDates } = req.body || {};
if (!markedDates || typeof markedDates !== 'object') {
return res.status(400).json({ success: false, error: '无效的数据格式' });
}
// Helper function to get current timestamp in ISO format (UTC)
const getLocalTimestamp = () => {
return new Date().toISOString();
};
const dbOperations = Object.entries(markedDates).map(([date, status]) => {
return new Promise((resolve, reject) => {
// First check if this date exists and if status has changed
db.get(
'SELECT status FROM calendar_marks WHERE user_id = ? AND date = ?',
[userId, date],
(err, row) => {
if (err) {
return reject(err);
}
// Only update timestamp if status changed or it's a new entry
const statusChanged = !row || row.status !== status;
if (statusChanged) {
// Status changed - update with new timestamp
const currentTimestamp = getLocalTimestamp();
db.run(
`INSERT INTO calendar_marks (user_id, date, status, updated_at)
VALUES (?, ?, ?, ?)
ON CONFLICT(user_id, date) DO UPDATE SET
status = excluded.status,
updated_at = excluded.updated_at`,
[userId, date, status, currentTimestamp],
(err) => {
if (err) reject(err);
else resolve();
}
);
} else {
// Status unchanged - keep existing timestamp
db.run(
`INSERT INTO calendar_marks (user_id, date, status, updated_at)
VALUES (?, ?, ?, (SELECT updated_at FROM calendar_marks WHERE user_id = ? AND date = ?))
ON CONFLICT(user_id, date) DO UPDATE SET
status = excluded.status`,
[userId, date, status, userId, date],
(err) => {
if (err) reject(err);
else resolve();
}
);
}
}
);
});
});
const dates = Object.keys(markedDates);
if (dates.length > 0) {
const placeholders = dates.map(() => '?').join(',');
dbOperations.push(
new Promise((resolve, reject) => {
db.run(
`DELETE FROM calendar_marks WHERE user_id = ? AND date NOT IN (${placeholders})`,
[userId, ...dates],
(err) => {
if (err) reject(err);
else resolve();
}
);
})
);
} else {
dbOperations.push(
new Promise((resolve, reject) => {
db.run(
'DELETE FROM calendar_marks WHERE user_id = ?',
[userId],
(err) => {
if (err) reject(err);
else resolve();
}
);
})
);
}
Promise.all(dbOperations)
.then(() => {
res.json({ success: true, message: '数据保存成功' });
})
.catch((err) => {
console.error('保存数据失败:', err);
res.status(500).json({ success: false, error: '保存数据失败' });
});
});
module.exports = router;