Add external calendars feature: display read-only ICS calendars alongside CalDAV calendars

- Database: Add external_calendars table with user relationships and CRUD operations
- Backend: Implement REST API endpoints for external calendar management and ICS fetching
- Frontend: Add external calendar modal, sidebar section with visibility toggles
- Calendar integration: Merge external events with regular events in unified view
- ICS parsing: Support multiple datetime formats, recurring events, and timezone handling
- Authentication: Integrate with existing JWT token system for user-specific calendars
- UI: Visual distinction with 📅 indicator and separate management section

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
Connor Johnstone
2025-09-03 18:22:52 -04:00
parent 289284a532
commit 8caa1f45ae
16 changed files with 1207 additions and 18 deletions

View File

@@ -1,6 +1,6 @@
use axum::{
response::Json,
routing::{get, post},
routing::{delete, get, post},
Router,
};
use std::sync::Arc;
@@ -72,6 +72,12 @@ pub async fn run_server() -> Result<(), Box<dyn std::error::Error>> {
.route("/api/preferences", get(handlers::get_preferences))
.route("/api/preferences", post(handlers::update_preferences))
.route("/api/auth/logout", post(handlers::logout))
// External calendars endpoints
.route("/api/external-calendars", get(handlers::get_external_calendars))
.route("/api/external-calendars", post(handlers::create_external_calendar))
.route("/api/external-calendars/:id", post(handlers::update_external_calendar))
.route("/api/external-calendars/:id", delete(handlers::delete_external_calendar))
.route("/api/external-calendars/:id/events", get(handlers::fetch_external_calendar_events))
.layer(
CorsLayer::new()
.allow_origin(Any)