use std::sync::Arc; use axum::{extract::Extension, Json}; use serde::Deserialize; use crate::app_error::AppCommandError; use crate::app_state::AppState; use crate::commands::chat_channel as cc_commands; use crate::models::chat_channel::{ChannelStatusInfo, ChatChannelInfo, ChatChannelMessageLogInfo}; // --------------------------------------------------------------------------- // Param structs // --------------------------------------------------------------------------- #[derive(Deserialize)] #[serde(rename_all = "camelCase")] pub struct CreateChatChannelParams { pub name: String, pub channel_type: String, pub config_json: String, pub enabled: bool, pub daily_report_enabled: bool, pub daily_report_time: Option, } #[derive(Deserialize)] #[serde(rename_all = "camelCase")] pub struct UpdateChatChannelParams { pub id: i32, pub name: Option, pub enabled: Option, pub config_json: Option, pub event_filter_json: Option>, pub daily_report_enabled: Option, pub daily_report_time: Option>, } #[derive(Deserialize)] #[serde(rename_all = "camelCase")] pub struct ChannelIdParams { pub id: i32, } #[derive(Deserialize)] #[serde(rename_all = "camelCase")] pub struct SaveTokenParams { pub channel_id: i32, pub token: String, } #[derive(Deserialize)] #[serde(rename_all = "camelCase")] pub struct ChannelIdOnlyParams { pub channel_id: i32, } #[derive(Deserialize)] #[serde(rename_all = "camelCase")] pub struct ListMessagesParams { pub channel_id: i32, pub limit: Option, pub offset: Option, } // --------------------------------------------------------------------------- // Handlers // --------------------------------------------------------------------------- pub async fn list_chat_channels( Extension(state): Extension>, ) -> Result>, AppCommandError> { let result = cc_commands::list_chat_channels_core(&state.db).await?; Ok(Json(result)) } pub async fn create_chat_channel( Extension(state): Extension>, Json(params): Json, ) -> Result, AppCommandError> { let result = cc_commands::create_chat_channel_core( &state.db, params.name, params.channel_type, params.config_json, params.enabled, params.daily_report_enabled, params.daily_report_time, ) .await?; Ok(Json(result)) } pub async fn update_chat_channel( Extension(state): Extension>, Json(params): Json, ) -> Result, AppCommandError> { let result = cc_commands::update_chat_channel_core( &state.db, params.id, params.name, params.enabled, params.config_json, params.event_filter_json, params.daily_report_enabled, params.daily_report_time, ) .await?; Ok(Json(result)) } pub async fn delete_chat_channel( Extension(state): Extension>, Json(params): Json, ) -> Result, AppCommandError> { cc_commands::delete_chat_channel_core(&state.db, &state.chat_channel_manager, params.id) .await?; Ok(Json(())) } pub async fn save_chat_channel_token( Json(params): Json, ) -> Result, AppCommandError> { cc_commands::save_chat_channel_token_core(params.channel_id, ¶ms.token)?; Ok(Json(())) } pub async fn get_chat_channel_has_token( Json(params): Json, ) -> Result, AppCommandError> { let has = cc_commands::get_chat_channel_has_token_core(params.channel_id)?; Ok(Json(has)) } pub async fn delete_chat_channel_token( Json(params): Json, ) -> Result, AppCommandError> { cc_commands::delete_chat_channel_token_core(params.channel_id)?; Ok(Json(())) } pub async fn connect_chat_channel( Extension(state): Extension>, Json(params): Json, ) -> Result, AppCommandError> { cc_commands::connect_chat_channel_core(&state.db, &state.chat_channel_manager, params.id) .await?; Ok(Json(())) } pub async fn disconnect_chat_channel( Extension(state): Extension>, Json(params): Json, ) -> Result, AppCommandError> { cc_commands::disconnect_chat_channel_core(&state.chat_channel_manager, params.id).await?; Ok(Json(())) } pub async fn test_chat_channel( Extension(state): Extension>, Json(params): Json, ) -> Result, AppCommandError> { cc_commands::test_chat_channel_core(&state.db, params.id).await?; Ok(Json(())) } pub async fn get_chat_channel_status( Extension(state): Extension>, ) -> Result>, AppCommandError> { let result = cc_commands::get_chat_channel_status_core(&state.chat_channel_manager).await?; Ok(Json(result)) } pub async fn list_chat_channel_messages( Extension(state): Extension>, Json(params): Json, ) -> Result>, AppCommandError> { let result = cc_commands::list_chat_channel_messages_core( &state.db, params.channel_id, params.limit, params.offset, ) .await?; Ok(Json(result)) } #[derive(Deserialize)] #[serde(rename_all = "camelCase")] pub struct SetCommandPrefixParams { pub prefix: String, } pub async fn get_chat_command_prefix( Extension(state): Extension>, ) -> Result, AppCommandError> { let result = cc_commands::get_chat_command_prefix_core(&state.db).await?; Ok(Json(result)) } pub async fn set_chat_command_prefix( Extension(state): Extension>, Json(params): Json, ) -> Result, AppCommandError> { cc_commands::set_chat_command_prefix_core(&state.db, params.prefix).await?; Ok(Json(())) } #[derive(Deserialize)] #[serde(rename_all = "camelCase")] pub struct SetEventFilterParams { pub filter: Option>, } pub async fn get_chat_event_filter( Extension(state): Extension>, ) -> Result>>, AppCommandError> { let result = cc_commands::get_chat_event_filter_core(&state.db).await?; Ok(Json(result)) } pub async fn set_chat_event_filter( Extension(state): Extension>, Json(params): Json, ) -> Result, AppCommandError> { cc_commands::set_chat_event_filter_core(&state.db, params.filter).await?; Ok(Json(())) } pub async fn get_chat_message_language( Extension(state): Extension>, ) -> Result, AppCommandError> { let result = cc_commands::get_chat_message_language_core(&state.db).await?; Ok(Json(result)) } #[derive(Deserialize)] #[serde(rename_all = "camelCase")] pub struct SetMessageLanguageParams { pub language: String, } pub async fn set_chat_message_language( Extension(state): Extension>, Json(params): Json, ) -> Result, AppCommandError> { cc_commands::set_chat_message_language_core(&state.db, params.language).await?; Ok(Json(())) }