summaryrefslogtreecommitdiffstats
path: root/server/src/api/post.rs
diff options
context:
space:
mode:
authorDessalines <tyhou13@gmx.com>2020-04-21 10:25:29 -0400
committerDessalines <tyhou13@gmx.com>2020-04-21 10:25:29 -0400
commitf0026065f5f809d2038ca91d7880becb39b0f9a7 (patch)
treefdb76bb60d89bc56f1e60deaa2a5d62fb5a9edc8 /server/src/api/post.rs
parent2f4b3a4f833ce277ab989626a6210167ce47c29e (diff)
parentb98fa1274151f61b13679aa30f332686bc9645f3 (diff)
Merge branch 'master' into federation_merge_from_master_1
Diffstat (limited to 'server/src/api/post.rs')
-rw-r--r--server/src/api/post.rs150
1 files changed, 128 insertions, 22 deletions
diff --git a/server/src/api/post.rs b/server/src/api/post.rs
index eb8909b2..32eb5470 100644
--- a/server/src/api/post.rs
+++ b/server/src/api/post.rs
@@ -1,7 +1,4 @@
use super::*;
-use crate::apub::activities::{post_create, post_update};
-use diesel::PgConnection;
-use std::str::FromStr;
#[derive(Serialize, Deserialize, Debug)]
pub struct CreatePost {
@@ -80,8 +77,14 @@ pub struct SavePost {
auth: String,
}
-impl Perform<PostResponse> for Oper<CreatePost> {
- fn perform(&self, conn: &PgConnection) -> Result<PostResponse, Error> {
+impl Perform for Oper<CreatePost> {
+ type Response = PostResponse;
+
+ fn perform(
+ &self,
+ pool: Pool<ConnectionManager<PgConnection>>,
+ websocket_info: Option<WebsocketInfo>,
+ ) -> Result<PostResponse, Error> {
let data: &CreatePost = &self.data;
let claims = match Claims::decode(&data.auth) {
@@ -101,6 +104,8 @@ impl Perform<PostResponse> for Oper<CreatePost> {
let user_id = claims.id;
+ let conn = pool.get()?;
+
// Check for a community ban
if CommunityUserBanView::get(&conn, user_id, data.community_id).is_ok() {
return Err(APIError::err("community_ban").into());
@@ -155,7 +160,7 @@ impl Perform<PostResponse> for Oper<CreatePost> {
Err(_e) => return Err(APIError::err("couldnt_create_post").into()),
};
- post_create(&updated_post, &user, conn)?;
+ post_create(&updated_post, &user, &conn)?;
// They like their own post by default
let like_form = PostLikeForm {
@@ -176,12 +181,28 @@ impl Perform<PostResponse> for Oper<CreatePost> {
Err(_e) => return Err(APIError::err("couldnt_find_post").into()),
};
- Ok(PostResponse { post: post_view })
+ let res = PostResponse { post: post_view };
+
+ if let Some(ws) = websocket_info {
+ ws.chatserver.do_send(SendPost {
+ op: UserOperation::CreatePost,
+ post: res.clone(),
+ my_id: ws.id,
+ });
+ }
+
+ Ok(res)
}
}
-impl Perform<GetPostResponse> for Oper<GetPost> {
- fn perform(&self, conn: &PgConnection) -> Result<GetPostResponse, Error> {
+impl Perform for Oper<GetPost> {
+ type Response = GetPostResponse;
+
+ fn perform(
+ &self,
+ pool: Pool<ConnectionManager<PgConnection>>,
+ websocket_info: Option<WebsocketInfo>,
+ ) -> Result<GetPostResponse, Error> {
let data: &GetPost = &self.data;
let user_id: Option<i32> = match &data.auth {
@@ -195,6 +216,8 @@ impl Perform<GetPostResponse> for Oper<GetPost> {
None => None,
};
+ let conn = pool.get()?;
+
let post_view = match PostView::read(&conn, data.id, user_id) {
Ok(post) => post,
Err(_e) => return Err(APIError::err("couldnt_find_post").into()),
@@ -216,6 +239,24 @@ impl Perform<GetPostResponse> for Oper<GetPost> {
let creator_user = admins.remove(creator_index);
admins.insert(0, creator_user);
+ let online = if let Some(ws) = websocket_info {
+ if let Some(id) = ws.id {
+ ws.chatserver.do_send(JoinPostRoom {
+ post_id: data.id,
+ id,
+ });
+ }
+
+ // TODO
+ 1
+ // let fut = async {
+ // ws.chatserver.send(GetPostUsersOnline {post_id: data.id}).await.unwrap()
+ // };
+ // Runtime::new().unwrap().block_on(fut)
+ } else {
+ 0
+ };
+
// Return the jwt
Ok(GetPostResponse {
post: post_view,
@@ -223,13 +264,19 @@ impl Perform<GetPostResponse> for Oper<GetPost> {
community,
moderators,
admins,
- online: 0,
+ online,
})
}
}
-impl Perform<GetPostsResponse> for Oper<GetPosts> {
- fn perform(&self, conn: &PgConnection) -> Result<GetPostsResponse, Error> {
+impl Perform for Oper<GetPosts> {
+ type Response = GetPostsResponse;
+
+ fn perform(
+ &self,
+ pool: Pool<ConnectionManager<PgConnection>>,
+ websocket_info: Option<WebsocketInfo>,
+ ) -> Result<GetPostsResponse, Error> {
let data: &GetPosts = &self.data;
let user_claims: Option<Claims> = match &data.auth {
@@ -253,6 +300,8 @@ impl Perform<GetPostsResponse> for Oper<GetPosts> {
let type_ = ListingType::from_str(&data.type_)?;
let sort = SortType::from_str(&data.sort)?;
+ let conn = pool.get()?;
+
let posts = match PostQueryBuilder::create(&conn)
.listing_type(type_)
.sort(&sort)
@@ -267,12 +316,32 @@ impl Perform<GetPostsResponse> for Oper<GetPosts> {
Err(_e) => return Err(APIError::err("couldnt_get_posts").into()),
};
+ if let Some(ws) = websocket_info {
+ // You don't need to join the specific community room, bc this is already handled by
+ // GetCommunity
+ if data.community_id.is_none() {
+ if let Some(id) = ws.id {
+ // 0 is the "all" community
+ ws.chatserver.do_send(JoinCommunityRoom {
+ community_id: 0,
+ id,
+ });
+ }
+ }
+ }
+
Ok(GetPostsResponse { posts })
}
}
-impl Perform<PostResponse> for Oper<CreatePostLike> {
- fn perform(&self, conn: &PgConnection) -> Result<PostResponse, Error> {
+impl Perform for Oper<CreatePostLike> {
+ type Response = PostResponse;
+
+ fn perform(
+ &self,
+ pool: Pool<ConnectionManager<PgConnection>>,
+ websocket_info: Option<WebsocketInfo>,
+ ) -> Result<PostResponse, Error> {
let data: &CreatePostLike = &self.data;
let claims = match Claims::decode(&data.auth) {
@@ -282,6 +351,8 @@ impl Perform<PostResponse> for Oper<CreatePostLike> {
let user_id = claims.id;
+ let conn = pool.get()?;
+
// Don't do a downvote if site has downvotes disabled
if data.score == -1 {
let site = SiteView::read(&conn)?;
@@ -324,13 +395,28 @@ impl Perform<PostResponse> for Oper<CreatePostLike> {
Err(_e) => return Err(APIError::err("couldnt_find_post").into()),
};
- // just output the score
- Ok(PostResponse { post: post_view })
+ let res = PostResponse { post: post_view };
+
+ if let Some(ws) = websocket_info {
+ ws.chatserver.do_send(SendPost {
+ op: UserOperation::CreatePostLike,
+ post: res.clone(),
+ my_id: ws.id,
+ });
+ }
+
+ Ok(res)
}
}
-impl Perform<PostResponse> for Oper<EditPost> {
- fn perform(&self, conn: &PgConnection) -> Result<PostResponse, Error> {
+impl Perform for Oper<EditPost> {
+ type Response = PostResponse;
+
+ fn perform(
+ &self,
+ pool: Pool<ConnectionManager<PgConnection>>,
+ websocket_info: Option<WebsocketInfo>,
+ ) -> Result<PostResponse, Error> {
let data: &EditPost = &self.data;
if let Err(slurs) = slur_check(&data.name) {
@@ -350,6 +436,8 @@ impl Perform<PostResponse> for Oper<EditPost> {
let user_id = claims.id;
+ let conn = pool.get()?;
+
// Verify its the creator or a mod or admin
let mut editors: Vec<i32> = vec![data.creator_id];
editors.append(
@@ -443,16 +531,32 @@ impl Perform<PostResponse> for Oper<EditPost> {
ModStickyPost::create(&conn, &form)?;
}
- post_update(&updated_post, &user, conn)?;
+ post_update(&updated_post, &user, &conn)?;
let post_view = PostView::read(&conn, data.edit_id, Some(user_id))?;
- Ok(PostResponse { post: post_view })
+ let res = PostResponse { post: post_view };
+
+ if let Some(ws) = websocket_info {
+ ws.chatserver.do_send(SendPost {
+ op: UserOperation::EditPost,
+ post: res.clone(),
+ my_id: ws.id,
+ });
+ }
+
+ Ok(res)
}
}
-impl Perform<PostResponse> for Oper<SavePost> {
- fn perform(&self, conn: &PgConnection) -> Result<PostResponse, Error> {
+impl Perform for Oper<SavePost> {
+ type Response = PostResponse;
+
+ fn perform(
+ &self,
+ pool: Pool<ConnectionManager<PgConnection>>,
+ _websocket_info: Option<WebsocketInfo>,
+ ) -> Result<PostResponse, Error> {
let data: &SavePost = &self.data;
let claims = match Claims::decode(&data.auth) {
@@ -467,6 +571,8 @@ impl Perform<PostResponse> for Oper<SavePost> {
user_id,
};
+ let conn = pool.get()?;
+
if data.save {
match PostSaved::save(&conn, &post_saved_form) {
Ok(post) => post,