Fix API and clippy warnings

remotes/yerba/split-api-crate
Felix Ableitner 3 years ago
parent 249fcc5066
commit 01fc1228d5

@ -188,10 +188,7 @@ impl Perform for BanFromCommunity {
// Mod tables // Mod tables
// TODO eventually do correct expires // TODO eventually do correct expires
let expires = match data.expires { let expires = data.expires.map(naive_from_unix);
Some(time) => Some(naive_from_unix(time)),
None => None,
};
let form = ModBanFromCommunityForm { let form = ModBanFromCommunityForm {
mod_person_id: local_user_view.person.id, mod_person_id: local_user_view.person.id,

@ -12,7 +12,6 @@ mod local_user;
mod post; mod post;
mod post_report; mod post_report;
mod private_message; mod private_message;
pub mod routes;
mod site; mod site;
mod websocket; mod websocket;
@ -33,29 +32,15 @@ pub async fn match_websocket_operation(
op: UserOperation, op: UserOperation,
data: &str, data: &str,
) -> Result<String, LemmyError> { ) -> Result<String, LemmyError> {
//TODO: handle commented out actions in crud crate
match op { match op {
// User ops // User ops
UserOperation::Login => { UserOperation::Login => do_websocket_operation::<Login>(context, id, op, data).await,
//do_websocket_operation::<Login>(context, id, op, data).await
todo!()
}
UserOperation::Register => {
//do_websocket_operation::<Register>(context, id, op, data).await
todo!()
}
UserOperation::GetCaptcha => do_websocket_operation::<GetCaptcha>(context, id, op, data).await, UserOperation::GetCaptcha => do_websocket_operation::<GetCaptcha>(context, id, op, data).await,
UserOperation::GetPersonDetails => {
//do_websocket_operation::<GetPersonDetails>(context, id, op, data).await
todo!()
}
UserOperation::GetReplies => do_websocket_operation::<GetReplies>(context, id, op, data).await, UserOperation::GetReplies => do_websocket_operation::<GetReplies>(context, id, op, data).await,
UserOperation::AddAdmin => do_websocket_operation::<AddAdmin>(context, id, op, data).await, UserOperation::AddAdmin => do_websocket_operation::<AddAdmin>(context, id, op, data).await,
UserOperation::BanPerson => do_websocket_operation::<BanPerson>(context, id, op, data).await, UserOperation::BanPerson => do_websocket_operation::<BanPerson>(context, id, op, data).await,
UserOperation::GetPersonMentions => { UserOperation::GetPersonMentions => {
//do_websocket_operation::<GetPersonMentions>(context, id, op, data).await do_websocket_operation::<GetPersonMentions>(context, id, op, data).await
todo!()
} }
UserOperation::MarkPersonMentionAsRead => { UserOperation::MarkPersonMentionAsRead => {
do_websocket_operation::<MarkPersonMentionAsRead>(context, id, op, data).await do_websocket_operation::<MarkPersonMentionAsRead>(context, id, op, data).await
@ -63,10 +48,6 @@ pub async fn match_websocket_operation(
UserOperation::MarkAllAsRead => { UserOperation::MarkAllAsRead => {
do_websocket_operation::<MarkAllAsRead>(context, id, op, data).await do_websocket_operation::<MarkAllAsRead>(context, id, op, data).await
} }
UserOperation::DeleteAccount => {
//do_websocket_operation::<DeleteAccount>(context, id, op, data).await
todo!()
}
UserOperation::PasswordReset => { UserOperation::PasswordReset => {
do_websocket_operation::<PasswordReset>(context, id, op, data).await do_websocket_operation::<PasswordReset>(context, id, op, data).await
} }
@ -87,40 +68,12 @@ pub async fn match_websocket_operation(
} }
// Private Message ops // Private Message ops
UserOperation::CreatePrivateMessage => {
//do_websocket_operation::<CreatePrivateMessage>(context, id, op, data).await
todo!()
}
UserOperation::EditPrivateMessage => {
//do_websocket_operation::<EditPrivateMessage>(context, id, op, data).await
todo!()
}
UserOperation::DeletePrivateMessage => {
//do_websocket_operation::<DeletePrivateMessage>(context, id, op, data).await
todo!()
}
UserOperation::MarkPrivateMessageAsRead => { UserOperation::MarkPrivateMessageAsRead => {
do_websocket_operation::<MarkPrivateMessageAsRead>(context, id, op, data).await do_websocket_operation::<MarkPrivateMessageAsRead>(context, id, op, data).await
} }
UserOperation::GetPrivateMessages => {
//do_websocket_operation::<GetPrivateMessages>(context, id, op, data).await
todo!()
}
// Site ops // Site ops
UserOperation::GetModlog => do_websocket_operation::<GetModlog>(context, id, op, data).await, UserOperation::GetModlog => do_websocket_operation::<GetModlog>(context, id, op, data).await,
UserOperation::CreateSite => {
//do_websocket_operation::<CreateSite>(context, id, op, data).await
todo!()
}
UserOperation::EditSite => {
//do_websocket_operation::<EditSite>(context, id, op, data).await
todo!()
}
UserOperation::GetSite => {
//do_websocket_operation::<GetSite>(context, id, op, data).await
todo!()
}
UserOperation::GetSiteConfig => { UserOperation::GetSiteConfig => {
do_websocket_operation::<GetSiteConfig>(context, id, op, data).await do_websocket_operation::<GetSiteConfig>(context, id, op, data).await
} }
@ -136,30 +89,6 @@ pub async fn match_websocket_operation(
} }
// Community ops // Community ops
UserOperation::GetCommunity => {
//do_websocket_operation::<GetCommunity>(context, id, op, data).await
todo!()
}
UserOperation::ListCommunities => {
//do_websocket_operation::<ListCommunities>(context, id, op, data).await
todo!()
}
UserOperation::CreateCommunity => {
//do_websocket_operation::<CreateCommunity>(context, id, op, data).await
todo!()
}
UserOperation::EditCommunity => {
//do_websocket_operation::<EditCommunity>(context, id, op, data).await
todo!()
}
UserOperation::DeleteCommunity => {
//do_websocket_operation::<DeleteCommunity>(context, id, op, data).await
todo!()
}
UserOperation::RemoveCommunity => {
//do_websocket_operation::<RemoveCommunity>(context, id, op, data).await
todo!()
}
UserOperation::FollowCommunity => { UserOperation::FollowCommunity => {
do_websocket_operation::<FollowCommunity>(context, id, op, data).await do_websocket_operation::<FollowCommunity>(context, id, op, data).await
} }
@ -174,30 +103,6 @@ pub async fn match_websocket_operation(
} }
// Post ops // Post ops
UserOperation::CreatePost => {
//do_websocket_operation::<CreatePost>(context, id, op, data).await
todo!()
}
UserOperation::GetPost => {
//do_websocket_operation::<GetPost>(context, id, op, data).await
todo!()
}
UserOperation::GetPosts => {
//do_websocket_operation::<GetPosts>(context, id, op, data).await
todo!()
}
UserOperation::EditPost => {
//do_websocket_operation::<EditPost>(context, id, op, data).await
todo!()
}
UserOperation::DeletePost => {
//do_websocket_operation::<DeletePost>(context, id, op, data).await
todo!()
}
UserOperation::RemovePost => {
//do_websocket_operation::<RemovePost>(context, id, op, data).await
todo!()
}
UserOperation::LockPost => do_websocket_operation::<LockPost>(context, id, op, data).await, UserOperation::LockPost => do_websocket_operation::<LockPost>(context, id, op, data).await,
UserOperation::StickyPost => do_websocket_operation::<StickyPost>(context, id, op, data).await, UserOperation::StickyPost => do_websocket_operation::<StickyPost>(context, id, op, data).await,
UserOperation::CreatePostLike => { UserOperation::CreatePostLike => {
@ -215,32 +120,12 @@ pub async fn match_websocket_operation(
} }
// Comment ops // Comment ops
UserOperation::CreateComment => {
//do_websocket_operation::<CreateComment>(context, id, op, data).await
todo!()
}
UserOperation::EditComment => {
//do_websocket_operation::<EditComment>(context, id, op, data).await
todo!()
}
UserOperation::DeleteComment => {
//do_websocket_operation::<DeleteComment>(context, id, op, data).await
todo!()
}
UserOperation::RemoveComment => {
//do_websocket_operation::<RemoveComment>(context, id, op, data).await
todo!()
}
UserOperation::MarkCommentAsRead => { UserOperation::MarkCommentAsRead => {
do_websocket_operation::<MarkCommentAsRead>(context, id, op, data).await do_websocket_operation::<MarkCommentAsRead>(context, id, op, data).await
} }
UserOperation::SaveComment => { UserOperation::SaveComment => {
do_websocket_operation::<SaveComment>(context, id, op, data).await do_websocket_operation::<SaveComment>(context, id, op, data).await
} }
UserOperation::GetComments => {
//do_websocket_operation::<GetComments>(context, id, op, data).await
todo!()
}
UserOperation::CreateCommentLike => { UserOperation::CreateCommentLike => {
do_websocket_operation::<CreateCommentLike>(context, id, op, data).await do_websocket_operation::<CreateCommentLike>(context, id, op, data).await
} }
@ -326,7 +211,7 @@ pub(crate) fn espeak_wav_base64(text: &str) -> Result<String, LemmyError> {
#[cfg(test)] #[cfg(test)]
mod tests { mod tests {
use crate::{captcha_espeak_wav_base64, check_validator_time}; use crate::captcha_espeak_wav_base64;
use lemmy_api_common::check_validator_time; use lemmy_api_common::check_validator_time;
use lemmy_db_queries::{establish_unpooled_connection, source::local_user::LocalUser_, Crud}; use lemmy_db_queries::{establish_unpooled_connection, source::local_user::LocalUser_, Crud};
use lemmy_db_schema::source::{ use lemmy_db_schema::source::{

@ -153,7 +153,7 @@ impl Perform for GetCaptcha {
context.chat_server().do_send(captcha_item); context.chat_server().do_send(captcha_item);
Ok(GetCaptchaResponse { Ok(GetCaptchaResponse {
ok: Some(CaptchaResponse { png, uuid, wav }), ok: Some(CaptchaResponse { png, wav, uuid }),
}) })
} }
} }
@ -407,10 +407,7 @@ impl Perform for BanPerson {
} }
// Mod tables // Mod tables
let expires = match data.expires { let expires = data.expires.map(naive_from_unix);
Some(time) => Some(naive_from_unix(time)),
None => None,
};
let form = ModBanForm { let form = ModBanForm {
mod_person_id: local_user_view.person.id, mod_person_id: local_user_view.person.id,

@ -18,7 +18,7 @@ use lemmy_utils::{
ConnectionId, ConnectionId,
LemmyError, LemmyError,
}; };
use lemmy_websocket::{messages::SendComment, LemmyContext, UserOperation}; use lemmy_websocket::{messages::SendComment, LemmyContext, UserOperationCrud};
#[async_trait::async_trait(?Send)] #[async_trait::async_trait(?Send)]
impl PerformCrud for CreateComment { impl PerformCrud for CreateComment {
@ -158,7 +158,7 @@ impl PerformCrud for CreateComment {
}; };
context.chat_server().do_send(SendComment { context.chat_server().do_send(SendComment {
op: UserOperation::CreateComment, op: UserOperationCrud::CreateComment,
comment: res.clone(), comment: res.clone(),
websocket_id, websocket_id,
}); });

@ -13,7 +13,7 @@ use lemmy_db_queries::{source::comment::Comment_, Crud};
use lemmy_db_schema::source::{comment::*, moderator::*}; use lemmy_db_schema::source::{comment::*, moderator::*};
use lemmy_db_views::comment_view::CommentView; use lemmy_db_views::comment_view::CommentView;
use lemmy_utils::{ApiError, ConnectionId, LemmyError}; use lemmy_utils::{ApiError, ConnectionId, LemmyError};
use lemmy_websocket::{messages::SendComment, LemmyContext, UserOperation}; use lemmy_websocket::{messages::SendComment, LemmyContext, UserOperationCrud};
#[async_trait::async_trait(?Send)] #[async_trait::async_trait(?Send)]
impl PerformCrud for DeleteComment { impl PerformCrud for DeleteComment {
@ -95,7 +95,7 @@ impl PerformCrud for DeleteComment {
}; };
context.chat_server().do_send(SendComment { context.chat_server().do_send(SendComment {
op: UserOperation::DeleteComment, op: UserOperationCrud::DeleteComment,
comment: res.clone(), comment: res.clone(),
websocket_id, websocket_id,
}); });
@ -200,7 +200,7 @@ impl PerformCrud for RemoveComment {
}; };
context.chat_server().do_send(SendComment { context.chat_server().do_send(SendComment {
op: UserOperation::RemoveComment, op: UserOperationCrud::RemoveComment,
comment: res.clone(), comment: res.clone(),
websocket_id, websocket_id,
}); });

@ -17,7 +17,7 @@ use lemmy_utils::{
ConnectionId, ConnectionId,
LemmyError, LemmyError,
}; };
use lemmy_websocket::{messages::SendComment, LemmyContext, UserOperation}; use lemmy_websocket::{messages::SendComment, LemmyContext, UserOperationCrud};
#[async_trait::async_trait(?Send)] #[async_trait::async_trait(?Send)]
impl PerformCrud for EditComment { impl PerformCrud for EditComment {
@ -93,7 +93,7 @@ impl PerformCrud for EditComment {
}; };
context.chat_server().do_send(SendComment { context.chat_server().do_send(SendComment {
op: UserOperation::EditComment, op: UserOperationCrud::EditComment,
comment: res.clone(), comment: res.clone(),
websocket_id, websocket_id,
}); });

@ -9,7 +9,7 @@ use lemmy_db_schema::source::{
}; };
use lemmy_db_views_actor::community_view::CommunityView; use lemmy_db_views_actor::community_view::CommunityView;
use lemmy_utils::{utils::naive_from_unix, ApiError, ConnectionId, LemmyError}; use lemmy_utils::{utils::naive_from_unix, ApiError, ConnectionId, LemmyError};
use lemmy_websocket::{LemmyContext, UserOperation}; use lemmy_websocket::{LemmyContext, UserOperationCrud};
#[async_trait::async_trait(?Send)] #[async_trait::async_trait(?Send)]
impl PerformCrud for DeleteCommunity { impl PerformCrud for DeleteCommunity {
@ -61,7 +61,12 @@ impl PerformCrud for DeleteCommunity {
let res = CommunityResponse { community_view }; let res = CommunityResponse { community_view };
send_community_websocket(&res, context, websocket_id, UserOperation::DeleteCommunity); send_community_websocket(
&res,
context,
websocket_id,
UserOperationCrud::DeleteCommunity,
);
Ok(res) Ok(res)
} }
@ -95,10 +100,7 @@ impl PerformCrud for RemoveCommunity {
}; };
// Mod tables // Mod tables
let expires = match data.expires { let expires = data.expires.map(naive_from_unix);
Some(time) => Some(naive_from_unix(time)),
None => None,
};
let form = ModRemoveCommunityForm { let form = ModRemoveCommunityForm {
mod_person_id: local_user_view.person.id, mod_person_id: local_user_view.person.id,
community_id: data.community_id, community_id: data.community_id,
@ -127,7 +129,12 @@ impl PerformCrud for RemoveCommunity {
let res = CommunityResponse { community_view }; let res = CommunityResponse { community_view };
send_community_websocket(&res, context, websocket_id, UserOperation::RemoveCommunity); send_community_websocket(
&res,
context,
websocket_id,
UserOperationCrud::RemoveCommunity,
);
Ok(res) Ok(res)
} }

@ -1,7 +1,7 @@
use actix_web::web::Data; use actix_web::web::Data;
use lemmy_api_common::community::CommunityResponse; use lemmy_api_common::community::CommunityResponse;
use lemmy_utils::ConnectionId; use lemmy_utils::ConnectionId;
use lemmy_websocket::{messages::SendCommunityRoomMessage, LemmyContext, UserOperation}; use lemmy_websocket::{messages::SendCommunityRoomMessage, LemmyContext, UserOperationCrud};
mod create; mod create;
mod delete; mod delete;
@ -12,7 +12,7 @@ pub(in crate::community) fn send_community_websocket(
res: &CommunityResponse, res: &CommunityResponse,
context: &Data<LemmyContext>, context: &Data<LemmyContext>,
websocket_id: Option<ConnectionId>, websocket_id: Option<ConnectionId>,
op: UserOperation, op: UserOperationCrud,
) { ) {
// Strip out the person id and subscribed when sending to others // Strip out the person id and subscribed when sending to others
let mut res_sent = res.clone(); let mut res_sent = res.clone();

@ -87,10 +87,7 @@ impl PerformCrud for ListCommunities {
let data: &ListCommunities = &self; let data: &ListCommunities = &self;
let local_user_view = get_local_user_view_from_jwt_opt(&data.auth, context.pool()).await?; let local_user_view = get_local_user_view_from_jwt_opt(&data.auth, context.pool()).await?;
let person_id = match &local_user_view { let person_id = local_user_view.to_owned().map(|l| l.person.id);
Some(uv) => Some(uv.person.id),
None => None,
};
// Don't show NSFW by default // Don't show NSFW by default
let show_nsfw = match &local_user_view { let show_nsfw = match &local_user_view {

@ -21,7 +21,7 @@ use lemmy_utils::{
ConnectionId, ConnectionId,
LemmyError, LemmyError,
}; };
use lemmy_websocket::{LemmyContext, UserOperation}; use lemmy_websocket::{LemmyContext, UserOperationCrud};
#[async_trait::async_trait(?Send)] #[async_trait::async_trait(?Send)]
impl PerformCrud for EditCommunity { impl PerformCrud for EditCommunity {
@ -102,7 +102,12 @@ impl PerformCrud for EditCommunity {
let res = CommunityResponse { community_view }; let res = CommunityResponse { community_view };
send_community_websocket(&res, context, websocket_id, UserOperation::EditCommunity); send_community_websocket(
&res,
context,
websocket_id,
UserOperationCrud::EditCommunity,
);
Ok(res) Ok(res)
} }

@ -1,12 +1,13 @@
use actix_web::web::Data; use actix_web::{web, web::Data};
use lemmy_api_common::{comment::*, community::*, person::*, post::*, site::*};
use lemmy_utils::{ConnectionId, LemmyError}; use lemmy_utils::{ConnectionId, LemmyError};
use lemmy_websocket::LemmyContext; use lemmy_websocket::{serialize_websocket_message, LemmyContext, UserOperationCrud};
use serde::Deserialize;
mod comment; mod comment;
mod community; mod community;
mod post; mod post;
mod private_message; mod private_message;
pub mod routes;
mod site; mod site;
mod user; mod user;
@ -20,3 +21,112 @@ pub trait PerformCrud {
websocket_id: Option<ConnectionId>, websocket_id: Option<ConnectionId>,
) -> Result<Self::Response, LemmyError>; ) -> Result<Self::Response, LemmyError>;
} }
pub async fn match_websocket_operation_crud(
context: LemmyContext,
id: ConnectionId,
op: UserOperationCrud,
data: &str,
) -> Result<String, LemmyError> {
//TODO: handle commented out actions in crud crate
match op {
// User ops
UserOperationCrud::Register => do_websocket_operation::<Register>(context, id, op, data).await,
UserOperationCrud::GetPersonDetails => {
do_websocket_operation::<GetPersonDetails>(context, id, op, data).await
}
UserOperationCrud::DeleteAccount => {
do_websocket_operation::<DeleteAccount>(context, id, op, data).await
}
// Private Message ops
UserOperationCrud::CreatePrivateMessage => {
do_websocket_operation::<CreatePrivateMessage>(context, id, op, data).await
}
UserOperationCrud::EditPrivateMessage => {
do_websocket_operation::<EditPrivateMessage>(context, id, op, data).await
}
UserOperationCrud::DeletePrivateMessage => {
do_websocket_operation::<DeletePrivateMessage>(context, id, op, data).await
}
UserOperationCrud::GetPrivateMessages => {
do_websocket_operation::<GetPrivateMessages>(context, id, op, data).await
}
// Site ops
UserOperationCrud::CreateSite => {
do_websocket_operation::<CreateSite>(context, id, op, data).await
}
UserOperationCrud::EditSite => do_websocket_operation::<EditSite>(context, id, op, data).await,
UserOperationCrud::GetSite => do_websocket_operation::<GetSite>(context, id, op, data).await,
// Community ops
UserOperationCrud::GetCommunity => {
do_websocket_operation::<GetCommunity>(context, id, op, data).await
}
UserOperationCrud::ListCommunities => {
do_websocket_operation::<ListCommunities>(context, id, op, data).await
}
UserOperationCrud::CreateCommunity => {
do_websocket_operation::<CreateCommunity>(context, id, op, data).await
}
UserOperationCrud::EditCommunity => {
do_websocket_operation::<EditCommunity>(context, id, op, data).await
}
UserOperationCrud::DeleteCommunity => {
do_websocket_operation::<DeleteCommunity>(context, id, op, data).await
}
UserOperationCrud::RemoveCommunity => {
do_websocket_operation::<RemoveCommunity>(context, id, op, data).await
}
// Post ops
UserOperationCrud::CreatePost => {
do_websocket_operation::<CreatePost>(context, id, op, data).await
}
UserOperationCrud::GetPost => do_websocket_operation::<GetPost>(context, id, op, data).await,
UserOperationCrud::GetPosts => do_websocket_operation::<GetPosts>(context, id, op, data).await,
UserOperationCrud::EditPost => do_websocket_operation::<EditPost>(context, id, op, data).await,
UserOperationCrud::DeletePost => {
do_websocket_operation::<DeletePost>(context, id, op, data).await
}
UserOperationCrud::RemovePost => {
do_websocket_operation::<RemovePost>(context, id, op, data).await
}
// Comment ops
UserOperationCrud::CreateComment => {
do_websocket_operation::<CreateComment>(context, id, op, data).await
}
UserOperationCrud::EditComment => {
do_websocket_operation::<EditComment>(context, id, op, data).await
}
UserOperationCrud::DeleteComment => {
do_websocket_operation::<DeleteComment>(context, id, op, data).await
}
UserOperationCrud::RemoveComment => {
do_websocket_operation::<RemoveComment>(context, id, op, data).await
}
UserOperationCrud::GetComments => {
do_websocket_operation::<GetComments>(context, id, op, data).await
}
}
}
async fn do_websocket_operation<'a, 'b, Data>(
context: LemmyContext,
id: ConnectionId,
op: UserOperationCrud,
data: &str,
) -> Result<String, LemmyError>
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)
}

@ -12,7 +12,7 @@ use lemmy_utils::{
ConnectionId, ConnectionId,
LemmyError, LemmyError,
}; };
use lemmy_websocket::{messages::SendPost, LemmyContext, UserOperation}; use lemmy_websocket::{messages::SendPost, LemmyContext, UserOperationCrud};
#[async_trait::async_trait(?Send)] #[async_trait::async_trait(?Send)]
impl PerformCrud for CreatePost { impl PerformCrud for CreatePost {
@ -120,7 +120,7 @@ impl PerformCrud for CreatePost {
let res = PostResponse { post_view }; let res = PostResponse { post_view };
context.chat_server().do_send(SendPost { context.chat_server().do_send(SendPost {
op: UserOperation::CreatePost, op: UserOperationCrud::CreatePost,
post: res.clone(), post: res.clone(),
websocket_id, websocket_id,
}); });

@ -12,7 +12,7 @@ use lemmy_db_queries::{source::post::Post_, Crud};
use lemmy_db_schema::source::{moderator::*, post::*}; use lemmy_db_schema::source::{moderator::*, post::*};
use lemmy_db_views::post_view::PostView; use lemmy_db_views::post_view::PostView;
use lemmy_utils::{ApiError, ConnectionId, LemmyError}; use lemmy_utils::{ApiError, ConnectionId, LemmyError};
use lemmy_websocket::{messages::SendPost, LemmyContext, UserOperation}; use lemmy_websocket::{messages::SendPost, LemmyContext, UserOperationCrud};
#[async_trait::async_trait(?Send)] #[async_trait::async_trait(?Send)]
impl PerformCrud for DeletePost { impl PerformCrud for DeletePost {
@ -70,7 +70,7 @@ impl PerformCrud for DeletePost {
let res = PostResponse { post_view }; let res = PostResponse { post_view };
context.chat_server().do_send(SendPost { context.chat_server().do_send(SendPost {
op: UserOperation::DeletePost, op: UserOperationCrud::DeletePost,
post: res.clone(), post: res.clone(),
websocket_id, websocket_id,
}); });
@ -151,7 +151,7 @@ impl PerformCrud for RemovePost {
let res = PostResponse { post_view }; let res = PostResponse { post_view };
context.chat_server().do_send(SendPost { context.chat_server().do_send(SendPost {
op: UserOperation::RemovePost, op: UserOperationCrud::RemovePost,
post: res.clone(), post: res.clone(),
websocket_id, websocket_id,
}); });

@ -92,10 +92,7 @@ impl PerformCrud for GetPosts {
let data: &GetPosts = &self; let data: &GetPosts = &self;
let local_user_view = get_local_user_view_from_jwt_opt(&data.auth, context.pool()).await?; let local_user_view = get_local_user_view_from_jwt_opt(&data.auth, context.pool()).await?;
let person_id = match &local_user_view { let person_id = local_user_view.to_owned().map(|l| l.person.id);
Some(uv) => Some(uv.person.id),
None => None,
};
let show_nsfw = match &local_user_view { let show_nsfw = match &local_user_view {
Some(uv) => uv.local_user.show_nsfw, Some(uv) => uv.local_user.show_nsfw,

@ -12,7 +12,7 @@ use lemmy_utils::{
ConnectionId, ConnectionId,
LemmyError, LemmyError,
}; };
use lemmy_websocket::{messages::SendPost, LemmyContext, UserOperation}; use lemmy_websocket::{messages::SendPost, LemmyContext, UserOperationCrud};
#[async_trait::async_trait(?Send)] #[async_trait::async_trait(?Send)]
impl PerformCrud for EditPost { impl PerformCrud for EditPost {
@ -106,7 +106,7 @@ impl PerformCrud for EditPost {
let res = PostResponse { post_view }; let res = PostResponse { post_view };
context.chat_server().do_send(SendPost { context.chat_server().do_send(SendPost {
op: UserOperation::EditPost, op: UserOperationCrud::EditPost,
post: res.clone(), post: res.clone(),
websocket_id, websocket_id,
}); });

@ -11,7 +11,7 @@ use lemmy_db_queries::{source::private_message::PrivateMessage_, Crud};
use lemmy_db_schema::source::private_message::{PrivateMessage, PrivateMessageForm}; use lemmy_db_schema::source::private_message::{PrivateMessage, PrivateMessageForm};
use lemmy_db_views::{local_user_view::LocalUserView, private_message_view::PrivateMessageView}; use lemmy_db_views::{local_user_view::LocalUserView, private_message_view::PrivateMessageView};
use lemmy_utils::{utils::remove_slurs, ApiError, ConnectionId, LemmyError}; use lemmy_utils::{utils::remove_slurs, ApiError, ConnectionId, LemmyError};
use lemmy_websocket::{messages::SendUserRoomMessage, LemmyContext, UserOperation}; use lemmy_websocket::{messages::SendUserRoomMessage, LemmyContext, UserOperationCrud};
#[async_trait::async_trait(?Send)] #[async_trait::async_trait(?Send)]
impl PerformCrud for CreatePrivateMessage { impl PerformCrud for CreatePrivateMessage {
@ -100,7 +100,7 @@ impl PerformCrud for CreatePrivateMessage {
let local_recipient_id = local_recipient.local_user.id; let local_recipient_id = local_recipient.local_user.id;
context.chat_server().do_send(SendUserRoomMessage { context.chat_server().do_send(SendUserRoomMessage {
op: UserOperation::CreatePrivateMessage, op: UserOperationCrud::CreatePrivateMessage,
response: res.clone(), response: res.clone(),
local_recipient_id, local_recipient_id,
websocket_id, websocket_id,

@ -10,7 +10,7 @@ use lemmy_db_queries::{source::private_message::PrivateMessage_, Crud};
use lemmy_db_schema::source::private_message::PrivateMessage; use lemmy_db_schema::source::private_message::PrivateMessage;
use lemmy_db_views::{local_user_view::LocalUserView, private_message_view::PrivateMessageView}; use lemmy_db_views::{local_user_view::LocalUserView, private_message_view::PrivateMessageView};
use lemmy_utils::{ApiError, ConnectionId, LemmyError}; use lemmy_utils::{ApiError, ConnectionId, LemmyError};
use lemmy_websocket::{messages::SendUserRoomMessage, LemmyContext, UserOperation}; use lemmy_websocket::{messages::SendUserRoomMessage, LemmyContext, UserOperationCrud};
#[async_trait::async_trait(?Send)] #[async_trait::async_trait(?Send)]
impl PerformCrud for DeletePrivateMessage { impl PerformCrud for DeletePrivateMessage {
@ -76,7 +76,7 @@ impl PerformCrud for DeletePrivateMessage {
{ {
let local_recipient_id = local_recipient.local_user.id; let local_recipient_id = local_recipient.local_user.id;
context.chat_server().do_send(SendUserRoomMessage { context.chat_server().do_send(SendUserRoomMessage {
op: UserOperation::DeletePrivateMessage, op: UserOperationCrud::DeletePrivateMessage,
response: res.clone(), response: res.clone(),
local_recipient_id, local_recipient_id,
websocket_id, websocket_id,

@ -10,7 +10,7 @@ use lemmy_db_queries::{source::private_message::PrivateMessage_, Crud};
use lemmy_db_schema::source::private_message::PrivateMessage; use lemmy_db_schema::source::private_message::PrivateMessage;
use lemmy_db_views::{local_user_view::LocalUserView, private_message_view::PrivateMessageView}; use lemmy_db_views::{local_user_view::LocalUserView, private_message_view::PrivateMessageView};
use lemmy_utils::{utils::remove_slurs, ApiError, ConnectionId, LemmyError}; use lemmy_utils::{utils::remove_slurs, ApiError, ConnectionId, LemmyError};
use lemmy_websocket::{messages::SendUserRoomMessage, LemmyContext, UserOperation}; use lemmy_websocket::{messages::SendUserRoomMessage, LemmyContext, UserOperationCrud};
#[async_trait::async_trait(?Send)] #[async_trait::async_trait(?Send)]
impl PerformCrud for EditPrivateMessage { impl PerformCrud for EditPrivateMessage {
@ -70,7 +70,7 @@ impl PerformCrud for EditPrivateMessage {
{ {
let local_recipient_id = local_recipient.local_user.id; let local_recipient_id = local_recipient.local_user.id;
context.chat_server().do_send(SendUserRoomMessage { context.chat_server().do_send(SendUserRoomMessage {
op: UserOperation::EditPrivateMessage, op: UserOperationCrud::EditPrivateMessage,
response: res.clone(), response: res.clone(),
local_recipient_id, local_recipient_id,
websocket_id, websocket_id,

@ -1,133 +0,0 @@
use crate::PerformCrud;
use actix_web::{error::ErrorBadRequest, *};
use lemmy_api_common::{comment::*, community::*, person::*, post::*, site::*};
use lemmy_utils::rate_limit::RateLimit;
use lemmy_websocket::LemmyContext;
use serde::Deserialize;
pub fn config(cfg: &mut web::ServiceConfig, rate_limit: &RateLimit) {
cfg
.service(
web::scope("/api/v2")
// Site
.service(
web::scope("/site")
.wrap(rate_limit.message())
.route("", web::get().to(route_get::<GetSite>))
// Admin Actions
.route("", web::post().to(route_post::<CreateSite>))
.route("", web::put().to(route_post::<EditSite>)),
)
// Community
.service(
web::resource("/community")
.guard(guard::Post())
.wrap(rate_limit.register())
.route(web::post().to(route_post::<CreateCommunity>)),
)
.service(
web::scope("/community")
.wrap(rate_limit.message())
.route("", web::get().to(route_get::<GetCommunity>))
.route("", web::put().to(route_post::<EditCommunity>))
.route("/list", web::get().to(route_get::<ListCommunities>))
.route("/delete", web::post().to(route_post::<DeleteCommunity>))
// Mod Actions
.route("/remove", web::post().to(route_post::<RemoveCommunity>)),
)
// Post
.service(
// Handle POST to /post separately to add the post() rate limitter
web::resource("/post")
.guard(guard::Post())
.wrap(rate_limit.post())
.route(web::post().to(route_post::<CreatePost>)),
)
.service(
web::scope("/post")
.wrap(rate_limit.message())
.route("", web::get().to(route_get::<GetPost>))
.route("", web::put().to(route_post::<EditPost>))
.route("/delete", web::post().to(route_post::<DeletePost>))
.route("/remove", web::post().to(route_post::<RemovePost>))
.route("/list", web::get().to(route_get::<GetPosts>)),
)
// Comment
.service(
web::scope("/comment")
.wrap(rate_limit.message())
.route("", web::post().to(route_post::<CreateComment>))
.route("", web::put().to(route_post::<EditComment>))
.route("/delete", web::post().to(route_post::<DeleteComment>))
.route("/remove", web::post().to(route_post::<RemoveComment>))
.route("/list", web::get().to(route_get::<GetComments>)),
),
)
// Private Message
.service(
web::scope("/private_message")
.wrap(rate_limit.message())
.route("/list", web::get().to(route_get::<GetPrivateMessages>))
.route("", web::post().to(route_post::<CreatePrivateMessage>))
.route("", web::put().to(route_post::<EditPrivateMessage>))
.route(
"/delete",
web::post().to(route_post::<DeletePrivateMessage>),
),
)
// User
.service(
// Account action, I don't like that it's in /user maybe /accounts
// Handle /user/register separately to add the register() rate limitter
web::resource("/user/register")
.guard(guard::Post())
.wrap(rate_limit.register())
.route(web::post().to(route_post::<Register>)),
)
// User actions
.service(
web::scope("/user")
.wrap(rate_limit.message())
.route("", web::get().to(route_get::<GetPersonDetails>))
.route(
"/delete_account",
web::post().to(route_post::<DeleteAccount>),
),
);
}
async fn perform<Request>(
data: Request,
context: web::Data<LemmyContext>,
) -> Result<HttpResponse, Error>
where
Request: PerformCrud,
Request: Send + 'static,
{
let res = data
.perform(&context, None)
.await
.map(|json| HttpResponse::Ok().json(json))
.map_err(ErrorBadRequest)?;
Ok(res)
}
async fn route_get<'a, Data>(
data: web::Query<Data>,
context: web::Data<LemmyContext>,
) -> Result<HttpResponse, Error>
where
Data: Deserialize<'a> + Send + 'static + PerformCrud,
{
perform::<Data>(data.0, context).await
}
async fn route_post<'a, Data>(
data: web::Json<Data>,
context: web::Data<LemmyContext>,
) -> Result<HttpResponse, Error>
where
Data: Deserialize<'a> + Send + 'static + PerformCrud,
{
perform::<Data>(data.0, context).await
}

@ -18,7 +18,7 @@ use lemmy_utils::{
ConnectionId, ConnectionId,
LemmyError, LemmyError,
}; };
use lemmy_websocket::{messages::SendAllMessage, LemmyContext, UserOperation}; use lemmy_websocket::{messages::SendAllMessage, LemmyContext, UserOperationCrud};
#[async_trait::async_trait(?Send)] #[async_trait::async_trait(?Send)]
impl PerformCrud for EditSite { impl PerformCrud for EditSite {
@ -64,7 +64,7 @@ impl PerformCrud for EditSite {
let res = SiteResponse { site_view }; let res = SiteResponse { site_view };
context.chat_server().do_send(SendAllMessage { context.chat_server().do_send(SendAllMessage {
op: UserOperation::EditSite, op: UserOperationCrud::EditSite,
response: res.clone(), response: res.clone(),
websocket_id, websocket_id,
}); });

@ -12,7 +12,7 @@ use lemmy_db_schema::source::{
}; };
use lemmy_db_views::comment_view::CommentView; use lemmy_db_views::comment_view::CommentView;
use lemmy_utils::{location_info, utils::scrape_text_for_mentions, LemmyError}; use lemmy_utils::{location_info, utils::scrape_text_for_mentions, LemmyError};
use lemmy_websocket::{messages::SendComment, LemmyContext, UserOperation}; use lemmy_websocket::{messages::SendComment, LemmyContext, UserOperation, UserOperationCrud};
pub(crate) async fn receive_create_comment( pub(crate) async fn receive_create_comment(
create: Create, create: Create,
@ -57,7 +57,7 @@ pub(crate) async fn receive_create_comment(
}; };
context.chat_server().do_send(SendComment { context.chat_server().do_send(SendComment {
op: UserOperation::CreateComment, op: UserOperationCrud::CreateComment,
comment: res, comment: res,
websocket_id: None, websocket_id: None,
}); });
@ -98,7 +98,7 @@ pub(crate) async fn receive_update_comment(
}; };
context.chat_server().do_send(SendComment { context.chat_server().do_send(SendComment {
op: UserOperation::EditComment, op: UserOperationCrud::EditComment,
comment: res, comment: res,
websocket_id: None, websocket_id: None,
}); });
@ -220,7 +220,7 @@ pub(crate) async fn receive_delete_comment(
form_id: None, form_id: None,
}; };
context.chat_server().do_send(SendComment { context.chat_server().do_send(SendComment {
op: UserOperation::EditComment, op: UserOperationCrud::EditComment,
comment: res, comment: res,
websocket_id: None, websocket_id: None,
}); });
@ -252,7 +252,7 @@ pub(crate) async fn receive_remove_comment(
form_id: None, form_id: None,
}; };
context.chat_server().do_send(SendComment { context.chat_server().do_send(SendComment {
op: UserOperation::EditComment, op: UserOperationCrud::EditComment,
comment: res, comment: res,
websocket_id: None, websocket_id: None,
}); });

@ -5,7 +5,7 @@ use lemmy_db_queries::{source::comment::Comment_, Likeable};
use lemmy_db_schema::source::comment::{Comment, CommentLike}; use lemmy_db_schema::source::comment::{Comment, CommentLike};
use lemmy_db_views::comment_view::CommentView; use lemmy_db_views::comment_view::CommentView;
use lemmy_utils::LemmyError; use lemmy_utils::LemmyError;
use lemmy_websocket::{messages::SendComment, LemmyContext, UserOperation}; use lemmy_websocket::{messages::SendComment, LemmyContext, UserOperation, UserOperationCrud};
pub(crate) async fn receive_undo_like_comment( pub(crate) async fn receive_undo_like_comment(
like: &Like, like: &Like,
@ -108,7 +108,7 @@ pub(crate) async fn receive_undo_delete_comment(
}; };
context.chat_server().do_send(SendComment { context.chat_server().do_send(SendComment {
op: UserOperation::EditComment, op: UserOperationCrud::EditComment,
comment: res, comment: res,
websocket_id: None, websocket_id: None,
}); });
@ -141,7 +141,7 @@ pub(crate) async fn receive_undo_remove_comment(
}; };
context.chat_server().do_send(SendComment { context.chat_server().do_send(SendComment {
op: UserOperation::EditComment, op: UserOperationCrud::EditComment,
comment: res, comment: res,
websocket_id: None, websocket_id: None,
}); });

@ -3,7 +3,7 @@ use lemmy_db_queries::source::community::Community_;
use lemmy_db_schema::source::community::Community; use lemmy_db_schema::source::community::Community;
use lemmy_db_views_actor::community_view::CommunityView; use lemmy_db_views_actor::community_view::CommunityView;
use lemmy_utils::LemmyError; use lemmy_utils::LemmyError;
use lemmy_websocket::{messages::SendCommunityRoomMessage, LemmyContext, UserOperation}; use lemmy_websocket::{messages::SendCommunityRoomMessage, LemmyContext, UserOperationCrud};
pub(crate) async fn receive_delete_community( pub(crate) async fn receive_delete_community(
context: &LemmyContext, context: &LemmyContext,
@ -24,7 +24,7 @@ pub(crate) async fn receive_delete_community(
let community_id = res.community_view.community.id; let community_id = res.community_view.community.id;
context.chat_server().do_send(SendCommunityRoomMessage { context.chat_server().do_send(SendCommunityRoomMessage {
op: UserOperation::EditCommunity, op: UserOperationCrud::EditCommunity,
response: res, response: res,
community_id, community_id,
websocket_id: None, websocket_id: None,
@ -52,7 +52,7 @@ pub(crate) async fn receive_remove_community(
let community_id = res.community_view.community.id; let community_id = res.community_view.community.id;
context.chat_server().do_send(SendCommunityRoomMessage { context.chat_server().do_send(SendCommunityRoomMessage {
op: UserOperation::EditCommunity, op: UserOperationCrud::EditCommunity,
response: res, response: res,
community_id, community_id,
websocket_id: None, websocket_id: None,
@ -80,7 +80,7 @@ pub(crate) async fn receive_undo_delete_community(
let community_id = res.community_view.community.id; let community_id = res.community_view.community.id;
context.chat_server().do_send(SendCommunityRoomMessage { context.chat_server().do_send(SendCommunityRoomMessage {
op: UserOperation::EditCommunity, op: UserOperationCrud::EditCommunity,
response: res, response: res,
community_id, community_id,
websocket_id: None, websocket_id: None,
@ -109,7 +109,7 @@ pub(crate) async fn receive_undo_remove_community(
let community_id = res.community_view.community.id; let community_id = res.community_view.community.id;
context.chat_server().do_send(SendCommunityRoomMessage { context.chat_server().do_send(SendCommunityRoomMessage {
op: UserOperation::EditCommunity, op: UserOperationCrud::EditCommunity,
response: res, response: res,
community_id, community_id,
websocket_id: None, websocket_id: None,

@ -21,7 +21,7 @@ use lemmy_db_schema::{
}; };
use lemmy_db_views::post_view::PostView; use lemmy_db_views::post_view::PostView;
use lemmy_utils::{location_info, LemmyError}; use lemmy_utils::{location_info, LemmyError};
use lemmy_websocket::{messages::SendPost, LemmyContext, UserOperation}; use lemmy_websocket::{messages::SendPost, LemmyContext, UserOperation, UserOperationCrud};
pub(crate) async fn receive_create_post( pub(crate) async fn receive_create_post(
create: Create, create: Create,
@ -44,7 +44,7 @@ pub(crate) async fn receive_create_post(
let res = PostResponse { post_view }; let res = PostResponse { post_view };
context.chat_server().do_send(SendPost { context.chat_server().do_send(SendPost {
op: UserOperation::CreatePost, op: UserOperationCrud::CreatePost,
post: res, post: res,
websocket_id: None, websocket_id: None,
}); });
@ -107,7 +107,7 @@ pub(crate) async fn receive_update_post(
let res = PostResponse { post_view }; let res = PostResponse { post_view };
context.chat_server().do_send(SendPost { context.chat_server().do_send(SendPost {
op: UserOperation::EditPost, op: UserOperationCrud::EditPost,
post: res, post: res,
websocket_id: None, websocket_id: None,
}); });
@ -209,7 +209,7 @@ pub(crate) async fn receive_delete_post(
let res = PostResponse { post_view }; let res = PostResponse { post_view };
context.chat_server().do_send(SendPost { context.chat_server().do_send(SendPost {
op: UserOperation::EditPost, op: UserOperationCrud::EditPost,
post: res, post: res,
websocket_id: None, websocket_id: None,
}); });
@ -235,7 +235,7 @@ pub(crate) async fn receive_remove_post(
let res = PostResponse { post_view }; let res = PostResponse { post_view };
context.chat_server().do_send(SendPost { context.chat_server().do_send(SendPost {
op: UserOperation::EditPost, op: UserOperationCrud::EditPost,
post: res, post: res,
websocket_id: None, websocket_id: None,
}); });

@ -5,7 +5,7 @@ use lemmy_db_queries::{source::post::Post_, Likeable};
use lemmy_db_schema::source::post::{Post, PostLike}; use lemmy_db_schema::source::post::{Post, PostLike};
use lemmy_db_views::post_view::PostView; use lemmy_db_views::post_view::PostView;
use lemmy_utils::LemmyError; use lemmy_utils::LemmyError;
use lemmy_websocket::{messages::SendPost, LemmyContext, UserOperation}; use lemmy_websocket::{messages::SendPost, LemmyContext, UserOperation, UserOperationCrud};
pub(crate) async fn receive_undo_like_post( pub(crate) async fn receive_undo_like_post(
like: &Like, like: &Like,
@ -89,7 +89,7 @@ pub(crate) async fn receive_undo_delete_post(
let res = PostResponse { post_view }; let res = PostResponse { post_view };
context.chat_server().do_send(SendPost { context.chat_server().do_send(SendPost {
op: UserOperation::EditPost, op: UserOperationCrud::EditPost,
post: res, post: res,
websocket_id: None, websocket_id: None,
}); });
@ -116,7 +116,7 @@ pub(crate) async fn receive_undo_remove_post(
let res = PostResponse { post_view }; let res = PostResponse { post_view };
context.chat_server().do_send(SendPost { context.chat_server().do_send(SendPost {
op: UserOperation::EditPost, op: UserOperationCrud::EditPost,
post: res, post: res,
websocket_id: None, websocket_id: None,
}); });

@ -18,7 +18,7 @@ use lemmy_db_queries::source::private_message::PrivateMessage_;
use lemmy_db_schema::source::private_message::PrivateMessage; use lemmy_db_schema::source::private_message::PrivateMessage;
use lemmy_db_views::{local_user_view::LocalUserView, private_message_view::PrivateMessageView}; use lemmy_db_views::{local_user_view::LocalUserView, private_message_view::PrivateMessageView};
use lemmy_utils::{location_info, LemmyError}; use lemmy_utils::{location_info, LemmyError};
use lemmy_websocket::{messages::SendUserRoomMessage, LemmyContext, UserOperation}; use lemmy_websocket::{messages::SendUserRoomMessage, LemmyContext, UserOperationCrud};
use url::Url; use url::Url;
pub(crate) async fn receive_create_private_message( pub(crate) async fn receive_create_private_message(
@ -60,7 +60,7 @@ pub(crate) async fn receive_create_private_message(
.id; .id;
context.chat_server().do_send(SendUserRoomMessage { context.chat_server().do_send(SendUserRoomMessage {
op: UserOperation::CreatePrivateMessage, op: UserOperationCrud::CreatePrivateMessage,
response: res, response: res,
local_recipient_id, local_recipient_id,
websocket_id: None, websocket_id: None,
@ -106,7 +106,7 @@ pub(crate) async fn receive_update_private_message(
.id; .id;
context.chat_server().do_send(SendUserRoomMessage { context.chat_server().do_send(SendUserRoomMessage {
op: UserOperation::EditPrivateMessage, op: UserOperationCrud::EditPrivateMessage,
response: res, response: res,
local_recipient_id, local_recipient_id,
websocket_id: None, websocket_id: None,
@ -146,7 +146,7 @@ pub(crate) async fn receive_delete_private_message(
.id; .id;
context.chat_server().do_send(SendUserRoomMessage { context.chat_server().do_send(SendUserRoomMessage {
op: UserOperation::EditPrivateMessage, op: UserOperationCrud::EditPrivateMessage,
response: res, response: res,
local_recipient_id, local_recipient_id,
websocket_id: None, websocket_id: None,
@ -191,7 +191,7 @@ pub(crate) async fn receive_undo_delete_private_message(
.id; .id;
context.chat_server().do_send(SendUserRoomMessage { context.chat_server().do_send(SendUserRoomMessage {
op: UserOperation::EditPrivateMessage, op: UserOperationCrud::EditPrivateMessage,
response: res, response: res,
local_recipient_id, local_recipient_id,
websocket_id: None, websocket_id: None,

@ -70,9 +70,9 @@ impl LocalUserView {
)) ))
.first::<LocalUserViewTuple>(conn)?; .first::<LocalUserViewTuple>(conn)?;
Ok(Self { Ok(Self {
local_user,
person, person,
counts, counts,
local_user,
}) })
} }
@ -92,9 +92,9 @@ impl LocalUserView {
)) ))
.first::<LocalUserViewTuple>(conn)?; .first::<LocalUserViewTuple>(conn)?;
Ok(Self { Ok(Self {
local_user,
person, person,
counts, counts,
local_user,
}) })
} }
@ -110,9 +110,9 @@ impl LocalUserView {
)) ))
.first::<LocalUserViewTuple>(conn)?; .first::<LocalUserViewTuple>(conn)?;
Ok(Self { Ok(Self {
local_user,
person, person,
counts, counts,
local_user,
}) })
} }
} }
@ -139,9 +139,9 @@ impl LocalUserSettingsView {
)) ))
.first::<LocalUserSettingsViewTuple>(conn)?; .first::<LocalUserSettingsViewTuple>(conn)?;
Ok(Self { Ok(Self {
local_user,
person, person,
counts, counts,
local_user,
}) })
} }
} }

@ -1,4 +1,11 @@
use crate::{messages::*, serialize_websocket_message, LemmyContext, UserOperation}; use crate::{
messages::*,
serialize_websocket_message,
LemmyContext,
OperationType,
UserOperation,
UserOperationCrud,
};
use actix::prelude::*; use actix::prelude::*;
use anyhow::Context as acontext; use anyhow::Context as acontext;
use background_jobs::QueueHandle; use background_jobs::QueueHandle;
@ -33,6 +40,13 @@ type MessageHandlerType = fn(
data: &str, data: &str,
) -> Pin<Box<dyn Future<Output = Result<String, LemmyError>> + '_>>; ) -> Pin<Box<dyn Future<Output = Result<String, LemmyError>> + '_>>;
type MessageHandlerCrudType = fn(
context: LemmyContext,
id: ConnectionId,
op: UserOperationCrud,
data: &str,
) -> Pin<Box<dyn Future<Output = Result<String, LemmyError>> + '_>>;
/// `ChatServer` manages chat rooms and responsible for coordinating chat /// `ChatServer` manages chat rooms and responsible for coordinating chat
/// session. /// session.
pub struct ChatServer { pub struct ChatServer {
@ -63,6 +77,7 @@ pub struct ChatServer {
pub(super) captchas: Vec<CaptchaItem>, pub(super) captchas: Vec<CaptchaItem>,
message_handler: MessageHandlerType, message_handler: MessageHandlerType,
message_handler_crud: MessageHandlerCrudType,
/// An HTTP Client /// An HTTP Client
client: Client, client: Client,
@ -83,6 +98,7 @@ impl ChatServer {
pool: Pool<ConnectionManager<PgConnection>>, pool: Pool<ConnectionManager<PgConnection>>,
rate_limiter: RateLimit, rate_limiter: RateLimit,
message_handler: MessageHandlerType, message_handler: MessageHandlerType,
message_handler_crud: MessageHandlerCrudType,
client: Client, client: Client,
activity_queue: QueueHandle, activity_queue: QueueHandle,
) -> ChatServer { ) -> ChatServer {
@ -97,6 +113,7 @@ impl ChatServer {
rate_limiter, rate_limiter,
captchas: Vec::new(), captchas: Vec::new(),
message_handler, message_handler,
message_handler_crud,
client, client,
activity_queue, activity_queue,
} }
@ -207,14 +224,15 @@ impl ChatServer {
Ok(()) Ok(())
} }
fn send_post_room_message<Response>( fn send_post_room_message<OP, Response>(
&self, &self,
op: &UserOperation, op: &OP,
response: &Response, response: &Response,
post_id: PostId, post_id: PostId,
websocket_id: Option<ConnectionId>, websocket_id: Option<ConnectionId>,
) -> Result<(), LemmyError> ) -> Result<(), LemmyError>
where where
OP: OperationType + ToString,
Response: Serialize, Response: Serialize,
{ {
let res_str = &serialize_websocket_message(op, response)?; let res_str = &serialize_websocket_message(op, response)?;
@ -231,14 +249,15 @@ impl ChatServer {
Ok(()) Ok(())
} }
pub fn send_community_room_message<Response>( pub fn send_community_room_message<OP, Response>(
&self, &self,
op: &UserOperation, op: &OP,
response: &Response, response: &Response,
community_id: CommunityId, community_id: CommunityId,
websocket_id: Option<ConnectionId>, websocket_id: Option<ConnectionId>,
) -> Result<(), LemmyError> ) -> Result<(), LemmyError>
where where
OP: OperationType + ToString,
Response: Serialize, Response: Serialize,
{ {
let res_str = &serialize_websocket_message(op, response)?; let res_str = &serialize_websocket_message(op, response)?;
@ -255,14 +274,15 @@ impl ChatServer {
Ok(()) Ok(())
} }
pub fn send_mod_room_message<Response>( pub fn send_mod_room_message<OP, Response>(
&self, &self,
op: &UserOperation, op: &OP,
response: &Response, response: &Response,
community_id: CommunityId, community_id: CommunityId,
websocket_id: Option<ConnectionId>, websocket_id: Option<ConnectionId>,
) -> Result<(), LemmyError> ) -> Result<(), LemmyError>
where where
OP: OperationType + ToString,
Response: Serialize, Response: Serialize,
{ {
let res_str = &serialize_websocket_message(op, response)?; let res_str = &serialize_websocket_message(op, response)?;
@ -279,13 +299,14 @@ impl ChatServer {
Ok(()) Ok(())
} }
pub fn send_all_message<Response>( pub fn send_all_message<OP, Response>(
&self, &self,
op: &UserOperation, op: &OP,
response: &Response, response: &Response,
websocket_id: Option<ConnectionId>, websocket_id: Option<ConnectionId>,
) -> Result<(), LemmyError> ) -> Result<(), LemmyError>
where where
OP: OperationType + ToString,
Response: Serialize, Response: Serialize,
{ {
let res_str = &serialize_websocket_message(op, response)?; let res_str = &serialize_websocket_message(op, response)?;
@ -300,14 +321,15 @@ impl ChatServer {
Ok(()) Ok(())
} }
pub fn send_user_room_message<Response>( pub fn send_user_room_message<OP, Response>(
&self, &self,
op: &UserOperation, op: &OP,
response: &Response, response: &Response,
recipient_id: LocalUserId, recipient_id: LocalUserId,
websocket_id: Option<ConnectionId>, websocket_id: Option<ConnectionId>,
) -> Result<(), LemmyError> ) -> Result<(), LemmyError>
where where
OP: OperationType + ToString,
Response: Serialize, Response: Serialize,
{ {
let res_str = &serialize_websocket_message(op, response)?; let res_str = &serialize_websocket_message(op, response)?;
@ -324,12 +346,15 @@ impl ChatServer {
Ok(()) Ok(())
} }
pub fn send_comment( pub fn send_comment<OP>(
&self, &self,
user_operation: &UserOperation, user_operation: &OP,
comment: &CommentResponse, comment: &CommentResponse,
websocket_id: Option<ConnectionId>, websocket_id: Option<ConnectionId>,
) -> Result<(), LemmyError> { ) -> Result<(), LemmyError>
where
OP: OperationType + ToString,
{
let mut comment_reply_sent = comment.clone(); let mut comment_reply_sent = comment.clone();
// Strip out my specific user info // Strip out my specific user info
@ -373,12 +398,15 @@ impl ChatServer {
Ok(()) Ok(())
} }
pub fn send_post( pub fn send_post<OP>(
&self, &self,
user_operation: &UserOperation, user_operation: &OP,
post_res: &PostResponse, post_res: &PostResponse,
websocket_id: Option<ConnectionId>, websocket_id: Option<ConnectionId>,
) -> Result<(), LemmyError> { ) -> Result<(), LemmyError>
where
OP: OperationType + ToString,
{
let community_id = post_res.post_view.community.id; let community_id = post_res.post_view.community.id;
// Don't send my data with it // Don't send my data with it
@ -424,6 +452,7 @@ impl ChatServer {
client: self.client.to_owned(), client: self.client.to_owned(),
activity_queue: self.activity_queue.to_owned(), activity_queue: self.activity_queue.to_owned(),
}; };
let message_handler_crud = self.message_handler_crud;
let message_handler = self.message_handler; let message_handler = self.message_handler;
async move { async move {
let json: Value = serde_json::from_str(&msg.msg)?; let json: Value = serde_json::from_str(&msg.msg)?;
@ -432,13 +461,18 @@ impl ChatServer {
message: "Unknown op type".to_string(), message: "Unknown op type".to_string(),
})?; })?;
let user_operation = UserOperation::from_str(&op)?; if let Ok(user_operation_crud) = UserOperationCrud::from_str(&op) {
let fut = (message_handler)(context, msg.id, user_operation.clone(), data); let fut = (message_handler_crud)(context, msg.id, user_operation_crud.clone(), data);
match user_operation { match user_operation_crud {
UserOperation::Register => rate_limiter.register().wrap(ip, fut).await, UserOperationCrud::Register => rate_limiter.register().wrap(ip, fut).await,
UserOperation::CreatePost => rate_limiter.post().wrap(ip, fut).await, UserOperationCrud::CreatePost => rate_limiter.post().wrap(ip, fut).await,
UserOperation::CreateCommunity => rate_limiter.register().wrap(ip, fut).await, UserOperationCrud::CreateCommunity => rate_limiter.register().wrap(ip, fut).await,
_ => rate_limiter.message().wrap(ip, fut).await, _ => rate_limiter.message().wrap(ip, fut).await,
}
} else {
let user_operation = UserOperation::from_str(&op)?;
let fut = (message_handler)(context, msg.id, user_operation.clone(), data);
rate_limiter.message().wrap(ip, fut).await
} }
} }
} }

@ -1,6 +1,7 @@
use crate::{ use crate::{
chat_server::{ChatServer, SessionInfo}, chat_server::{ChatServer, SessionInfo},
messages::*, messages::*,
OperationType,
}; };
use actix::{Actor, Context, Handler, ResponseFuture}; use actix::{Actor, Context, Handler, ResponseFuture};
use lemmy_db_schema::naive_now; use lemmy_db_schema::naive_now;
@ -82,26 +83,28 @@ impl Handler<StandardMessage> for ChatServer {
} }
} }
impl<Response> Handler<SendAllMessage<Response>> for ChatServer impl<OP, Response> Handler<SendAllMessage<OP, Response>> for ChatServer
where where
OP: OperationType + ToString,
Response: Serialize, Response: Serialize,
{ {
type Result = (); type Result = ();
fn handle(&mut self, msg: SendAllMessage<Response>, _: &mut Context<Self>) { fn handle(&mut self, msg: SendAllMessage<OP, Response>, _: &mut Context<Self>) {
self self
.send_all_message(&msg.op, &msg.response, msg.websocket_id) .send_all_message(&msg.op, &msg.response, msg.websocket_id)
.ok(); .ok();
} }
} }
impl<Response> Handler<SendUserRoomMessage<Response>> for ChatServer impl<OP, Response> Handler<SendUserRoomMessage<OP, Response>> for ChatServer
where where
OP: OperationType + ToString,
Response: Serialize, Response: Serialize,
{ {
type Result = (); type Result = ();
fn handle(&mut self, msg: SendUserRoomMessage<Response>, _: &mut Context<Self>) { fn handle(&mut self, msg: SendUserRoomMessage<OP, Response>, _: &mut Context<Self>) {
self self
.send_user_room_message( .send_user_room_message(
&msg.op, &msg.op,
@ -113,13 +116,14 @@ where
} }
} }
impl<Response> Handler<SendCommunityRoomMessage<Response>> for ChatServer impl<OP, Response> Handler<SendCommunityRoomMessage<OP, Response>> for ChatServer
where where
OP: OperationType + ToString,
Response: Serialize, Response: Serialize,
{ {
type Result = (); type Result = ();
fn handle(&mut self, msg: SendCommunityRoomMessage<Response>, _: &mut Context<Self>) { fn handle(&mut self, msg: SendCommunityRoomMessage<OP, Response>, _: &mut Context<Self>) {
self self
.send_community_room_message(&msg.op, &msg.response, msg.community_id, msg.websocket_id) .send_community_room_message(&msg.op, &msg.response, msg.community_id, msg.websocket_id)
.ok(); .ok();
@ -139,18 +143,24 @@ where
} }
} }
impl Handler<SendPost> for ChatServer { impl<OP> Handler<SendPost<OP>> for ChatServer
where
OP: OperationType + ToString,
{
type Result = (); type Result = ();
fn handle(&mut self, msg: SendPost, _: &mut Context<Self>) { fn handle(&mut self, msg: SendPost<OP>, _: &mut Context<Self>) {
self.send_post(&msg.op, &msg.post, msg.websocket_id).ok(); self.send_post(&msg.op, &msg.post, msg.websocket_id).ok();
} }
} }
impl Handler<SendComment> for ChatServer { impl<OP> Handler<SendComment<OP>> for ChatServer
where
OP: OperationType + ToString,
{
type Result = (); type Result = ();
fn handle(&mut self, msg: SendComment, _: &mut Context<Self>) { fn handle(&mut self, msg: SendComment<OP>, _: &mut Context<Self>) {
self self
.send_comment(&msg.op, &msg.comment, msg.websocket_id) .send_comment(&msg.op, &msg.comment, msg.websocket_id)
.ok(); .ok();

@ -66,12 +66,13 @@ struct WebsocketResponse<T> {
data: T, data: T,
} }
pub fn serialize_websocket_message<Response>( pub fn serialize_websocket_message<OP, Response>(
op: &UserOperation, op: &OP,
data: &Response, data: &Response,
) -> Result<String, LemmyError> ) -> Result<String, LemmyError>
where where
Response: Serialize, Response: Serialize,
OP: ToString,
{ {
let response = WebsocketResponse { let response = WebsocketResponse {
op: op.to_string(), op: op.to_string(),
@ -83,28 +84,14 @@ where
#[derive(EnumString, ToString, Debug, Clone)] #[derive(EnumString, ToString, Debug, Clone)]
pub enum UserOperation { pub enum UserOperation {
Login, Login,
Register,
GetCaptcha, GetCaptcha,
CreateCommunity,
CreatePost,
ListCommunities,
GetPost,
GetCommunity,
CreateComment,
EditComment,
DeleteComment,
RemoveComment,
MarkCommentAsRead, MarkCommentAsRead,
SaveComment, SaveComment,
CreateCommentLike, CreateCommentLike,
CreateCommentReport, CreateCommentReport,
ResolveCommentReport, ResolveCommentReport,
ListCommentReports, ListCommentReports,
GetPosts,
CreatePostLike, CreatePostLike,
EditPost,
DeletePost,
RemovePost,
LockPost, LockPost,
StickyPost, StickyPost,
SavePost, SavePost,
@ -112,21 +99,14 @@ pub enum UserOperation {
ResolvePostReport, ResolvePostReport,
ListPostReports, ListPostReports,
GetReportCount, GetReportCount,
EditCommunity,
DeleteCommunity,
RemoveCommunity,
FollowCommunity, FollowCommunity,
GetFollowedCommunities, GetFollowedCommunities,
GetPersonDetails,
GetReplies, GetReplies,
GetPersonMentions, GetPersonMentions,
MarkPersonMentionAsRead, MarkPersonMentionAsRead,
GetModlog, GetModlog,
BanFromCommunity, BanFromCommunity,
AddModToCommunity, AddModToCommunity,
CreateSite,
EditSite,
GetSite,
AddAdmin, AddAdmin,
BanPerson, BanPerson,
Search, Search,
@ -134,19 +114,56 @@ pub enum UserOperation {
SaveUserSettings, SaveUserSettings,
TransferCommunity, TransferCommunity,
TransferSite, TransferSite,
DeleteAccount,
PasswordReset, PasswordReset,
PasswordChange, PasswordChange,
CreatePrivateMessage,
EditPrivateMessage,
DeletePrivateMessage,
MarkPrivateMessageAsRead, MarkPrivateMessageAsRead,
GetPrivateMessages,
UserJoin, UserJoin,
GetComments,
GetSiteConfig, GetSiteConfig,
SaveSiteConfig, SaveSiteConfig,
PostJoin, PostJoin,
CommunityJoin, CommunityJoin,
ModJoin, ModJoin,
} }
#[derive(EnumString, ToString, Debug, Clone)]
pub enum UserOperationCrud {
// Site
CreateSite,
GetSite,
EditSite,
// Community
CreateCommunity,
ListCommunities,
GetCommunity,
EditCommunity,
DeleteCommunity,
RemoveCommunity,
// Post
CreatePost,
GetPost,
GetPosts,
EditPost,
DeletePost,
RemovePost,
// Comment
CreateComment,
GetComments,
EditComment,
DeleteComment,
RemoveComment,
// User
Register,
GetPersonDetails,
DeleteAccount,
// Private Message
CreatePrivateMessage,
GetPrivateMessages,
EditPrivateMessage,
DeletePrivateMessage,
}
pub trait OperationType {}
impl OperationType for UserOperationCrud {}
impl OperationType for UserOperation {}

@ -40,16 +40,16 @@ pub struct StandardMessage {
#[derive(Message)] #[derive(Message)]
#[rtype(result = "()")] #[rtype(result = "()")]
pub struct SendAllMessage<Response> { pub struct SendAllMessage<OP: ToString, Response> {
pub op: UserOperation, pub op: OP,
pub response: Response, pub response: Response,
pub websocket_id: Option<ConnectionId>, pub websocket_id: Option<ConnectionId>,
} }
#[derive(Message)] #[derive(Message)]
#[rtype(result = "()")] #[rtype(result = "()")]
pub struct SendUserRoomMessage<Response> { pub struct SendUserRoomMessage<OP: ToString, Response> {
pub op: UserOperation, pub op: OP,
pub response: Response, pub response: Response,
pub local_recipient_id: LocalUserId, pub local_recipient_id: LocalUserId,
pub websocket_id: Option<ConnectionId>, pub websocket_id: Option<ConnectionId>,
@ -57,8 +57,8 @@ pub struct SendUserRoomMessage<Response> {
#[derive(Message)] #[derive(Message)]
#[rtype(result = "()")] #[rtype(result = "()")]
pub struct SendCommunityRoomMessage<Response> { pub struct SendCommunityRoomMessage<OP: ToString, Response> {
pub op: UserOperation, pub op: OP,
pub response: Response, pub response: Response,
pub community_id: CommunityId, pub community_id: CommunityId,
pub websocket_id: Option<ConnectionId>, pub websocket_id: Option<ConnectionId>,
@ -75,16 +75,16 @@ pub struct SendModRoomMessage<Response> {
#[derive(Message)] #[derive(Message)]
#[rtype(result = "()")] #[rtype(result = "()")]
pub struct SendPost { pub struct SendPost<OP: ToString> {
pub op: UserOperation, pub op: OP,
pub post: PostResponse, pub post: PostResponse,
pub websocket_id: Option<ConnectionId>, pub websocket_id: Option<ConnectionId>,
} }
#[derive(Message)] #[derive(Message)]
#[rtype(result = "()")] #[rtype(result = "()")]
pub struct SendComment { pub struct SendComment<OP: ToString> {
pub op: UserOperation, pub op: OP,
pub comment: CommentResponse, pub comment: CommentResponse,
pub websocket_id: Option<ConnectionId>, pub websocket_id: Option<ConnectionId>,
} }

@ -15,8 +15,12 @@ const HEARTBEAT_INTERVAL: Duration = Duration::from_secs(5);
/// How long before lack of client response causes a timeout /// How long before lack of client response causes a timeout
const CLIENT_TIMEOUT: Duration = Duration::from_secs(10); const CLIENT_TIMEOUT: Duration = Duration::from_secs(10);
pub fn config(cfg: &mut web::ServiceConfig) {
cfg.service(web::resource("/ws").to(chat_route));
}
/// Entry point for our route /// Entry point for our route
pub async fn chat_route( async fn chat_route(
req: HttpRequest, req: HttpRequest,
stream: web::Payload, stream: web::Payload,
context: web::Data<LemmyContext>, context: web::Data<LemmyContext>,

@ -29,7 +29,7 @@ services:
- ./volumes/pictrs_alpha:/mnt - ./volumes/pictrs_alpha:/mnt
lemmy-alpha-ui: lemmy-alpha-ui:
image: dessalines/lemmy-ui:0.9.9 image: dessalines/lemmy-ui:0.10.0-rc.12
environment: environment:
- LEMMY_INTERNAL_HOST=lemmy-alpha:8541 - LEMMY_INTERNAL_HOST=lemmy-alpha:8541
- LEMMY_EXTERNAL_HOST=localhost:8541 - LEMMY_EXTERNAL_HOST=localhost:8541

@ -1,20 +1,22 @@
use crate::Perform;
use actix_web::{error::ErrorBadRequest, *}; use actix_web::{error::ErrorBadRequest, *};
use lemmy_api::Perform;
use lemmy_api_common::{comment::*, community::*, person::*, post::*, site::*, websocket::*}; use lemmy_api_common::{comment::*, community::*, person::*, post::*, site::*, websocket::*};
use lemmy_api_crud::PerformCrud;
use lemmy_utils::rate_limit::RateLimit; use lemmy_utils::rate_limit::RateLimit;
use lemmy_websocket::{routes::chat_route, LemmyContext}; use lemmy_websocket::LemmyContext;
use serde::Deserialize; use serde::Deserialize;
pub fn config(cfg: &mut web::ServiceConfig, rate_limit: &RateLimit) { pub fn config(cfg: &mut web::ServiceConfig, rate_limit: &RateLimit) {
cfg.service( cfg.service(
web::scope("/api/v2") web::scope("/api/v2")
// Websockets
.service(web::resource("/ws").to(chat_route))
// Site // Site
.service( .service(
web::scope("/site") web::scope("/site")
.wrap(rate_limit.message()) .wrap(rate_limit.message())
.route("", web::get().to(route_get_crud::<GetSite>))
// Admin Actions // Admin Actions
.route("", web::post().to(route_post_crud::<CreateSite>))
.route("", web::put().to(route_post_crud::<EditSite>))
.route("/transfer", web::post().to(route_post::<TransferSite>)) .route("/transfer", web::post().to(route_post::<TransferSite>))
.route("/config", web::get().to(route_get::<GetSiteConfig>)) .route("/config", web::get().to(route_get::<GetSiteConfig>))
.route("/config", web::put().to(route_post::<SaveSiteConfig>)), .route("/config", web::put().to(route_post::<SaveSiteConfig>)),
@ -30,10 +32,28 @@ pub fn config(cfg: &mut web::ServiceConfig, rate_limit: &RateLimit) {
.route(web::get().to(route_get::<Search>)), .route(web::get().to(route_get::<Search>)),
) )
// Community // Community
.service(
web::resource("/community")
.guard(guard::Post())
.wrap(rate_limit.register())
.route(web::post().to(route_post_crud::<CreateCommunity>)),
)
.service( .service(
web::scope("/community") web::scope("/community")
.wrap(rate_limit.message()) .wrap(rate_limit.message())
.route("", web::get().to(route_get_crud::<GetCommunity>))
.route("", web::put().to(route_post_crud::<EditCommunity>))
.route("/list", web::get().to(route_get_crud::<ListCommunities>))
.route("/follow", web::post().to(route_post::<FollowCommunity>)) .route("/follow", web::post().to(route_post::<FollowCommunity>))
.route(
"/delete",
web::post().to(route_post_crud::<DeleteCommunity>),
)
// Mod Actions
.route(
"/remove",
web::post().to(route_post_crud::<RemoveCommunity>),
)
.route("/transfer", web::post().to(route_post::<TransferCommunity>)) .route("/transfer", web::post().to(route_post::<TransferCommunity>))
.route("/ban_user", web::post().to(route_post::<BanFromCommunity>)) .route("/ban_user", web::post().to(route_post::<BanFromCommunity>))
.route("/mod", web::post().to(route_post::<AddModToCommunity>)) .route("/mod", web::post().to(route_post::<AddModToCommunity>))
@ -41,11 +61,23 @@ pub fn config(cfg: &mut web::ServiceConfig, rate_limit: &RateLimit) {
.route("/mod/join", web::post().to(route_post::<ModJoin>)), .route("/mod/join", web::post().to(route_post::<ModJoin>)),
) )
// Post // Post
.service(
// Handle POST to /post separately to add the post() rate limitter
web::resource("/post")
.guard(guard::Post())
.wrap(rate_limit.post())
.route(web::post().to(route_post_crud::<CreatePost>)),
)
.service( .service(
web::scope("/post") web::scope("/post")
.wrap(rate_limit.message()) .wrap(rate_limit.message())
.route("", web::get().to(route_get_crud::<GetPost>))
.route("", web::put().to(route_post_crud::<EditPost>))
.route("/delete", web::post().to(route_post_crud::<DeletePost>))
.route("/remove", web::post().to(route_post_crud::<RemovePost>))
.route("/lock", web::post().to(route_post::<LockPost>)) .route("/lock", web::post().to(route_post::<LockPost>))
.route("/sticky", web::post().to(route_post::<StickyPost>)) .route("/sticky", web::post().to(route_post::<StickyPost>))
.route("/list", web::get().to(route_get_crud::<GetPosts>))
.route("/like", web::post().to(route_post::<CreatePostLike>)) .route("/like", web::post().to(route_post::<CreatePostLike>))
.route("/save", web::put().to(route_post::<SavePost>)) .route("/save", web::put().to(route_post::<SavePost>))
.route("/join", web::post().to(route_post::<PostJoin>)) .route("/join", web::post().to(route_post::<PostJoin>))
@ -60,12 +92,17 @@ pub fn config(cfg: &mut web::ServiceConfig, rate_limit: &RateLimit) {
.service( .service(
web::scope("/comment") web::scope("/comment")
.wrap(rate_limit.message()) .wrap(rate_limit.message())
.route("", web::post().to(route_post_crud::<CreateComment>))
.route("", web::put().to(route_post_crud::<EditComment>))
.route("/delete", web::post().to(route_post_crud::<DeleteComment>))
.route("/remove", web::post().to(route_post_crud::<RemoveComment>))
.route( .route(
"/mark_as_read", "/mark_as_read",
web::post().to(route_post::<MarkCommentAsRead>), web::post().to(route_post::<MarkCommentAsRead>),
) )
.route("/like", web::post().to(route_post::<CreateCommentLike>)) .route("/like", web::post().to(route_post::<CreateCommentLike>))
.route("/save", web::put().to(route_post::<SaveComment>)) .route("/save", web::put().to(route_post::<SaveComment>))
.route("/list", web::get().to(route_get_crud::<GetComments>))
.route("/report", web::post().to(route_post::<CreateCommentReport>)) .route("/report", web::post().to(route_post::<CreateCommentReport>))
.route( .route(
"/report/resolve", "/report/resolve",
@ -80,15 +117,32 @@ pub fn config(cfg: &mut web::ServiceConfig, rate_limit: &RateLimit) {
.service( .service(
web::scope("/private_message") web::scope("/private_message")
.wrap(rate_limit.message()) .wrap(rate_limit.message())
.route("/list", web::get().to(route_get_crud::<GetPrivateMessages>))
.route("", web::post().to(route_post_crud::<CreatePrivateMessage>))
.route("", web::put().to(route_post_crud::<EditPrivateMessage>))
.route(
"/delete",
web::post().to(route_post_crud::<DeletePrivateMessage>),
)
.route( .route(
"/mark_as_read", "/mark_as_read",
web::post().to(route_post::<MarkPrivateMessageAsRead>), web::post().to(route_post::<MarkPrivateMessageAsRead>),
), ),
) )
// User
.service(
// Account action, I don't like that it's in /user maybe /accounts
// Handle /user/register separately to add the register() rate limitter
web::resource("/user/register")
.guard(guard::Post())
.wrap(rate_limit.register())
.route(web::post().to(route_post_crud::<Register>)),
)
// User actions // User actions
.service( .service(
web::scope("/user") web::scope("/user")
.wrap(rate_limit.message()) .wrap(rate_limit.message())
.route("", web::get().to(route_get_crud::<GetPersonDetails>))
.route("/mention", web::get().to(route_get::<GetPersonMentions>)) .route("/mention", web::get().to(route_get::<GetPersonMentions>))
.route( .route(
"/mention/mark_as_read", "/mention/mark_as_read",
@ -105,6 +159,10 @@ pub fn config(cfg: &mut web::ServiceConfig, rate_limit: &RateLimit) {
// Account actions. I don't like that they're in /user maybe /accounts // Account actions. I don't like that they're in /user maybe /accounts
.route("/login", web::post().to(route_post::<Login>)) .route("/login", web::post().to(route_post::<Login>))
.route("/get_captcha", web::get().to(route_get::<GetCaptcha>)) .route("/get_captcha", web::get().to(route_get::<GetCaptcha>))
.route(
"/delete_account",
web::post().to(route_post_crud::<DeleteAccount>),
)
.route( .route(
"/password_reset", "/password_reset",
web::post().to(route_post::<PasswordReset>), web::post().to(route_post::<PasswordReset>),
@ -168,3 +226,39 @@ where
{ {
perform::<Data>(data.0, context).await perform::<Data>(data.0, context).await
} }
async fn perform_crud<Request>(
data: Request,
context: web::Data<LemmyContext>,
) -> Result<HttpResponse, Error>
where
Request: PerformCrud,
Request: Send + 'static,
{
let res = data
.perform(&context, None)
.await
.map(|json| HttpResponse::Ok().json(json))
.map_err(ErrorBadRequest)?;
Ok(res)
}
async fn route_get_crud<'a, Data>(
data: web::Query<Data>,
context: web::Data<LemmyContext>,
) -> Result<HttpResponse, Error>
where
Data: Deserialize<'a> + Send + 'static + PerformCrud,
{
perform_crud::<Data>(data.0, context).await
}
async fn route_post_crud<'a, Data>(
data: web::Json<Data>,
context: web::Data<LemmyContext>,
) -> Result<HttpResponse, Error>
where
Data: Deserialize<'a> + Send + 'static + PerformCrud,
{
perform_crud::<Data>(data.0, context).await
}

@ -1,3 +1,4 @@
#![recursion_limit = "512"] #![recursion_limit = "512"]
pub mod api_routes;
pub mod code_migrations; pub mod code_migrations;
pub mod scheduled_tasks; pub mod scheduled_tasks;

@ -9,10 +9,11 @@ use diesel::{
}; };
use lemmy_api::match_websocket_operation; use lemmy_api::match_websocket_operation;
use lemmy_api_common::blocking; use lemmy_api_common::blocking;
use lemmy_api_crud::match_websocket_operation_crud;
use lemmy_apub::activity_queue::create_activity_queue; use lemmy_apub::activity_queue::create_activity_queue;
use lemmy_db_queries::get_database_url_from_env; use lemmy_db_queries::get_database_url_from_env;
use lemmy_routes::{feeds, images, nodeinfo, webfinger}; use lemmy_routes::{feeds, images, nodeinfo, webfinger};
use lemmy_server::{code_migrations::run_advanced_migrations, scheduled_tasks}; use lemmy_server::{api_routes, code_migrations::run_advanced_migrations, scheduled_tasks};
use lemmy_utils::{ use lemmy_utils::{
rate_limit::{rate_limiter::RateLimiter, RateLimit}, rate_limit::{rate_limiter::RateLimiter, RateLimit},
settings::structs::Settings, settings::structs::Settings,
@ -70,6 +71,7 @@ async fn main() -> Result<(), LemmyError> {
pool.clone(), pool.clone(),
rate_limiter.clone(), rate_limiter.clone(),
|c, i, o, d| Box::pin(match_websocket_operation(c, i, o, d)), |c, i, o, d| Box::pin(match_websocket_operation(c, i, o, d)),
|c, i, o, d| Box::pin(match_websocket_operation_crud(c, i, o, d)),
Client::default(), Client::default(),
activity_queue.clone(), activity_queue.clone(),
) )
@ -88,8 +90,8 @@ async fn main() -> Result<(), LemmyError> {
.wrap(middleware::Logger::default()) .wrap(middleware::Logger::default())
.data(context) .data(context)
// The routes // The routes
.configure(|cfg| lemmy_api_crud::routes::config(cfg, &rate_limiter)) .configure(|cfg| api_routes::config(cfg, &rate_limiter))
.configure(|cfg| lemmy_api::routes::config(cfg, &rate_limiter)) .configure(lemmy_websocket::routes::config)
.configure(lemmy_apub::routes::config) .configure(lemmy_apub::routes::config)
.configure(feeds::config) .configure(feeds::config)
.configure(|cfg| images::config(cfg, &rate_limiter)) .configure(|cfg| images::config(cfg, &rate_limiter))

Loading…
Cancel
Save