diff options
Diffstat (limited to 'makima/src/server/handlers')
| -rw-r--r-- | makima/src/server/handlers/listen.rs | 3 | ||||
| -rw-r--r-- | makima/src/server/handlers/mesh.rs | 2 | ||||
| -rw-r--r-- | makima/src/server/handlers/mesh_daemon.rs | 2 | ||||
| -rw-r--r-- | makima/src/server/handlers/mesh_supervisor.rs | 2 | ||||
| -rw-r--r-- | makima/src/server/handlers/mod.rs | 1 | ||||
| -rw-r--r-- | makima/src/server/handlers/settings.rs | 196 |
6 files changed, 5 insertions, 201 deletions
diff --git a/makima/src/server/handlers/listen.rs b/makima/src/server/handlers/listen.rs index 7edcdfc..e1bc30e 100644 --- a/makima/src/server/handlers/listen.rs +++ b/makima/src/server/handlers/listen.rs @@ -208,7 +208,8 @@ async fn handle_socket(socket: WebSocket, state: SharedState) { audio_offset = 0.0; finalized_segments.clear(); file_id = None; - // authenticated_owner_id and target_contract_id are kept from above + authenticated_owner_id = authenticated_owner_id; // Keep from above + target_contract_id = target_contract_id; // Keep from above // Reset models for new session let mut sortformer = ml_models.sortformer.lock().await; diff --git a/makima/src/server/handlers/mesh.rs b/makima/src/server/handlers/mesh.rs index d9d40d7..1a5b9c1 100644 --- a/makima/src/server/handlers/mesh.rs +++ b/makima/src/server/handlers/mesh.rs @@ -20,7 +20,7 @@ use crate::db::models::{ use crate::db::repository::{self, RepositoryError}; use crate::server::auth::Authenticated; use crate::server::messages::ApiError; -use crate::server::state::{DaemonCommand, SharedState, TaskUpdateNotification}; +use crate::server::state::{DaemonCommand, DaemonReauthStatus, SharedState, TaskUpdateNotification}; // ============================================================================= // Authentication Types diff --git a/makima/src/server/handlers/mesh_daemon.rs b/makima/src/server/handlers/mesh_daemon.rs index ed1b603..e5f0a81 100644 --- a/makima/src/server/handlers/mesh_daemon.rs +++ b/makima/src/server/handlers/mesh_daemon.rs @@ -1627,7 +1627,7 @@ async fn handle_daemon_connection(socket: WebSocket, state: SharedState, auth_re ); // Broadcast as task output with auth_required type so UI can display the login link - let _content = format!( + let content = format!( "🔐 Authentication required on daemon{}. Click to login: {}", hostname.as_ref().map(|h| format!(" ({})", h)).unwrap_or_default(), login_url diff --git a/makima/src/server/handlers/mesh_supervisor.rs b/makima/src/server/handlers/mesh_supervisor.rs index 3adb850..ebde52b 100644 --- a/makima/src/server/handlers/mesh_supervisor.rs +++ b/makima/src/server/handlers/mesh_supervisor.rs @@ -1272,7 +1272,7 @@ pub async fn create_branch( headers: HeaderMap, Json(request): Json<CreateBranchRequest>, ) -> impl IntoResponse { - let (supervisor_id, _owner_id) = match verify_supervisor_auth(&state, &headers, None).await { + let (supervisor_id, owner_id) = match verify_supervisor_auth(&state, &headers, None).await { Ok(ids) => ids, Err(e) => return e.into_response(), }; diff --git a/makima/src/server/handlers/mod.rs b/makima/src/server/handlers/mod.rs index b3c433b..4bdb424 100644 --- a/makima/src/server/handlers/mod.rs +++ b/makima/src/server/handlers/mod.rs @@ -20,7 +20,6 @@ pub mod mesh_merge; pub mod mesh_supervisor; pub mod mesh_ws; pub mod repository_history; -pub mod settings; pub mod speak; pub mod templates; pub mod voice; diff --git a/makima/src/server/handlers/settings.rs b/makima/src/server/handlers/settings.rs deleted file mode 100644 index ae52d5a..0000000 --- a/makima/src/server/handlers/settings.rs +++ /dev/null @@ -1,196 +0,0 @@ -//! HTTP handlers for user settings (feature flags / preferences). - -use axum::{ - extract::{Path, State}, - http::StatusCode, - response::IntoResponse, - Json, -}; - -use crate::db::models::{UpsertUserSettingRequest, UserSettingsResponse}; -use crate::db::repository; -use crate::server::auth::Authenticated; -use crate::server::messages::ApiError; -use crate::server::state::SharedState; - -/// List all settings for the authenticated user. -#[utoipa::path( - get, - path = "/api/v1/settings", - responses( - (status = 200, description = "User settings", body = UserSettingsResponse), - (status = 401, description = "Not authenticated", body = ApiError), - (status = 503, description = "Database not configured", body = ApiError), - (status = 500, description = "Internal server error", body = ApiError), - ), - security( - ("bearer_auth" = []) - ), - tag = "Settings" -)] -pub async fn list_settings( - State(state): State<SharedState>, - Authenticated(user): Authenticated, -) -> impl IntoResponse { - let Some(ref pool) = state.db_pool else { - return ( - StatusCode::SERVICE_UNAVAILABLE, - Json(ApiError::new("DB_UNAVAILABLE", "Database not configured")), - ) - .into_response(); - }; - - match repository::get_user_settings(pool, user.owner_id).await { - Ok(settings) => Json(UserSettingsResponse { settings }).into_response(), - Err(e) => { - tracing::error!("Failed to list user settings: {}", e); - ( - StatusCode::INTERNAL_SERVER_ERROR, - Json(ApiError::new("DB_ERROR", e.to_string())), - ) - .into_response() - } - } -} - -/// Get a specific setting by key. -#[utoipa::path( - get, - path = "/api/v1/settings/{key}", - params( - ("key" = String, Path, description = "Setting key") - ), - responses( - (status = 200, description = "User setting", body = crate::db::models::UserSetting), - (status = 401, description = "Not authenticated", body = ApiError), - (status = 404, description = "Setting not found", body = ApiError), - (status = 503, description = "Database not configured", body = ApiError), - (status = 500, description = "Internal server error", body = ApiError), - ), - security( - ("bearer_auth" = []) - ), - tag = "Settings" -)] -pub async fn get_setting( - State(state): State<SharedState>, - Authenticated(user): Authenticated, - Path(key): Path<String>, -) -> impl IntoResponse { - let Some(ref pool) = state.db_pool else { - return ( - StatusCode::SERVICE_UNAVAILABLE, - Json(ApiError::new("DB_UNAVAILABLE", "Database not configured")), - ) - .into_response(); - }; - - match repository::get_user_setting(pool, user.owner_id, &key).await { - Ok(Some(setting)) => Json(setting).into_response(), - Ok(None) => ( - StatusCode::NOT_FOUND, - Json(ApiError::new("NOT_FOUND", format!("Setting '{}' not found", key))), - ) - .into_response(), - Err(e) => { - tracing::error!("Failed to get user setting: {}", e); - ( - StatusCode::INTERNAL_SERVER_ERROR, - Json(ApiError::new("DB_ERROR", e.to_string())), - ) - .into_response() - } - } -} - -/// Upsert a user setting (create or update). -#[utoipa::path( - put, - path = "/api/v1/settings", - request_body = UpsertUserSettingRequest, - responses( - (status = 200, description = "Setting upserted", body = crate::db::models::UserSetting), - (status = 401, description = "Not authenticated", body = ApiError), - (status = 503, description = "Database not configured", body = ApiError), - (status = 500, description = "Internal server error", body = ApiError), - ), - security( - ("bearer_auth" = []) - ), - tag = "Settings" -)] -pub async fn upsert_setting( - State(state): State<SharedState>, - Authenticated(user): Authenticated, - Json(req): Json<UpsertUserSettingRequest>, -) -> impl IntoResponse { - let Some(ref pool) = state.db_pool else { - return ( - StatusCode::SERVICE_UNAVAILABLE, - Json(ApiError::new("DB_UNAVAILABLE", "Database not configured")), - ) - .into_response(); - }; - - match repository::upsert_user_setting(pool, user.owner_id, &req.key, &req.value).await { - Ok(setting) => Json(setting).into_response(), - Err(e) => { - tracing::error!("Failed to upsert user setting: {}", e); - ( - StatusCode::INTERNAL_SERVER_ERROR, - Json(ApiError::new("DB_ERROR", e.to_string())), - ) - .into_response() - } - } -} - -/// Delete a user setting by key. -#[utoipa::path( - delete, - path = "/api/v1/settings/{key}", - params( - ("key" = String, Path, description = "Setting key") - ), - responses( - (status = 200, description = "Setting deleted"), - (status = 401, description = "Not authenticated", body = ApiError), - (status = 404, description = "Setting not found", body = ApiError), - (status = 503, description = "Database not configured", body = ApiError), - (status = 500, description = "Internal server error", body = ApiError), - ), - security( - ("bearer_auth" = []) - ), - tag = "Settings" -)] -pub async fn delete_setting( - State(state): State<SharedState>, - Authenticated(user): Authenticated, - Path(key): Path<String>, -) -> impl IntoResponse { - let Some(ref pool) = state.db_pool else { - return ( - StatusCode::SERVICE_UNAVAILABLE, - Json(ApiError::new("DB_UNAVAILABLE", "Database not configured")), - ) - .into_response(); - }; - - match repository::delete_user_setting(pool, user.owner_id, &key).await { - Ok(true) => StatusCode::OK.into_response(), - Ok(false) => ( - StatusCode::NOT_FOUND, - Json(ApiError::new("NOT_FOUND", format!("Setting '{}' not found", key))), - ) - .into_response(), - Err(e) => { - tracing::error!("Failed to delete user setting: {}", e); - ( - StatusCode::INTERNAL_SERVER_ERROR, - Json(ApiError::new("DB_ERROR", e.to_string())), - ) - .into_response() - } - } -} |
