summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDessalines <tyhou13@gmx.com>2019-04-20 00:24:59 -0700
committerDessalines <tyhou13@gmx.com>2019-04-20 00:24:59 -0700
commite14e6e53cd969039087df17bc4407d1b7444e05d (patch)
tree117ee3fad0961ebf7459c780ad361ff315c36c63
parent9afadfb9c4c5db1796848ec4af9756fe03d51ee3 (diff)
More moderation fixed
-rw-r--r--server/src/actions/comment.rs6
-rw-r--r--server/src/actions/comment_view.rs6
-rw-r--r--server/src/actions/community.rs4
-rw-r--r--server/src/actions/moderator.rs6
-rw-r--r--server/src/actions/post.rs10
-rw-r--r--server/src/actions/post_view.rs6
-rw-r--r--server/src/websocket_server/server.rs44
-rw-r--r--ui/src/components/comment-node.tsx7
-rw-r--r--ui/src/components/post-listing.tsx41
-rw-r--r--ui/src/components/post.tsx9
-rw-r--r--ui/src/interfaces.ts6
11 files changed, 93 insertions, 52 deletions
diff --git a/server/src/actions/comment.rs b/server/src/actions/comment.rs
index c3aa0107..36da90c6 100644
--- a/server/src/actions/comment.rs
+++ b/server/src/actions/comment.rs
@@ -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
};
diff --git a/server/src/actions/comment_view.rs b/server/src/actions/comment_view.rs
index 36043716..4e3d99b7 100644
--- a/server/src/actions/comment_view.rs
+++ b/server/src/actions/comment_view.rs
@@ -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
};
diff --git a/server/src/actions/community.rs b/server/src/actions/community.rs
index 594518ba..7a69c807 100644
--- a/server/src/actions/community.rs
+++ b/server/src/actions/community.rs
@@ -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,
};
diff --git a/server/src/actions/moderator.rs b/server/src/actions/moderator.rs
index e0d885ce..a97b2120 100644
--- a/server/src/actions/moderator.rs
+++ b/server/src/actions/moderator.rs
@@ -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
};
diff --git a/server/src/actions/post.rs b/server/src/actions/post.rs
index 0fd0e5c5..4dd4561d 100644
--- a/server/src/actions/post.rs
+++ b/server/src/actions/post.rs
@@ -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
};
diff --git a/server/src/actions/post_view.rs b/server/src/actions/post_view.rs
index 78fcef63..28e5fb98 100644
--- a/server/src/actions/post_view.rs
+++ b/server/src/actions/post_view.rs
@@ -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
};
diff --git a/server/src/websocket_server/server.rs b/server/src/websocket_server/server.rs
index d1f72109..63d767c2 100644
--- a/server/src/websocket_server/server.rs
+++ b/server/src/websocket_server/server.rs
@@ -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
};
diff --git a/ui/src/components/comment-node.tsx b/ui/src/components/comment-node.tsx
index c1fc059b..90cf5a54 100644
--- a/ui/src/components/comment-node.tsx
+++ b/ui/src/components/comment-node.tsx
@@ -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);
diff --git a/ui/src/components/post-listing.tsx b/ui/src/components/post-listing.tsx
index da375aee..7103a8cf 100644
--- a/ui/src/components/post-listing.tsx
+++ b/ui/src/components/post-listing.tsx
@@ -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,
};
diff --git a/ui/src/components/post.tsx b/ui/src/components/post.tsx
index 64f56d88..56b73f6e 100644
--- a/ui/src/components/post.tsx
+++ b/ui/src/components/post.tsx
@@ -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()}
diff --git a/ui/src/interfaces.ts b/ui/src/interfaces.ts
index 4a4ee643..8927a171 100644
--- a/ui/src/interfaces.ts
+++ b/ui/src/interfaces.ts
@@ -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;
}