diff --git a/crates/app/src/public/html/communities/questions.html b/crates/app/src/public/html/communities/questions.html
index a4f11aa..79cba8d 100644
--- a/crates/app/src/public/html/communities/questions.html
+++ b/crates/app/src/public/html/communities/questions.html
@@ -35,6 +35,17 @@
{{ text "general:action.open" }}
{% endif %}
+
+ {% if user %} {% if can_manage_questions or is_helper or
+ question[1].id == user.id %}
+
+ {% endif %} {% endif %}
{% endfor %} {{ components::pagination(page=page, items=feed|length)
@@ -42,4 +53,27 @@
+
+
{% endblock %}
diff --git a/crates/app/src/routes/pages/communities.rs b/crates/app/src/routes/pages/communities.rs
index 77d5ebd..bab04ca 100644
--- a/crates/app/src/routes/pages/communities.rs
+++ b/crates/app/src/routes/pages/communities.rs
@@ -112,6 +112,12 @@ macro_rules! community_context_bools {
false
};
+ let can_manage_questions = if let Some(ref membership) = membership {
+ membership.role.check(CommunityPermission::MANAGE_QUESTIONS)
+ } else {
+ false
+ };
+
(
is_owner,
is_joined,
@@ -120,6 +126,7 @@ macro_rules! community_context_bools {
can_manage_posts,
can_manage_community,
can_manage_roles,
+ can_manage_questions,
)
}};
}
@@ -262,6 +269,7 @@ pub fn community_context(
can_manage_posts: bool,
can_manage_community: bool,
can_manage_roles: bool,
+ can_manage_questions: bool,
) {
context.insert("community", &community);
context.insert("is_owner", &is_owner);
@@ -272,6 +280,7 @@ pub fn community_context(
context.insert("can_manage_posts", &can_manage_posts);
context.insert("can_manage_community", &can_manage_community);
context.insert("can_manage_roles", &can_manage_roles);
+ context.insert("can_manage_questions", &can_manage_questions);
}
/// `/community/{title}`
@@ -338,6 +347,7 @@ pub async fn feed_request(
can_manage_posts,
can_manage_community,
can_manage_roles,
+ can_manage_questions,
) = community_context_bools!(data, user, community);
context.insert("feed", &feed);
@@ -354,6 +364,7 @@ pub async fn feed_request(
can_manage_posts,
can_manage_community,
can_manage_roles,
+ can_manage_questions,
);
// return
@@ -424,6 +435,7 @@ pub async fn questions_request(
can_manage_posts,
can_manage_community,
can_manage_roles,
+ can_manage_questions,
) = community_context_bools!(data, user, community);
context.insert("feed", &feed);
@@ -439,6 +451,7 @@ pub async fn questions_request(
can_manage_posts,
can_manage_community,
can_manage_roles,
+ can_manage_questions,
);
// return
@@ -559,6 +572,7 @@ pub async fn post_request(
can_manage_posts,
can_manage_community,
can_manage_roles,
+ can_manage_questions,
) = community_context_bools!(data, user, community);
context.insert("post", &post);
@@ -593,6 +607,7 @@ pub async fn post_request(
can_manage_posts,
can_manage_community,
can_manage_roles,
+ can_manage_questions,
);
// return
@@ -663,6 +678,7 @@ pub async fn members_request(
can_manage_posts,
can_manage_community,
can_manage_roles,
+ can_manage_questions,
) = community_context_bools!(data, user, community);
context.insert("list", &list);
@@ -679,6 +695,7 @@ pub async fn members_request(
can_manage_posts,
can_manage_community,
can_manage_roles,
+ can_manage_questions,
);
// return
@@ -744,6 +761,7 @@ pub async fn question_request(
can_manage_posts,
can_manage_community,
can_manage_roles,
+ can_manage_questions,
) = community_context_bools!(data, user, community);
context.insert("question", &question);
@@ -770,6 +788,7 @@ pub async fn question_request(
can_manage_posts,
can_manage_community,
can_manage_roles,
+ can_manage_questions,
);
// return
diff --git a/crates/core/src/database/questions.rs b/crates/core/src/database/questions.rs
index 2bb1fd0..377bf36 100644
--- a/crates/core/src/database/questions.rs
+++ b/crates/core/src/database/questions.rs
@@ -2,6 +2,7 @@ use std::collections::HashMap;
use super::*;
use crate::cache::Cache;
+use crate::model::communities_permissions::CommunityPermission;
use crate::model::{
Error, Result,
communities::Question,
@@ -206,7 +207,18 @@ impl DataManager {
&& user.id != y.receiver
&& !user.permissions.check(FinePermission::MANAGE_QUESTIONS)
{
- return Err(Error::NotAllowed);
+ if y.community != 0 {
+ // check for MANAGE_QUESTIONS permission
+ let membership = self
+ .get_membership_by_owner_community_no_void(user.id, y.community)
+ .await?;
+
+ if !membership.role.check(CommunityPermission::MANAGE_QUESTIONS) {
+ return Err(Error::NotAllowed);
+ }
+ } else {
+ return Err(Error::NotAllowed);
+ }
}
let conn = match self.connect().await {
diff --git a/crates/core/src/model/communities_permissions.rs b/crates/core/src/model/communities_permissions.rs
index 246ecb0..2fbba3f 100644
--- a/crates/core/src/model/communities_permissions.rs
+++ b/crates/core/src/model/communities_permissions.rs
@@ -17,6 +17,7 @@ bitflags! {
const REQUESTED = 1 << 6;
const MANAGE_PINS = 1 << 7;
const MANAGE_COMMUNITY = 1 << 8;
+ const MANAGE_QUESTIONS = 1 << 9;
const _ = !0;
}