Refactor authentication from database to direct CalDAV authentication
Major architectural change to simplify authentication by authenticating directly against CalDAV servers instead of maintaining a local user database. Backend changes: - Remove SQLite database dependencies and user storage - Refactor AuthService to authenticate directly against CalDAV servers - Update JWT tokens to store CalDAV server info instead of user IDs - Implement proper CalDAV calendar discovery with XML parsing - Fix URL construction for CalDAV REPORT requests - Add comprehensive debug logging for authentication flow Frontend changes: - Add server URL input field to login form - Remove registration functionality entirely - Update calendar service to pass CalDAV passwords via headers - Store CalDAV credentials in localStorage for API calls Key improvements: - Simplified architecture eliminates database complexity - Direct CalDAV authentication ensures credentials always work - Proper calendar discovery automatically finds user calendars - Robust error handling and debug logging for troubleshooting 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
38
src/app.rs
38
src/app.rs
@@ -1,7 +1,7 @@
|
||||
use yew::prelude::*;
|
||||
use yew_router::prelude::*;
|
||||
use gloo_storage::{LocalStorage, Storage};
|
||||
use crate::components::{Login, Register, Calendar};
|
||||
use crate::components::{Login, Calendar};
|
||||
use crate::services::{CalendarService, CalendarEvent};
|
||||
use std::collections::HashMap;
|
||||
use chrono::{Local, NaiveDate, Datelike};
|
||||
@@ -12,8 +12,6 @@ enum Route {
|
||||
Home,
|
||||
#[at("/login")]
|
||||
Login,
|
||||
#[at("/register")]
|
||||
Register,
|
||||
#[at("/calendar")]
|
||||
Calendar,
|
||||
}
|
||||
@@ -56,7 +54,6 @@ pub fn App() -> Html {
|
||||
html! {
|
||||
<nav>
|
||||
<Link<Route> to={Route::Login}>{"Login"}</Link<Route>>
|
||||
<Link<Route> to={Route::Register}>{"Register"}</Link<Route>>
|
||||
</nav>
|
||||
}
|
||||
}
|
||||
@@ -83,13 +80,6 @@ pub fn App() -> Html {
|
||||
html! { <Login {on_login} /> }
|
||||
}
|
||||
}
|
||||
Route::Register => {
|
||||
if auth_token.is_some() {
|
||||
html! { <Redirect<Route> to={Route::Calendar}/> }
|
||||
} else {
|
||||
html! { <Register on_register={on_login.clone()} /> }
|
||||
}
|
||||
}
|
||||
Route::Calendar => {
|
||||
if auth_token.is_some() {
|
||||
html! { <CalendarView /> }
|
||||
@@ -136,7 +126,18 @@ fn CalendarView() -> Html {
|
||||
wasm_bindgen_futures::spawn_local(async move {
|
||||
let calendar_service = CalendarService::new();
|
||||
|
||||
match calendar_service.refresh_event(&token, &uid).await {
|
||||
// Get password from stored credentials
|
||||
let password = if let Ok(credentials_str) = LocalStorage::get::<String>("caldav_credentials") {
|
||||
if let Ok(credentials) = serde_json::from_str::<serde_json::Value>(&credentials_str) {
|
||||
credentials["password"].as_str().unwrap_or("").to_string()
|
||||
} else {
|
||||
String::new()
|
||||
}
|
||||
} else {
|
||||
String::new()
|
||||
};
|
||||
|
||||
match calendar_service.refresh_event(&token, &password, &uid).await {
|
||||
Ok(Some(refreshed_event)) => {
|
||||
// If this is a recurring event, we need to regenerate all occurrences
|
||||
let mut updated_events = (*events).clone();
|
||||
@@ -203,7 +204,18 @@ fn CalendarView() -> Html {
|
||||
wasm_bindgen_futures::spawn_local(async move {
|
||||
let calendar_service = CalendarService::new();
|
||||
|
||||
match calendar_service.fetch_events_for_month(&token, current_year, current_month).await {
|
||||
// Get password from stored credentials
|
||||
let password = if let Ok(credentials_str) = LocalStorage::get::<String>("caldav_credentials") {
|
||||
if let Ok(credentials) = serde_json::from_str::<serde_json::Value>(&credentials_str) {
|
||||
credentials["password"].as_str().unwrap_or("").to_string()
|
||||
} else {
|
||||
String::new()
|
||||
}
|
||||
} else {
|
||||
String::new()
|
||||
};
|
||||
|
||||
match calendar_service.fetch_events_for_month(&token, &password, current_year, current_month).await {
|
||||
Ok(calendar_events) => {
|
||||
let grouped_events = CalendarService::group_events_by_date(calendar_events);
|
||||
events.set(grouped_events);
|
||||
|
||||
Reference in New Issue
Block a user