use axum::Json; use axum::extract::{Query, State}; use std::collections::HashMap; use api_types::{ActivityEventResponse, ActivityLogParams, SettingsResponse}; use application::admin::UpdateSettingsCommand; use crate::errors::AppError; use crate::extractors::AdminUser; use crate::state::AppState; const DEFAULT_ACTIVITY_LIMIT: u32 = 50; pub async fn get_settings( State(state): State, AdminUser(_user): AdminUser, ) -> Result, AppError> { let pairs = state.settings_repo.get_all().await?; let settings: HashMap = pairs.into_iter().collect(); Ok(Json(SettingsResponse { settings })) } pub async fn update_settings( State(state): State, AdminUser(_user): AdminUser, Json(body): Json>, ) -> Result, AppError> { let settings_vec: Vec<(String, String)> = body.into_iter().collect(); let cmd = UpdateSettingsCommand { settings: settings_vec, }; let pairs = application::admin::update_settings::execute(&state.admin_deps, cmd).await?; let settings: HashMap = pairs.into_iter().collect(); Ok(Json(SettingsResponse { settings })) } pub async fn get_activity_log( State(state): State, AdminUser(_user): AdminUser, Query(params): Query, ) -> Result>, AppError> { let limit = params.limit.unwrap_or(DEFAULT_ACTIVITY_LIMIT); let events = state.activity_query.recent(limit).await?; Ok(Json( events .into_iter() .map(ActivityEventResponse::from) .collect(), )) }