feat(schedule): 待办提醒推送、行事历仅展示提醒与管理 API

单次提醒 worker 投递、local 时间写入校验、未来 7 天提醒列表与忽略/批量删除;行事历去掉事项重复展示。

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
john
2026-06-30 02:02:58 +08:00
parent 06eb129a28
commit 2c91689692
20 changed files with 2453 additions and 452 deletions
+33
View File
@@ -1871,6 +1871,39 @@ api.get('/mindspace/v1/space', async (req, res) => {
return sendData(res, req, space);
});
api.post('/mindspace/v1/schedule/reminders/:reminderId/ignore', async (req, res) => {
if (!ensureMindSpaceEnabled(res, req) || !scheduleService) {
return sendError(res, req, 503, 'feature_disabled', '日程服务未启用');
}
try {
const reminder = await scheduleService.cancelReminder({
userId: req.currentUser.id,
reminderId: req.params.reminderId,
});
return sendData(res, req, reminder);
} catch (err) {
const message = err instanceof Error ? err.message : '忽略提醒失败';
return sendError(res, req, 400, 'invalid_schedule_input', message);
}
});
api.post('/mindspace/v1/schedule/reminders/bulk-delete', async (req, res) => {
if (!ensureMindSpaceEnabled(res, req) || !scheduleService) {
return sendError(res, req, 503, 'feature_disabled', '日程服务未启用');
}
try {
const ids = Array.isArray(req.body?.ids) ? req.body.ids.map(String) : [];
const deleted = await scheduleService.deleteReminders({
userId: req.currentUser.id,
reminderIds: ids,
});
return sendData(res, req, { deleted });
} catch (err) {
const message = err instanceof Error ? err.message : '删除提醒失败';
return sendError(res, req, 400, 'invalid_schedule_input', message);
}
});
api.get('/mindspace/v1/space/quota', async (req, res) => {
if (!mindSpace) return res.status(503).json({ message: 'MindSpace 未启用' });
const quota = await mindSpace.getQuota(req.currentUser.id);