]> Untitled Git - lemmy.git/commitdiff
Some more API cleanup.
authorDessalines <tyhou13@gmx.com>
Wed, 22 Jul 2020 18:20:08 +0000 (14:20 -0400)
committerDessalines <tyhou13@gmx.com>
Wed, 22 Jul 2020 18:20:08 +0000 (14:20 -0400)
- Extracted methods for is_mod_or_admin, and is_admin.
- Removed admins from GetPostResponse and GetCommunityResponse.
- Some cleanup.

docs/src/contributing_websocket_http_api.md
server/src/api/comment.rs
server/src/api/community.rs
server/src/api/mod.rs
server/src/api/post.rs
server/src/api/site.rs
server/src/api/user.rs
ui/src/components/community.tsx
ui/src/components/post.tsx
ui/src/interfaces.ts

index 8577a5e5695aab2dba95b7d855d45e8a4f17e0d0..62cb1fc441fa875289c99af93e5b1f35be44c1db 100644 (file)
@@ -1054,7 +1054,6 @@ Search types are `All, Comments, Posts, Communities, Users, Url`
   data: {
     community: CommunityView,
     moderators: Vec<CommunityModeratorView>,
-    admins: Vec<UserView>,
   }
 }
 ```
@@ -1379,7 +1378,6 @@ Only admins can remove a community.
     comments: Vec<CommentView>,
     community: CommunityView,
     moderators: Vec<CommunityModeratorView>,
-    admins: Vec<UserView>,
   }
 }
 ```
index 2a5214554c88400d88aa4104a6d7d19b909508ed..df772f53591b32ea8fe2f02bd08e83c9982bec59 100644 (file)
@@ -1,5 +1,5 @@
 use crate::{
-  api::{claims::Claims, APIError, Oper, Perform},
+  api::{claims::Claims, is_mod_or_admin, APIError, Oper, Perform},
   apub::{ApubLikeableType, ApubObjectType},
   blocking,
   websocket::{
@@ -13,7 +13,6 @@ use crate::{
 use lemmy_db::{
   comment::*,
   comment_view::*,
-  community::Community,
   community_view::*,
   moderator::*,
   post::*,
@@ -480,13 +479,7 @@ impl Perform for Oper<RemoveComment> {
     }
 
     // Verify that only a mod or admin can remove
-    let is_mod_or_admin = blocking(pool, move |conn| {
-      Community::is_mod_or_admin(conn, user_id, community_id)
-    })
-    .await?;
-    if !is_mod_or_admin {
-      return Err(APIError::err("not_an_admin").into());
-    }
+    is_mod_or_admin(pool, user_id, community_id).await?;
 
     // Do the remove
     let removed = data.removed;
index 1ae7036f220dc44048f5d81086b95d6bcf3f609e..c5ae152aaec0b3cb0bd75701f5aa0a11adad07d2 100644 (file)
@@ -1,6 +1,6 @@
 use super::*;
 use crate::{
-  api::{claims::Claims, APIError, Oper, Perform},
+  api::{claims::Claims, is_admin, is_mod_or_admin, APIError, Oper, Perform},
   apub::ActorType,
   blocking,
   websocket::{
@@ -34,7 +34,6 @@ pub struct GetCommunity {
 pub struct GetCommunityResponse {
   pub community: CommunityView,
   pub moderators: Vec<CommunityModeratorView>,
-  pub admins: Vec<UserView>, // TODO this should be from GetSite, shouldn't need this
   pub online: usize,
 }
 
@@ -196,13 +195,6 @@ impl Perform for Oper<GetCommunity> {
       Err(_e) => return Err(APIError::err("couldnt_find_community").into()),
     };
 
-    let site = blocking(pool, move |conn| Site::read(conn, 1)).await??;
-    let site_creator_id = site.creator_id;
-    let mut admins = blocking(pool, move |conn| UserView::admins(conn)).await??;
-    let creator_index = admins.iter().position(|r| r.id == site_creator_id).unwrap();
-    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(JoinCommunityRoom {
@@ -224,7 +216,6 @@ impl Perform for Oper<GetCommunity> {
     let res = GetCommunityResponse {
       community: community_view,
       moderators,
-      admins,
       online,
     };
 
@@ -534,13 +525,7 @@ impl Perform for Oper<RemoveCommunity> {
     }
 
     // Verify its an admin (only an admin can remove a community)
-    let admins: Vec<i32> = blocking(pool, move |conn| {
-      UserView::admins(conn).map(|v| v.into_iter().map(|a| a.id).collect())
-    })
-    .await??;
-    if !admins.contains(&user_id) {
-      return Err(APIError::err("not_an_admin").into());
-    }
+    is_admin(pool, user_id).await?;
 
     // Do the remove
     let edit_id = data.edit_id;
@@ -769,13 +754,7 @@ impl Perform for Oper<BanFromCommunity> {
     let community_id = data.community_id;
 
     // Verify that only mods or admins can ban
-    let is_mod_or_admin = blocking(pool, move |conn| {
-      Community::is_mod_or_admin(conn, user_id, community_id)
-    })
-    .await?;
-    if !is_mod_or_admin {
-      return Err(APIError::err("not_an_admin").into());
-    }
+    is_mod_or_admin(pool, user_id, community_id).await?;
 
     let community_user_ban_form = CommunityUserBanForm {
       community_id: data.community_id,
@@ -858,13 +837,7 @@ impl Perform for Oper<AddModToCommunity> {
     let community_id = data.community_id;
 
     // Verify that only mods or admins can add mod
-    let is_mod_or_admin = blocking(pool, move |conn| {
-      Community::is_mod_or_admin(conn, user_id, community_id)
-    })
-    .await?;
-    if !is_mod_or_admin {
-      return Err(APIError::err("not_an_admin").into());
-    }
+    is_mod_or_admin(pool, user_id, community_id).await?;
 
     if data.added {
       let join = move |conn: &'_ _| CommunityModerator::join(conn, &community_moderator_form);
@@ -1015,7 +988,6 @@ impl Perform for Oper<TransferCommunity> {
     Ok(GetCommunityResponse {
       community: community_view,
       moderators,
-      admins,
       online: 0,
     })
   }
index bb65815ad931f80f64ec02af2df34262f79356bb..90117260136878cc5a987e03a7e4d9fe20f09ba6 100644 (file)
@@ -1,6 +1,14 @@
-use crate::{websocket::WebsocketInfo, DbPool, LemmyError};
+use crate::{blocking, websocket::WebsocketInfo, DbPool, LemmyError};
 use actix_web::client::Client;
-use lemmy_db::{community::*, community_view::*, moderator::*, site::*, user::*, user_view::*};
+use lemmy_db::{
+  community::*,
+  community_view::*,
+  moderator::*,
+  site::*,
+  user::*,
+  user_view::*,
+  Crud,
+};
 
 pub mod claims;
 pub mod comment;
@@ -44,3 +52,25 @@ pub trait Perform {
     websocket_info: Option<WebsocketInfo>,
   ) -> Result<Self::Response, LemmyError>;
 }
+
+pub async fn is_mod_or_admin(
+  pool: &DbPool,
+  user_id: i32,
+  community_id: i32,
+) -> Result<(), LemmyError> {
+  let is_mod_or_admin = blocking(pool, move |conn| {
+    Community::is_mod_or_admin(conn, user_id, community_id)
+  })
+  .await?;
+  if !is_mod_or_admin {
+    return Err(APIError::err("not_an_admin").into());
+  }
+  Ok(())
+}
+pub async fn is_admin(pool: &DbPool, user_id: i32) -> Result<(), LemmyError> {
+  let user = blocking(pool, move |conn| User_::read(conn, user_id)).await??;
+  if !user.admin {
+    return Err(APIError::err("not_an_admin").into());
+  }
+  Ok(())
+}
index 70f46b2a2b69bb214859435241dc34f9c3b3fb05..79881c4b534f4d270a81f99ab14d0d198db61810 100644 (file)
@@ -1,5 +1,5 @@
 use crate::{
-  api::{claims::Claims, APIError, Oper, Perform},
+  api::{claims::Claims, is_mod_or_admin, APIError, Oper, Perform},
   apub::{ApubLikeableType, ApubObjectType},
   blocking,
   fetch_iframely_and_pictrs_data,
@@ -13,16 +13,13 @@ use crate::{
 };
 use lemmy_db::{
   comment_view::*,
-  community::*,
   community_view::*,
   moderator::*,
   naive_now,
   post::*,
   post_view::*,
-  site::*,
   site_view::*,
   user::*,
-  user_view::*,
   Crud,
   Likeable,
   ListingType,
@@ -67,7 +64,6 @@ pub struct GetPostResponse {
   comments: Vec<CommentView>,
   community: CommunityView,
   moderators: Vec<CommunityModeratorView>,
-  admins: Vec<UserView>,
   pub online: usize,
 }
 
@@ -334,14 +330,6 @@ impl Perform for Oper<GetPost> {
     })
     .await??;
 
-    let site_creator_id =
-      blocking(pool, move |conn| Site::read(conn, 1).map(|s| s.creator_id)).await??;
-
-    let mut admins = blocking(pool, move |conn| UserView::admins(conn)).await??;
-    let creator_index = admins.iter().position(|r| r.id == site_creator_id).unwrap();
-    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 {
@@ -366,7 +354,6 @@ impl Perform for Oper<GetPost> {
       comments,
       community,
       moderators,
-      admins,
       online,
     })
   }
@@ -770,13 +757,7 @@ impl Perform for Oper<RemovePost> {
     }
 
     // Verify that only the mods can remove
-    let is_mod_or_admin = blocking(pool, move |conn| {
-      Community::is_mod_or_admin(conn, user_id, community_id)
-    })
-    .await?;
-    if !is_mod_or_admin {
-      return Err(APIError::err("not_an_admin").into());
-    }
+    is_mod_or_admin(pool, user_id, community_id).await?;
 
     // Update the post
     let edit_id = data.edit_id;
@@ -861,13 +842,7 @@ impl Perform for Oper<LockPost> {
     }
 
     // Verify that only the mods can lock
-    let is_mod_or_admin = blocking(pool, move |conn| {
-      Community::is_mod_or_admin(conn, user_id, community_id)
-    })
-    .await?;
-    if !is_mod_or_admin {
-      return Err(APIError::err("not_an_admin").into());
-    }
+    is_mod_or_admin(pool, user_id, community_id).await?;
 
     // Update the post
     let edit_id = data.edit_id;
@@ -943,13 +918,7 @@ impl Perform for Oper<StickyPost> {
     }
 
     // Verify that only the mods can sticky
-    let is_mod_or_admin = blocking(pool, move |conn| {
-      Community::is_mod_or_admin(conn, user_id, community_id)
-    })
-    .await?;
-    if !is_mod_or_admin {
-      return Err(APIError::err("not_an_admin").into());
-    }
+    is_mod_or_admin(pool, user_id, community_id).await?;
 
     // Update the post
     let edit_id = data.edit_id;
index a945d9ec08af3da679f6ad58f2bbd2d539cd31fd..85511e6c925ff6f98eaa05b3ddbdcb66bdbe070f 100644 (file)
@@ -1,6 +1,6 @@
 use super::user::Register;
 use crate::{
-  api::{claims::Claims, APIError, Oper, Perform},
+  api::{claims::Claims, is_admin, APIError, Oper, Perform},
   apub::fetcher::search_by_apub_id,
   blocking,
   version,
@@ -257,10 +257,7 @@ impl Perform for Oper<CreateSite> {
     let user_id = claims.id;
 
     // Make sure user is an admin
-    let user = blocking(pool, move |conn| UserView::read(conn, user_id)).await??;
-    if !user.admin {
-      return Err(APIError::err("not_an_admin").into());
-    }
+    is_admin(pool, user_id).await?;
 
     let site_form = SiteForm {
       name: data.name.to_owned(),
@@ -311,10 +308,7 @@ impl Perform for Oper<EditSite> {
     let user_id = claims.id;
 
     // Make sure user is an admin
-    let user = blocking(pool, move |conn| UserView::read(conn, user_id)).await??;
-    if !user.admin {
-      return Err(APIError::err("not_an_admin").into());
-    }
+    is_admin(pool, user_id).await?;
 
     let found_site = blocking(pool, move |conn| Site::read(conn, 1)).await??;
 
@@ -693,12 +687,7 @@ impl Perform for Oper<GetSiteConfig> {
     let user_id = claims.id;
 
     // Only let admins read this
-    let admins = blocking(pool, move |conn| UserView::admins(conn)).await??;
-    let admin_ids: Vec<i32> = admins.into_iter().map(|m| m.id).collect();
-
-    if !admin_ids.contains(&user_id) {
-      return Err(APIError::err("not_an_admin").into());
-    }
+    is_admin(pool, user_id).await?;
 
     let config_hjson = Settings::read_config_file()?;
 
index ec61c658eb86b840b6ed1c798c7ae88c39971c81..32a16b00e3bfc09d65080762987f21a12a670f8f 100644 (file)
@@ -1,5 +1,5 @@
 use crate::{
-  api::{claims::Claims, APIError, Oper, Perform},
+  api::{claims::Claims, is_admin, APIError, Oper, Perform},
   apub::ApubObjectType,
   blocking,
   websocket::{
@@ -679,10 +679,7 @@ impl Perform for Oper<AddAdmin> {
     let user_id = claims.id;
 
     // Make sure user is an admin
-    let is_admin = move |conn: &'_ _| UserView::read(conn, user_id).map(|u| u.admin);
-    if !blocking(pool, is_admin).await?? {
-      return Err(APIError::err("not_an_admin").into());
-    }
+    is_admin(pool, user_id).await?;
 
     let added = data.added;
     let added_user_id = data.user_id;
@@ -741,10 +738,7 @@ impl Perform for Oper<BanUser> {
     let user_id = claims.id;
 
     // Make sure user is an admin
-    let is_admin = move |conn: &'_ _| UserView::read(conn, user_id).map(|u| u.admin);
-    if !blocking(pool, is_admin).await?? {
-      return Err(APIError::err("not_an_admin").into());
-    }
+    is_admin(pool, user_id).await?;
 
     let ban = data.ban;
     let banned_user_id = data.user_id;
index f70fa4f7af7a701326d982cab581dc21b4813d75..f4610a08b92bee6f368864e10cdb853e1fbfe846 100644 (file)
@@ -355,7 +355,6 @@ export class Community extends Component<any, State> {
       let data = res.data as GetCommunityResponse;
       this.state.community = data.community;
       this.state.moderators = data.moderators;
-      this.state.admins = data.admins;
       this.state.online = data.online;
       document.title = `/c/${this.state.community.name} - ${this.state.site.name}`;
       this.setState(this.state);
@@ -442,6 +441,7 @@ export class Community extends Component<any, State> {
     } else if (res.op == UserOperation.GetSite) {
       let data = res.data as GetSiteResponse;
       this.state.site = data.site;
+      this.state.admins = data.admins;
       this.setState(this.state);
     }
   }
index 9721eb05a026f572fdfbc19ec3f61ef5b1674343..87b44bc34a2839889d3192f5e6845336988a2eb3 100644 (file)
@@ -405,7 +405,6 @@ export class Post extends Component<any, PostState> {
       this.state.comments = data.comments;
       this.state.community = data.community;
       this.state.moderators = data.moderators;
-      this.state.siteRes.admins = data.admins;
       this.state.online = data.online;
       this.state.loading = false;
       document.title = `${this.state.post.name} - ${this.state.siteRes.site.name}`;
@@ -531,7 +530,6 @@ export class Post extends Component<any, PostState> {
       let data = res.data as GetCommunityResponse;
       this.state.community = data.community;
       this.state.moderators = data.moderators;
-      this.state.siteRes.admins = data.admins;
       this.setState(this.state);
     }
   }
index e04eec63ae2ee19430e9dac0c7f55de15f7e4d26..559fbca53a818470e46d46136d6ee349510bb420 100644 (file)
@@ -613,7 +613,6 @@ export interface GetCommunityForm {
 export interface GetCommunityResponse {
   community: Community;
   moderators: Array<CommunityUser>;
-  admins: Array<UserView>;
   online: number;
 }
 
@@ -688,7 +687,6 @@ export interface GetPostResponse {
   comments: Array<Comment>;
   community: Community;
   moderators: Array<CommunityUser>;
-  admins: Array<UserView>;
   online: number;
 }