]> Untitled Git - lemmy.git/commitdiff
More moderation fixed
authorDessalines <tyhou13@gmx.com>
Sat, 20 Apr 2019 07:24:59 +0000 (00:24 -0700)
committerDessalines <tyhou13@gmx.com>
Sat, 20 Apr 2019 07:24:59 +0000 (00:24 -0700)
server/src/actions/comment.rs
server/src/actions/comment_view.rs
server/src/actions/community.rs
server/src/actions/moderator.rs
server/src/actions/post.rs
server/src/actions/post_view.rs
server/src/websocket_server/server.rs
ui/src/components/comment-node.tsx
ui/src/components/post-listing.tsx
ui/src/components/post.tsx
ui/src/interfaces.ts

index c3aa01070d592646d1295f28ea8aa29ffe36d42f..36da90c65d2c4acb8aedc9b1ba793633fadd1fb3 100644 (file)
@@ -184,7 +184,7 @@ mod tests {
       description: None,
       category_id: 1,
       creator_id: inserted_user.id,
-      removed: false,
+      removed: None,
       updated: None
     };
 
@@ -196,8 +196,8 @@ mod tests {
       url: None,
       body: None,
       community_id: inserted_community.id,
-      removed: false,
-      locked: false,
+      removed: None,
+      locked: None,
       updated: None
     };
 
index 3604371665c6cef08d5ef09443bdb82b1fdbd0bc..4e3d99b7e74202f6ff983f1d7af5efc5cfed0045 100644 (file)
@@ -168,7 +168,7 @@ mod tests {
       description: None,
       category_id: 1,
       creator_id: inserted_user.id,
-      removed: false,
+      removed: None,
       updated: None
     };
 
@@ -180,8 +180,8 @@ mod tests {
       url: None,
       body: None,
       community_id: inserted_community.id,
-      removed: false,
-      locked: false,
+      removed: None,
+      locked: None,
       updated: None
     };
 
index 594518bada07de4a01173c3c393b7e111ea9c35b..7a69c8076e4abed4cb95f215ede8a6b9ecd23f99 100644 (file)
@@ -27,7 +27,7 @@ pub struct CommunityForm {
   pub description: Option<String>,
   pub category_id: i32,
   pub creator_id: i32,
-  pub removed: bool,
+  pub removed: Option<bool>,
   pub updated: Option<chrono::NaiveDateTime>
 }
 
@@ -236,7 +236,7 @@ mod tests {
       title: "nada".to_owned(),
       description: None,
       category_id: 1,
-      removed: false,
+      removed: None,
       updated: None,
     };
 
index e0d885ce86978c0a075072e938faeaaa3e91e143..a97b21202d3d3ece1e7b91f7e79aacbb821ee8af 100644 (file)
@@ -441,7 +441,7 @@ mod tests {
       description: None,
       category_id: 1,
       creator_id: inserted_user.id,
-      removed: false,
+      removed: None,
       updated: None
     };
 
@@ -453,8 +453,8 @@ mod tests {
       body: None,
       creator_id: inserted_user.id,
       community_id: inserted_community.id,
-      removed: false,
-      locked: false,
+      removed: None,
+      locked: None,
       updated: None
     };
 
index 0fd0e5c53bd73c06b19f86827b13d242a5397a77..4dd4561d9b70594b729f1b90deb52a6ec46411f3 100644 (file)
@@ -28,8 +28,8 @@ pub struct PostForm {
   pub body: Option<String>,
   pub creator_id: i32,
   pub community_id: i32,
-  pub removed: bool,
-  pub locked: bool,
+  pub removed: Option<bool>,
+  pub locked: Option<bool>,
   pub updated: Option<chrono::NaiveDateTime>
 }
 
@@ -198,7 +198,7 @@ mod tests {
       description: None,
       category_id: 1,
       creator_id: inserted_user.id,
-      removed: false,
+      removed: None,
       updated: None
     };
 
@@ -210,8 +210,8 @@ mod tests {
       body: None,
       creator_id: inserted_user.id,
       community_id: inserted_community.id,
-      removed: false,
-      locked: false,
+      removed: None,
+      locked: None,
       updated: None
     };
 
index 78fcef637055c1cc2d06cc5b19d1a4fa902ceb5a..28e5fb9848d6f914cabc468f3f410aa996d5f52a 100644 (file)
@@ -200,7 +200,7 @@ mod tests {
       description: None,
       creator_id: inserted_user.id,
       category_id: 1,
-      removed: false,
+      removed: None,
       updated: None
     };
 
@@ -212,8 +212,8 @@ mod tests {
       body: None,
       creator_id: inserted_user.id,
       community_id: inserted_community.id,
-      removed: false,
-      locked: false,
+      removed: None,
+      locked: None,
       updated: None
     };
 
index d1f7210951d1241cc20a3ad4966cb211280445d5..63d767c24464d43ba093c1ca693916b0f9cf96ec 100644 (file)
@@ -261,8 +261,8 @@ pub struct EditPost {
   name: String,
   url: Option<String>,
   body: Option<String>,
-  removed: bool,
-  locked: bool,
+  removed: Option<bool>,
+  locked: Option<bool>,
   reason: Option<String>,
   auth: String
 }
@@ -281,7 +281,7 @@ pub struct EditCommunity {
   title: String,
   description: Option<String>,
   category_id: i32,
-  removed: bool,
+  removed: Option<bool>,
   reason: Option<String>,
   expires: Option<i64>,
   auth: String
@@ -836,14 +836,13 @@ impl Perform for CreateCommunity {
     }
 
     // When you create a community, make sure the user becomes a moderator and a follower
-
     let community_form = CommunityForm {
       name: self.name.to_owned(),
       title: self.title.to_owned(),
       description: self.description.to_owned(),
       category_id: self.category_id,
       creator_id: user_id,
-      removed: false,
+      removed: None,
       updated: None,
     };
 
@@ -988,8 +987,8 @@ impl Perform for CreatePost {
       body: self.body.to_owned(),
       community_id: self.community_id,
       creator_id: user_id,
-      removed: false,
-      locked: false,
+      removed: None,
+      locked: None,
       updated: None
     };
 
@@ -1612,15 +1611,24 @@ impl Perform for EditPost {
 
     let user_id = claims.id;
 
-    // Verify its the creator or a mod
-    let mut editors: Vec<i32> = CommunityModeratorView::for_community(&conn, self.community_id)
+    // Verify its the creator or a mod or admin
+    let mut editors: Vec<i32> = vec![self.creator_id];
+    editors.append(
+      &mut CommunityModeratorView::for_community(&conn, self.community_id)
       .unwrap()
       .into_iter()
       .map(|m| m.user_id)
-      .collect();
-    editors.push(self.creator_id);
+      .collect()
+    );
+    editors.append(
+      &mut UserView::admins(&conn)
+      .unwrap()
+      .into_iter()
+      .map(|a| a.id)
+      .collect()
+      );
     if !editors.contains(&user_id) {
-      return self.error("Not allowed to edit comment.");
+      return self.error("Not allowed to edit post.");
     }
 
     // Check for a community ban
@@ -1652,21 +1660,21 @@ impl Perform for EditPost {
     };
 
     // Mod tables
-    if self.removed {
+    if let Some(removed) = self.removed.to_owned() {
       let form = ModRemovePostForm {
         mod_user_id: user_id,
         post_id: self.edit_id,
-        removed: Some(self.removed),
+        removed: Some(removed),
         reason: self.reason.to_owned(),
       };
       ModRemovePost::create(&conn, &form).unwrap();
     }
 
-    if self.locked {
+    if let Some(locked) = self.locked.to_owned() {
       let form = ModLockPostForm {
         mod_user_id: user_id,
         post_id: self.edit_id,
-        locked: Some(self.locked),
+        locked: Some(locked),
       };
       ModLockPost::create(&conn, &form).unwrap();
     }
@@ -1803,7 +1811,7 @@ impl Perform for EditCommunity {
     };
 
     // Mod tables
-    if self.removed {
+    if let Some(removed) = self.removed.to_owned() {
       let expires = match self.expires {
         Some(time) => Some(naive_from_unix(time)),
         None => None
@@ -1811,7 +1819,7 @@ impl Perform for EditCommunity {
       let form = ModRemoveCommunityForm {
         mod_user_id: user_id,
         community_id: self.edit_id,
-        removed: Some(self.removed),
+        removed: Some(removed),
         reason: self.reason.to_owned(),
         expires: expires
       };
index c1fc059b462dd8ae3de7fec5c13e79c9f4df84a0..90cf5a54eb5c1e4204f10969597f5d7e05cb14c0 100644 (file)
@@ -212,15 +212,15 @@ export class CommentNode extends Component<CommentNodeProps, CommentNodeState> {
   }
 
   get isMod(): boolean {
-    return isMod(this.props.moderators.map(m => m.user_id), this.props.node.comment.creator_id);
+    return this.props.moderators && isMod(this.props.moderators.map(m => m.user_id), this.props.node.comment.creator_id);
   }
 
   get isAdmin(): boolean {
-    return isMod(this.props.admins.map(a => a.id), this.props.node.comment.creator_id);
+    return this.props.admins && isMod(this.props.admins.map(a => a.id), this.props.node.comment.creator_id);
   }
 
   get canAdmin(): boolean {
-    return canMod(UserService.Instance.user, this.props.admins.map(a => a.id), this.props.node.comment.creator_id);
+    return this.props.admins && canMod(UserService.Instance.user, this.props.admins.map(a => a.id), this.props.node.comment.creator_id);
   }
 
   handleReplyClick(i: CommentNode) {
@@ -240,7 +240,6 @@ export class CommentNode extends Component<CommentNodeProps, CommentNodeState> {
       creator_id: i.props.node.comment.creator_id,
       post_id: i.props.node.comment.post_id,
       parent_id: i.props.node.comment.parent_id,
-      removed: i.props.node.comment.removed,
       auth: null
     };
     WebSocketService.Instance.editComment(deleteForm);
index da375aee43d315790e311110f28f89b88d0f82fc..7103a8cfe6817d828afc916d81187f5fadb48714 100644 (file)
@@ -1,10 +1,10 @@
 import { Component, linkEvent } from 'inferno';
 import { Link } from 'inferno-router';
 import { WebSocketService, UserService } from '../services';
-import { Post, CreatePostLikeForm, PostForm as PostFormI, SavePostForm } from '../interfaces';
+import { Post, CreatePostLikeForm, PostForm as PostFormI, SavePostForm, CommunityUser, UserView } from '../interfaces';
 import { MomentTime } from './moment-time';
 import { PostForm } from './post-form';
-import { mdToHtml } from '../utils';
+import { mdToHtml, canMod, isMod } from '../utils';
 
 interface PostListingState {
   showEdit: boolean;
@@ -19,6 +19,8 @@ interface PostListingProps {
   showCommunity?: boolean;
   showBody?: boolean;
   viewOnly?: boolean;
+  moderators?: Array<CommunityUser>;
+  admins?: Array<UserView>;
 }
 
 export class PostListing extends Component<PostListingProps, PostListingState> {
@@ -98,6 +100,12 @@ export class PostListing extends Component<PostListingProps, PostListingState> {
             <li className="list-inline-item">
               <span>by </span>
               <Link className="text-info" to={`/user/${post.creator_id}`}>{post.creator_name}</Link>
+              {this.isMod && 
+                <span className="mx-1 badge badge-secondary">mod</span>
+              }
+              {this.isAdmin && 
+                <span className="mx-1 badge badge-secondary">admin</span>
+              }
               {this.props.showCommunity && 
                 <span>
                   <span> to </span>
@@ -135,7 +143,7 @@ export class PostListing extends Component<PostListingProps, PostListingState> {
                   </li>
                 </>
               }
-              {this.props.post.am_mod &&
+              {this.canMod &&
                 <span>
                   <li className="list-inline-item">
                     {!this.props.post.removed ? 
@@ -166,6 +174,29 @@ export class PostListing extends Component<PostListingProps, PostListingState> {
     return UserService.Instance.user && this.props.post.creator_id == UserService.Instance.user.id;
   }
 
+  get canMod(): boolean {
+
+    if (this.props.editable) {
+      let adminsThenMods = this.props.admins.map(a => a.id)
+      .concat(this.props.moderators.map(m => m.user_id));
+
+      return canMod(UserService.Instance.user, adminsThenMods, this.props.post.creator_id);
+
+    } else return false;
+  }
+
+  get isMod(): boolean {
+    return this.props.moderators && isMod(this.props.moderators.map(m => m.user_id), this.props.post.creator_id);
+  }
+
+  get isAdmin(): boolean {
+    return this.props.admins && isMod(this.props.admins.map(a => a.id), this.props.post.creator_id);
+  }
+
+  get canAdmin(): boolean {
+    return this.props.admins && canMod(UserService.Instance.user, this.props.admins.map(a => a.id), this.props.post.creator_id);
+  }
+
   handlePostLike(i: PostListing) {
 
     let form: CreatePostLikeForm = {
@@ -207,8 +238,6 @@ export class PostListing extends Component<PostListingProps, PostListingState> {
       url: '',
       edit_id: i.props.post.id,
       creator_id: i.props.post.creator_id,
-      removed: !i.props.post.removed,
-      locked: !i.props.post.locked,
       auth: null
     };
     WebSocketService.Instance.editPost(deleteForm);
@@ -242,7 +271,6 @@ export class PostListing extends Component<PostListingProps, PostListingState> {
       edit_id: i.props.post.id,
       creator_id: i.props.post.creator_id,
       removed: !i.props.post.removed,
-      locked: !i.props.post.locked,
       reason: i.state.removeReason,
       auth: null,
     };
@@ -258,7 +286,6 @@ export class PostListing extends Component<PostListingProps, PostListingState> {
       community_id: i.props.post.community_id,
       edit_id: i.props.post.id,
       creator_id: i.props.post.creator_id,
-      removed: !i.props.post.removed,
       locked: !i.props.post.locked,
       auth: null,
     };
index 64f56d88973b553aae32591b8f6bfd006769dfb4..56b73f6e549864589a56da863930394a70116792 100644 (file)
@@ -82,7 +82,14 @@ export class Post extends Component<any, PostState> {
         <h5><svg class="icon icon-spinner spin"><use xlinkHref="#icon-spinner"></use></svg></h5> : 
         <div class="row">
             <div class="col-12 col-md-8 col-lg-7 mb-3">
-              <PostListing post={this.state.post} showBody showCommunity editable />
+              <PostListing 
+                post={this.state.post} 
+                showBody 
+                showCommunity 
+                editable 
+                moderators={this.state.moderators} 
+                admins={this.state.admins}
+              />
               <div className="mb-2" />
               <CommentForm postId={this.state.post.id} disabled={this.state.post.locked} />
               {this.sortRadios()}
index 4a4ee643caee55c67c88af0a992aff04da78e4ee..8927a171de3e0171a5ec054f85d785bfe3cf339d 100644 (file)
@@ -370,8 +370,8 @@ export interface PostForm {
   updated?: number;
   edit_id?: number;
   creator_id: number;
-  removed: boolean;
-  locked: boolean;
+  removed?: boolean;
+  locked?: boolean;
   reason?: string;
   auth: string;
 }
@@ -402,7 +402,7 @@ export interface CommentForm {
   parent_id?: number;
   edit_id?: number;
   creator_id: number;
-  removed: boolean;
+  removed?: boolean;
   reason?: string;
   auth: string;
 }