use actix_web::{web, web::Data}; use lemmy_api_common::{ comment::{CreateComment, DeleteComment, EditComment, GetComment, GetComments, RemoveComment}, community::{ CreateCommunity, DeleteCommunity, EditCommunity, GetCommunity, ListCommunities, RemoveCommunity, }, person::{DeleteAccount, GetPersonDetails, Register}, post::{CreatePost, DeletePost, EditPost, GetPost, GetPosts, RemovePost}, private_message::{ CreatePrivateMessage, DeletePrivateMessage, EditPrivateMessage, GetPrivateMessages, }, site::{CreateSite, EditSite, GetSite}, }; use lemmy_utils::{error::LemmyError, ConnectionId}; use lemmy_websocket::{serialize_websocket_message, LemmyContext, UserOperationCrud}; use serde::Deserialize; mod comment; mod community; mod post; mod private_message; mod site; mod user; #[async_trait::async_trait(?Send)] pub trait PerformCrud { type Response: serde::ser::Serialize + Send; async fn perform( &self, context: &Data, websocket_id: Option, ) -> Result; } pub async fn match_websocket_operation_crud( context: LemmyContext, id: ConnectionId, op: UserOperationCrud, data: &str, ) -> Result { //TODO: handle commented out actions in crud crate match op { // User ops UserOperationCrud::Register => do_websocket_operation::(context, id, op, data).await, UserOperationCrud::GetPersonDetails => { do_websocket_operation::(context, id, op, data).await } UserOperationCrud::DeleteAccount => { do_websocket_operation::(context, id, op, data).await } // Private Message ops UserOperationCrud::CreatePrivateMessage => { do_websocket_operation::(context, id, op, data).await } UserOperationCrud::EditPrivateMessage => { do_websocket_operation::(context, id, op, data).await } UserOperationCrud::DeletePrivateMessage => { do_websocket_operation::(context, id, op, data).await } UserOperationCrud::GetPrivateMessages => { do_websocket_operation::(context, id, op, data).await } // Site ops UserOperationCrud::CreateSite => { do_websocket_operation::(context, id, op, data).await } UserOperationCrud::EditSite => do_websocket_operation::(context, id, op, data).await, UserOperationCrud::GetSite => do_websocket_operation::(context, id, op, data).await, // Community ops UserOperationCrud::GetCommunity => { do_websocket_operation::(context, id, op, data).await } UserOperationCrud::ListCommunities => { do_websocket_operation::(context, id, op, data).await } UserOperationCrud::CreateCommunity => { do_websocket_operation::(context, id, op, data).await } UserOperationCrud::EditCommunity => { do_websocket_operation::(context, id, op, data).await } UserOperationCrud::DeleteCommunity => { do_websocket_operation::(context, id, op, data).await } UserOperationCrud::RemoveCommunity => { do_websocket_operation::(context, id, op, data).await } // Post ops UserOperationCrud::CreatePost => { do_websocket_operation::(context, id, op, data).await } UserOperationCrud::GetPost => do_websocket_operation::(context, id, op, data).await, UserOperationCrud::GetPosts => do_websocket_operation::(context, id, op, data).await, UserOperationCrud::EditPost => do_websocket_operation::(context, id, op, data).await, UserOperationCrud::DeletePost => { do_websocket_operation::(context, id, op, data).await } UserOperationCrud::RemovePost => { do_websocket_operation::(context, id, op, data).await } // Comment ops UserOperationCrud::CreateComment => { do_websocket_operation::(context, id, op, data).await } UserOperationCrud::EditComment => { do_websocket_operation::(context, id, op, data).await } UserOperationCrud::DeleteComment => { do_websocket_operation::(context, id, op, data).await } UserOperationCrud::RemoveComment => { do_websocket_operation::(context, id, op, data).await } UserOperationCrud::GetComment => { do_websocket_operation::(context, id, op, data).await } UserOperationCrud::GetComments => { do_websocket_operation::(context, id, op, data).await } } } async fn do_websocket_operation<'a, 'b, Data>( context: LemmyContext, id: ConnectionId, op: UserOperationCrud, data: &str, ) -> Result where for<'de> Data: Deserialize<'de> + 'a, Data: PerformCrud, { let parsed_data: Data = serde_json::from_str(data)?; let res = parsed_data .perform(&web::Data::new(context), Some(id)) .await?; serialize_websocket_message(&op, &res) }