feat(caldav): implement CalDAV support with token management and calendar operations
All checks were successful
Build & Push Docker Image / build (push) Successful in 6m5s
All checks were successful
Build & Push Docker Image / build (push) Successful in 6m5s
This commit is contained in:
@@ -677,4 +677,69 @@ function generateICS(event, location, prodIdDomain) {
|
||||
return ics.join('\r\n');
|
||||
}
|
||||
|
||||
// ── CalDAV token management ────────────────────────────────────────────────
|
||||
|
||||
// GET /api/calendar/caldav-tokens
|
||||
router.get('/caldav-tokens', authenticateToken, async (req, res) => {
|
||||
try {
|
||||
const db = getDb();
|
||||
const tokens = await db.all(
|
||||
'SELECT id, name, created_at, last_used_at FROM caldav_tokens WHERE user_id = ? ORDER BY created_at DESC',
|
||||
[req.user.id],
|
||||
);
|
||||
res.json({ tokens });
|
||||
} catch (err) {
|
||||
log.server.error(`CalDAV list tokens error: ${err.message}`);
|
||||
res.status(500).json({ error: 'Could not load tokens' });
|
||||
}
|
||||
});
|
||||
|
||||
// POST /api/calendar/caldav-tokens
|
||||
router.post('/caldav-tokens', authenticateToken, async (req, res) => {
|
||||
try {
|
||||
const { name } = req.body;
|
||||
if (!name || !name.trim()) {
|
||||
return res.status(400).json({ error: 'Token name is required' });
|
||||
}
|
||||
const db = getDb();
|
||||
const count = await db.get(
|
||||
'SELECT COUNT(*) as c FROM caldav_tokens WHERE user_id = ?',
|
||||
[req.user.id],
|
||||
);
|
||||
if (count.c >= 10) {
|
||||
return res.status(400).json({ error: 'Maximum of 10 tokens allowed' });
|
||||
}
|
||||
const token = crypto.randomBytes(32).toString('hex');
|
||||
const result = await db.run(
|
||||
'INSERT INTO caldav_tokens (user_id, token, name) VALUES (?, ?, ?)',
|
||||
[req.user.id, token, name.trim()],
|
||||
);
|
||||
res.status(201).json({
|
||||
token: { id: result.lastInsertRowid, name: name.trim() },
|
||||
plainToken: token,
|
||||
});
|
||||
} catch (err) {
|
||||
log.server.error(`CalDAV create token error: ${err.message}`);
|
||||
res.status(500).json({ error: 'Could not create token' });
|
||||
}
|
||||
});
|
||||
|
||||
// DELETE /api/calendar/caldav-tokens/:id
|
||||
router.delete('/caldav-tokens/:id', authenticateToken, async (req, res) => {
|
||||
try {
|
||||
const db = getDb();
|
||||
const result = await db.run(
|
||||
'DELETE FROM caldav_tokens WHERE id = ? AND user_id = ?',
|
||||
[req.params.id, req.user.id],
|
||||
);
|
||||
if (result.changes === 0) {
|
||||
return res.status(404).json({ error: 'Token not found' });
|
||||
}
|
||||
res.json({ ok: true });
|
||||
} catch (err) {
|
||||
log.server.error(`CalDAV delete token error: ${err.message}`);
|
||||
res.status(500).json({ error: 'Could not delete token' });
|
||||
}
|
||||
});
|
||||
|
||||
export default router;
|
||||
|
||||
Reference in New Issue
Block a user