use crate::AppState; use crate::extractors::AuthUser; use api_types::{CreateWidgetDto, WidgetDto}; use application::ConfigService; use axum::{ extract::{Path, State}, http::StatusCode, response::Json, }; use domain::{ConfigRepository, EventPublisher, WidgetStateReader}; type S = State>; pub async fn list_widgets( _auth: AuthUser, State(state): S, ) -> Result>, StatusCode> where C: ConfigRepository, C::Error: std::fmt::Debug, E: EventPublisher, E::Error: std::fmt::Debug, { let widgets = state .config .list_widgets() .await .map_err(|_| StatusCode::INTERNAL_SERVER_ERROR)?; Ok(Json(widgets.iter().map(WidgetDto::from).collect())) } pub async fn get_widget( _auth: AuthUser, State(state): S, Path(id): Path, ) -> Result, StatusCode> where C: ConfigRepository, C::Error: std::fmt::Debug, E: EventPublisher, E::Error: std::fmt::Debug, { let widget = state .config .get_widget(id) .await .map_err(|_| StatusCode::INTERNAL_SERVER_ERROR)?; match widget { Some(w) => Ok(Json(WidgetDto::from(&w))), None => Err(StatusCode::NOT_FOUND), } } pub async fn create_widget( _auth: AuthUser, State(state): S, Json(body): Json, ) -> Result where C: ConfigRepository, C::Error: std::fmt::Debug, E: EventPublisher, E::Error: std::fmt::Debug, { let widget = body .into_domain() .map_err(|e| (StatusCode::BAD_REQUEST, e))?; let svc = ConfigService::new(state.config.as_ref(), state.events.as_ref()); svc.create_widget(widget) .await .map_err(|e| (StatusCode::INTERNAL_SERVER_ERROR, format!("{e}")))?; Ok(StatusCode::CREATED) } pub async fn update_widget( _auth: AuthUser, State(state): S, Path(_id): Path, Json(body): Json, ) -> Result where C: ConfigRepository, C::Error: std::fmt::Debug, E: EventPublisher, E::Error: std::fmt::Debug, { let widget = body .into_domain() .map_err(|e| (StatusCode::BAD_REQUEST, e))?; let svc = ConfigService::new(state.config.as_ref(), state.events.as_ref()); svc.update_widget(widget) .await .map_err(|e| (StatusCode::INTERNAL_SERVER_ERROR, format!("{e}")))?; Ok(StatusCode::OK) } pub async fn delete_widget( _auth: AuthUser, State(state): S, Path(id): Path, ) -> Result where C: ConfigRepository, C::Error: std::fmt::Debug, E: EventPublisher, E::Error: std::fmt::Debug, { let svc = ConfigService::new(state.config.as_ref(), state.events.as_ref()); svc.delete_widget(id) .await .map_err(|_| StatusCode::INTERNAL_SERVER_ERROR)?; Ok(StatusCode::NO_CONTENT) } pub async fn preview_widget( _auth: AuthUser, State(state): S, Path(id): Path, ) -> Result, StatusCode> where C: ConfigRepository, C::Error: std::fmt::Debug, E: EventPublisher, E::Error: std::fmt::Debug, W: WidgetStateReader, { match state.widget_states.get_widget_state(id).await { Some(ws) => { let map: serde_json::Map = ws.data.iter().map(|(k, v)| (k.clone(), v.into())).collect(); Ok(Json(serde_json::Value::Object(map))) } None => Err(StatusCode::NOT_FOUND), } }