summaryrefslogtreecommitdiffstats
path: root/server/src
diff options
context:
space:
mode:
authorDessalines <tyhou13@gmx.com>2019-12-11 12:21:47 -0800
committerDessalines <tyhou13@gmx.com>2019-12-11 12:21:47 -0800
commitfca8e6a0a9308340e88ad291c89c40e7d17f27be (patch)
tree7b5cdfa2323499d4f477645962baee2948f482ec /server/src
parente9f476566378b6745ecb82808c0943550285c3fd (diff)
Adding some site oriented settings.
- Adding option to close registration. Fixes #350 - Adding option to disable showing NSFW buttons. Fixes #364 - Adding option to disable downvotes. Fixes #239
Diffstat (limited to 'server/src')
-rw-r--r--server/src/api/comment.rs8
-rw-r--r--server/src/api/mod.rs2
-rw-r--r--server/src/api/post.rs8
-rw-r--r--server/src/api/site.rs15
-rw-r--r--server/src/api/user.rs7
-rw-r--r--server/src/db/community.rs46
-rw-r--r--server/src/db/community_view.rs41
-rw-r--r--server/src/db/mod.rs2
-rw-r--r--server/src/db/site.rs52
-rw-r--r--server/src/db/site_view.rs48
-rw-r--r--server/src/feeds.rs2
-rw-r--r--server/src/lib.rs2
-rw-r--r--server/src/nodeinfo.rs2
-rw-r--r--server/src/schema.rs3
14 files changed, 149 insertions, 89 deletions
diff --git a/server/src/api/comment.rs b/server/src/api/comment.rs
index eb5da62b..9f9d46d3 100644
--- a/server/src/api/comment.rs
+++ b/server/src/api/comment.rs
@@ -298,6 +298,14 @@ impl Perform<CommentResponse> for Oper<CreateCommentLike> {
let user_id = claims.id;
+ // Don't do a downvote if site has downvotes disabled
+ if data.score == -1 {
+ let site = SiteView::read(&conn)?;
+ if site.enable_downvotes == false {
+ return Err(APIError::err(&self.op, "downvotes_disabled"))?;
+ }
+ }
+
// Check for a community ban
let post = Post::read(&conn, data.post_id)?;
if CommunityUserBanView::get(&conn, user_id, post.community_id).is_ok() {
diff --git a/server/src/api/mod.rs b/server/src/api/mod.rs
index 2d5dec87..97a11900 100644
--- a/server/src/api/mod.rs
+++ b/server/src/api/mod.rs
@@ -8,6 +8,8 @@ use crate::db::moderator_views::*;
use crate::db::password_reset_request::*;
use crate::db::post::*;
use crate::db::post_view::*;
+use crate::db::site::*;
+use crate::db::site_view::*;
use crate::db::user::*;
use crate::db::user_mention::*;
use crate::db::user_mention_view::*;
diff --git a/server/src/api/post.rs b/server/src/api/post.rs
index 0b54840f..4b2395a8 100644
--- a/server/src/api/post.rs
+++ b/server/src/api/post.rs
@@ -265,6 +265,14 @@ impl Perform<CreatePostLikeResponse> for Oper<CreatePostLike> {
let user_id = claims.id;
+ // Don't do a downvote if site has downvotes disabled
+ if data.score == -1 {
+ let site = SiteView::read(&conn)?;
+ if site.enable_downvotes == false {
+ return Err(APIError::err(&self.op, "downvotes_disabled"))?;
+ }
+ }
+
// Check for a community ban
let post = Post::read(&conn, data.post_id)?;
if CommunityUserBanView::get(&conn, user_id, post.community_id).is_ok() {
diff --git a/server/src/api/site.rs b/server/src/api/site.rs
index cb6edfd5..ec89e46c 100644
--- a/server/src/api/site.rs
+++ b/server/src/api/site.rs
@@ -56,6 +56,9 @@ pub struct GetModlogResponse {
pub struct CreateSite {
name: String,
description: Option<String>,
+ enable_downvotes: bool,
+ open_registration: bool,
+ enable_nsfw: bool,
auth: String,
}
@@ -63,6 +66,9 @@ pub struct CreateSite {
pub struct EditSite {
name: String,
description: Option<String>,
+ enable_downvotes: bool,
+ open_registration: bool,
+ enable_nsfw: bool,
auth: String,
}
@@ -208,6 +214,9 @@ impl Perform<SiteResponse> for Oper<CreateSite> {
name: data.name.to_owned(),
description: data.description.to_owned(),
creator_id: user_id,
+ enable_downvotes: data.enable_downvotes,
+ open_registration: data.open_registration,
+ enable_nsfw: data.enable_nsfw,
updated: None,
};
@@ -255,6 +264,9 @@ impl Perform<SiteResponse> for Oper<EditSite> {
description: data.description.to_owned(),
creator_id: found_site.creator_id,
updated: Some(naive_now()),
+ enable_downvotes: data.enable_downvotes,
+ open_registration: data.open_registration,
+ enable_nsfw: data.enable_nsfw,
};
match Site::update(&conn, 1, &site_form) {
@@ -431,6 +443,9 @@ impl Perform<GetSiteResponse> for Oper<TransferSite> {
description: read_site.description,
creator_id: data.user_id,
updated: Some(naive_now()),
+ enable_downvotes: read_site.enable_downvotes,
+ open_registration: read_site.open_registration,
+ enable_nsfw: read_site.enable_nsfw,
};
match Site::update(&conn, 1, &site_form) {
diff --git a/server/src/api/user.rs b/server/src/api/user.rs
index 3047a0d3..df38dc99 100644
--- a/server/src/api/user.rs
+++ b/server/src/api/user.rs
@@ -193,6 +193,13 @@ impl Perform<LoginResponse> for Oper<Register> {
let data: &Register = &self.data;
let conn = establish_connection();
+ // Make sure site has open registration
+ if let Ok(site) = SiteView::read(&conn) {
+ if !site.open_registration {
+ return Err(APIError::err(&self.op, "registration_closed"))?;
+ }
+ }
+
// Make sure passwords match
if &data.password != &data.password_verify {
return Err(APIError::err(&self.op, "passwords_dont_match"))?;
diff --git a/server/src/db/community.rs b/server/src/db/community.rs
index 95469075..57b962d1 100644
--- a/server/src/db/community.rs
+++ b/server/src/db/community.rs
@@ -1,5 +1,5 @@
use super::*;
-use crate::schema::{community, community_follower, community_moderator, community_user_ban, site};
+use crate::schema::{community, community_follower, community_moderator, community_user_ban};
#[derive(Queryable, Identifiable, PartialEq, Debug, Serialize, Deserialize)]
#[table_name = "community"]
@@ -202,50 +202,6 @@ impl Followable<CommunityFollowerForm> for CommunityFollower {
}
}
-#[derive(Queryable, Identifiable, PartialEq, Debug, Serialize, Deserialize)]
-#[table_name = "site"]
-pub struct Site {
- pub id: i32,
- pub name: String,
- pub description: Option<String>,
- pub creator_id: i32,
- pub published: chrono::NaiveDateTime,
- pub updated: Option<chrono::NaiveDateTime>,
-}
-
-#[derive(Insertable, AsChangeset, Clone, Serialize, Deserialize)]
-#[table_name = "site"]
-pub struct SiteForm {
- pub name: String,
- pub description: Option<String>,
- pub creator_id: i32,
- pub updated: Option<chrono::NaiveDateTime>,
-}
-
-impl Crud<SiteForm> for Site {
- fn read(conn: &PgConnection, _site_id: i32) -> Result<Self, Error> {
- use crate::schema::site::dsl::*;
- site.first::<Self>(conn)
- }
-
- fn delete(conn: &PgConnection, site_id: i32) -> Result<usize, Error> {
- use crate::schema::site::dsl::*;
- diesel::delete(site.find(site_id)).execute(conn)
- }
-
- fn create(conn: &PgConnection, new_site: &SiteForm) -> Result<Self, Error> {
- use crate::schema::site::dsl::*;
- insert_into(site).values(new_site).get_result::<Self>(conn)
- }
-
- fn update(conn: &PgConnection, site_id: i32, new_site: &SiteForm) -> Result<Self, Error> {
- use crate::schema::site::dsl::*;
- diesel::update(site.find(site_id))
- .set(new_site)
- .get_result::<Self>(conn)
- }
-}
-
#[cfg(test)]
mod tests {
use super::super::user::*;
diff --git a/server/src/db/community_view.rs b/server/src/db/community_view.rs
index 04b68441..157c4d91 100644
--- a/server/src/db/community_view.rs
+++ b/server/src/db/community_view.rs
@@ -59,22 +59,6 @@ table! {
}
}
-table! {
- site_view (id) {
- id -> Int4,
- name -> Varchar,
- description -> Nullable<Text>,
- creator_id -> Int4,
- published -> Timestamp,
- updated -> Nullable<Timestamp>,
- creator_name -> Varchar,
- number_of_users -> BigInt,
- number_of_posts -> BigInt,
- number_of_comments -> BigInt,
- number_of_communities -> BigInt,
- }
-}
-
#[derive(
Queryable, Identifiable, PartialEq, Debug, Serialize, Deserialize, QueryableByName, Clone,
)]
@@ -328,28 +312,3 @@ impl CommunityUserBanView {
.first::<Self>(conn)
}
}
-
-#[derive(
- Queryable, Identifiable, PartialEq, Debug, Serialize, Deserialize, QueryableByName, Clone,
-)]
-#[table_name = "site_view"]
-pub struct SiteView {
- pub id: i32,
- pub name: String,
- pub description: Option<String>,
- pub creator_id: i32,
- pub published: chrono::NaiveDateTime,
- pub updated: Option<chrono::NaiveDateTime>,
- pub creator_name: String,
- pub number_of_users: i64,
- pub number_of_posts: i64,
- pub number_of_comments: i64,
- pub number_of_communities: i64,
-}
-
-impl SiteView {
- pub fn read(conn: &PgConnection) -> Result<Self, Error> {
- use super::community_view::site_view::dsl::*;
- site_view.first::<Self>(conn)
- }
-}
diff --git a/server/src/db/mod.rs b/server/src/db/mod.rs
index 3501fcda..a7961f12 100644
--- a/server/src/db/mod.rs
+++ b/server/src/db/mod.rs
@@ -14,6 +14,8 @@ pub mod moderator_views;
pub mod password_reset_request;
pub mod post;
pub mod post_view;
+pub mod site;
+pub mod site_view;
pub mod user;
pub mod user_mention;
pub mod user_mention_view;
diff --git a/server/src/db/site.rs b/server/src/db/site.rs
new file mode 100644
index 00000000..3b8366d8
--- /dev/null
+++ b/server/src/db/site.rs
@@ -0,0 +1,52 @@
+use super::*;
+use crate::schema::site;
+
+#[derive(Queryable, Identifiable, PartialEq, Debug, Serialize, Deserialize)]
+#[table_name = "site"]
+pub struct Site {
+ pub id: i32,
+ pub name: String,
+ pub description: Option<String>,
+ pub creator_id: i32,
+ pub published: chrono::NaiveDateTime,
+ pub updated: Option<chrono::NaiveDateTime>,
+ pub enable_downvotes: bool,
+ pub open_registration: bool,
+ pub enable_nsfw: bool,
+}
+
+#[derive(Insertable, AsChangeset, Clone, Serialize, Deserialize)]
+#[table_name = "site"]
+pub struct SiteForm {
+ pub name: String,
+ pub description: Option<String>,
+ pub creator_id: i32,
+ pub updated: Option<chrono::NaiveDateTime>,
+ pub enable_downvotes: bool,
+ pub open_registration: bool,
+ pub enable_nsfw: bool,
+}
+
+impl Crud<SiteForm> for Site {
+ fn read(conn: &PgConnection, _site_id: i32) -> Result<Self, Error> {
+ use crate::schema::site::dsl::*;
+ site.first::<Self>(conn)
+ }
+
+ fn delete(conn: &PgConnection, site_id: i32) -> Result<usize, Error> {
+ use crate::schema::site::dsl::*;
+ diesel::delete(site.find(site_id)).execute(conn)
+ }
+
+ fn create(conn: &PgConnection, new_site: &SiteForm) -> Result<Self, Error> {
+ use crate::schema::site::dsl::*;
+ insert_into(site).values(new_site).get_result::<Self>(conn)
+ }
+
+ fn update(conn: &PgConnection, site_id: i32, new_site: &SiteForm) -> Result<Self, Error> {
+ use crate::schema::site::dsl::*;
+ diesel::update(site.find(site_id))
+ .set(new_site)
+ .get_result::<Self>(conn)
+ }
+}
diff --git a/server/src/db/site_view.rs b/server/src/db/site_view.rs
new file mode 100644
index 00000000..40b1265f
--- /dev/null
+++ b/server/src/db/site_view.rs
@@ -0,0 +1,48 @@
+use super::*;
+
+table! {
+ site_view (id) {
+ id -> Int4,
+ name -> Varchar,
+ description -> Nullable<Text>,
+ creator_id -> Int4,
+ published -> Timestamp,
+ updated -> Nullable<Timestamp>,
+ enable_downvotes -> Bool,
+ open_registration -> Bool,
+ enable_nsfw -> Bool,
+ creator_name -> Varchar,
+ number_of_users -> BigInt,
+ number_of_posts -> BigInt,
+ number_of_comments -> BigInt,
+ number_of_communities -> BigInt,
+ }
+}
+
+#[derive(
+ Queryable, Identifiable, PartialEq, Debug, Serialize, Deserialize, QueryableByName, Clone,
+)]
+#[table_name = "site_view"]
+pub struct SiteView {
+ pub id: i32,
+ pub name: String,
+ pub description: Option<String>,
+ pub creator_id: i32,
+ pub published: chrono::NaiveDateTime,
+ pub updated: Option<chrono::NaiveDateTime>,
+ pub enable_downvotes: bool,
+ pub open_registration: bool,
+ pub enable_nsfw: bool,
+ pub creator_name: String,
+ pub number_of_users: i64,
+ pub number_of_posts: i64,
+ pub number_of_comments: i64,
+ pub number_of_communities: i64,
+}
+
+impl SiteView {
+ pub fn read(conn: &PgConnection) -> Result<Self, Error> {
+ use super::site_view::site_view::dsl::*;
+ site_view.first::<Self>(conn)
+ }
+}
diff --git a/server/src/feeds.rs b/server/src/feeds.rs
index 810f6d59..a16116d4 100644
--- a/server/src/feeds.rs
+++ b/server/src/feeds.rs
@@ -3,8 +3,8 @@ extern crate rss;
use super::*;
use crate::db::comment_view::{ReplyQueryBuilder, ReplyView};
use crate::db::community::Community;
-use crate::db::community_view::SiteView;
use crate::db::post_view::{PostQueryBuilder, PostView};
+use crate::db::site_view::SiteView;
use crate::db::user::User_;
use crate::db::user_mention_view::{UserMentionQueryBuilder, UserMentionView};
use crate::db::{establish_connection, ListingType, SortType};
diff --git a/server/src/lib.rs b/server/src/lib.rs
index 2568143d..c2fa2189 100644
--- a/server/src/lib.rs
+++ b/server/src/lib.rs
@@ -118,7 +118,7 @@ impl Settings {
.unwrap_or("3600".to_string())
.parse()
.unwrap(),
- email_config: email_config,
+ email_config,
}
}
fn api_endpoint(&self) -> String {
diff --git a/server/src/nodeinfo.rs b/server/src/nodeinfo.rs
index 69c86919..f8135c7d 100644
--- a/server/src/nodeinfo.rs
+++ b/server/src/nodeinfo.rs
@@ -1,5 +1,5 @@
-use crate::db::community_view::SiteView;
use crate::db::establish_connection;
+use crate::db::site_view::SiteView;
use crate::version;
use crate::Settings;
use actix_web::body::Body;
diff --git a/server/src/schema.rs b/server/src/schema.rs
index bd73aabf..118f5f4a 100644
--- a/server/src/schema.rs
+++ b/server/src/schema.rs
@@ -246,6 +246,9 @@ table! {
creator_id -> Int4,
published -> Timestamp,
updated -> Nullable<Timestamp>,
+ enable_downvotes -> Bool,
+ open_registration -> Bool,
+ enable_nsfw -> Bool,
}
}