diff options
author | Dessalines <tyhou13@gmx.com> | 2019-12-11 12:21:47 -0800 |
---|---|---|
committer | Dessalines <tyhou13@gmx.com> | 2019-12-11 12:21:47 -0800 |
commit | fca8e6a0a9308340e88ad291c89c40e7d17f27be (patch) | |
tree | 7b5cdfa2323499d4f477645962baee2948f482ec /server/src | |
parent | e9f476566378b6745ecb82808c0943550285c3fd (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.rs | 8 | ||||
-rw-r--r-- | server/src/api/mod.rs | 2 | ||||
-rw-r--r-- | server/src/api/post.rs | 8 | ||||
-rw-r--r-- | server/src/api/site.rs | 15 | ||||
-rw-r--r-- | server/src/api/user.rs | 7 | ||||
-rw-r--r-- | server/src/db/community.rs | 46 | ||||
-rw-r--r-- | server/src/db/community_view.rs | 41 | ||||
-rw-r--r-- | server/src/db/mod.rs | 2 | ||||
-rw-r--r-- | server/src/db/site.rs | 52 | ||||
-rw-r--r-- | server/src/db/site_view.rs | 48 | ||||
-rw-r--r-- | server/src/feeds.rs | 2 | ||||
-rw-r--r-- | server/src/lib.rs | 2 | ||||
-rw-r--r-- | server/src/nodeinfo.rs | 2 | ||||
-rw-r--r-- | server/src/schema.rs | 3 |
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, } } |