diff options
author | Dessalines <tyhou13@gmx.com> | 2019-04-19 21:06:25 -0700 |
---|---|---|
committer | Dessalines <tyhou13@gmx.com> | 2019-04-19 21:06:25 -0700 |
commit | 9afadfb9c4c5db1796848ec4af9756fe03d51ee3 (patch) | |
tree | 22a2ea818d6bfcdb390e398c4c9bd5e05595587c | |
parent | 6f801bb819169060abcf1d8e901759f133dc6987 (diff) |
Saving replies, the actual fixes will be in the merge to dev.
42 files changed, 1015 insertions, 430 deletions
diff --git a/server/migrations/2019-02-27-170003_create_community/up.sql b/server/migrations/2019-02-27-170003_create_community/up.sql index 2d6856b3..363f99f2 100644 --- a/server/migrations/2019-02-27-170003_create_community/up.sql +++ b/server/migrations/2019-02-27-170003_create_community/up.sql @@ -38,7 +38,7 @@ create table community ( description text, category_id int references category on update cascade on delete cascade not null, creator_id int references user_ on update cascade on delete cascade not null, - removed boolean default false, + removed boolean default false not null, published timestamp not null default now(), updated timestamp ); diff --git a/server/migrations/2019-03-03-163336_create_post/down.sql b/server/migrations/2019-03-03-163336_create_post/down.sql index acc0b5d1..a671c2e7 100644 --- a/server/migrations/2019-03-03-163336_create_post/down.sql +++ b/server/migrations/2019-03-03-163336_create_post/down.sql @@ -1,2 +1,4 @@ +drop table post_read; +drop table post_saved; drop table post_like; drop table post; diff --git a/server/migrations/2019-03-03-163336_create_post/up.sql b/server/migrations/2019-03-03-163336_create_post/up.sql index c3b7c0b8..90737812 100644 --- a/server/migrations/2019-03-03-163336_create_post/up.sql +++ b/server/migrations/2019-03-03-163336_create_post/up.sql @@ -5,8 +5,8 @@ create table post ( body text, creator_id int references user_ on update cascade on delete cascade not null, community_id int references community on update cascade on delete cascade not null, - removed boolean default false, - locked boolean default false, + removed boolean default false not null, + locked boolean default false not null, published timestamp not null default now(), updated timestamp ); @@ -20,3 +20,18 @@ create table post_like ( unique(post_id, user_id) ); +create table post_saved ( + id serial primary key, + post_id int references post on update cascade on delete cascade not null, + user_id int references user_ on update cascade on delete cascade not null, + published timestamp not null default now(), + unique(post_id, user_id) +); + +create table post_read ( + id serial primary key, + post_id int references post on update cascade on delete cascade not null, + user_id int references user_ on update cascade on delete cascade not null, + published timestamp not null default now(), + unique(post_id, user_id) +); diff --git a/server/migrations/2019-03-05-233828_create_comment/down.sql b/server/migrations/2019-03-05-233828_create_comment/down.sql index 5b92a44c..80fe0b1f 100644 --- a/server/migrations/2019-03-05-233828_create_comment/down.sql +++ b/server/migrations/2019-03-05-233828_create_comment/down.sql @@ -1,2 +1,3 @@ +drop table comment_saved; drop table comment_like; drop table comment; diff --git a/server/migrations/2019-03-05-233828_create_comment/up.sql b/server/migrations/2019-03-05-233828_create_comment/up.sql index 214d50a6..4b754ece 100644 --- a/server/migrations/2019-03-05-233828_create_comment/up.sql +++ b/server/migrations/2019-03-05-233828_create_comment/up.sql @@ -4,7 +4,8 @@ create table comment ( post_id int references post on update cascade on delete cascade not null, parent_id int references comment on update cascade on delete cascade, content text not null, - removed boolean default false, + removed boolean default false not null, + read boolean default false not null, published timestamp not null default now(), updated timestamp ); @@ -18,3 +19,11 @@ create table comment_like ( published timestamp not null default now(), unique(comment_id, user_id) ); + +create table comment_saved ( + id serial primary key, + comment_id int references comment on update cascade on delete cascade not null, + user_id int references user_ on update cascade on delete cascade not null, + published timestamp not null default now(), + unique(comment_id, user_id) +); diff --git a/server/migrations/2019-03-30-212058_create_post_view/up.sql b/server/migrations/2019-03-30-212058_create_post_view/up.sql index ecf3280a..2f71b6fb 100644 --- a/server/migrations/2019-03-30-212058_create_post_view/up.sql +++ b/server/migrations/2019-03-30-212058_create_post_view/up.sql @@ -31,7 +31,8 @@ ap.*, u.id as user_id, coalesce(pl.score, 0) as my_vote, (select cf.id::bool from community_follower cf where u.id = cf.user_id and cf.community_id = ap.community_id) as subscribed, -u.admin or (select cm.id::bool from community_moderator cm where u.id = cm.user_id and cm.community_id = ap.community_id) as am_mod +(select pr.id::bool from post_read pr where u.id = pr.user_id and pr.post_id = ap.id) as read, +(select ps.id::bool from post_saved ps where u.id = ps.user_id and ps.post_id = ap.id) as saved from user_ u cross join all_post ap left join post_like pl on u.id = pl.user_id and ap.id = pl.post_id @@ -43,6 +44,7 @@ ap.*, null as user_id, null as my_vote, null as subscribed, -null as am_mod +null as read, +null as saved from all_post ap ; diff --git a/server/migrations/2019-04-03-155205_create_community_view/up.sql b/server/migrations/2019-04-03-155205_create_community_view/up.sql index 1b73af51..7d38dbfa 100644 --- a/server/migrations/2019-04-03-155205_create_community_view/up.sql +++ b/server/migrations/2019-04-03-155205_create_community_view/up.sql @@ -13,19 +13,16 @@ with all_community as select ac.*, u.id as user_id, -cf.id::boolean as subscribed, -u.admin or (select cm.id::bool from community_moderator cm where u.id = cm.user_id and cm.community_id = ac.id) as am_mod +(select cf.id::boolean from community_follower cf where u.id = cf.user_id and ac.id = cf.community_id) as subscribed from user_ u cross join all_community ac -left join community_follower cf on u.id = cf.user_id and ac.id = cf.community_id union all select ac.*, null as user_id, -null as subscribed, -null as am_mod +null as subscribed from all_community ac ; diff --git a/server/migrations/2019-04-03-155309_create_comment_view/up.sql b/server/migrations/2019-04-03-155309_create_comment_view/up.sql index a73b6182..a78e3ac3 100644 --- a/server/migrations/2019-04-03-155309_create_comment_view/up.sql +++ b/server/migrations/2019-04-03-155309_create_comment_view/up.sql @@ -4,7 +4,8 @@ with all_comment as select c.*, (select community_id from post p where p.id = c.post_id), - (select cb.id::bool from community_user_ban cb where c.creator_id = cb.user_id) as banned, + (select u.banned from user_ u where c.creator_id = u.id) as banned, + (select cb.id::bool from community_user_ban cb, post p where c.creator_id = cb.user_id and p.id = c.post_id and p.community_id = cb.community_id) as banned_from_community, (select name from user_ where c.creator_id = user_.id) as creator_name, coalesce(sum(cl.score), 0) as score, count (case when cl.score = 1 then 1 else null end) as upvotes, @@ -18,7 +19,7 @@ select ac.*, u.id as user_id, coalesce(cl.score, 0) as my_vote, -u.admin or (select cm.id::bool from community_moderator cm, post p where u.id = cm.user_id and ac.post_id = p.id and p.community_id = cm.community_id) as am_mod +(select cs.id::bool from comment_saved cs where u.id = cs.user_id and cs.comment_id = ac.id) as saved from user_ u cross join all_comment ac left join comment_like cl on u.id = cl.user_id and ac.id = cl.comment_id @@ -29,6 +30,6 @@ select ac.*, null as user_id, null as my_vote, - null as am_mod + null as saved from all_comment ac ; diff --git a/server/migrations/2019-04-11-144915_create_mod_views/up.sql b/server/migrations/2019-04-11-144915_create_mod_views/up.sql index 908028d0..70a33e46 100644 --- a/server/migrations/2019-04-11-144915_create_mod_views/up.sql +++ b/server/migrations/2019-04-11-144915_create_mod_views/up.sql @@ -43,8 +43,7 @@ create view mod_ban_view as select mb.*, (select name from user_ u where mb.mod_user_id = u.id) as mod_user_name, (select name from user_ u where mb.other_user_id = u.id) as other_user_name -from mod_ban_from_community mb; - +from mod_ban mb; create view mod_add_community_view as select ma.*, @@ -53,7 +52,6 @@ select ma.*, (select name from community c where ma.community_id = c.id) as community_name from mod_add_community ma; - create view mod_add_view as select ma.*, (select name from user_ u where ma.mod_user_id = u.id) as mod_user_name, diff --git a/server/src/actions/comment.rs b/server/src/actions/comment.rs index f6eee5f1..c3aa0107 100644 --- a/server/src/actions/comment.rs +++ b/server/src/actions/comment.rs @@ -1,9 +1,9 @@ extern crate diesel; -use schema::{comment, comment_like}; +use schema::{comment, comment_like, comment_saved}; use diesel::*; use diesel::result::Error; use serde::{Deserialize, Serialize}; -use {Crud, Likeable}; +use {Crud, Likeable, Saveable}; use actions::post::Post; // WITH RECURSIVE MyTree AS ( @@ -22,7 +22,8 @@ pub struct Comment { pub post_id: i32, pub parent_id: Option<i32>, pub content: String, - pub removed: Option<bool>, + pub removed: bool, + pub read: bool, pub published: chrono::NaiveDateTime, pub updated: Option<chrono::NaiveDateTime> } @@ -38,27 +39,6 @@ pub struct CommentForm { pub updated: Option<chrono::NaiveDateTime> } -#[derive(Identifiable, Queryable, Associations, PartialEq, Debug, Clone)] -#[belongs_to(Comment)] -#[table_name = "comment_like"] -pub struct CommentLike { - pub id: i32, - pub user_id: i32, - pub comment_id: i32, - pub post_id: i32, - pub score: i16, - pub published: chrono::NaiveDateTime, -} - -#[derive(Insertable, AsChangeset, Clone)] -#[table_name="comment_like"] -pub struct CommentLikeForm { - pub user_id: i32, - pub comment_id: i32, - pub post_id: i32, - pub score: i16 -} - impl Crud<CommentForm> for Comment { fn read(conn: &PgConnection, comment_id: i32) -> Result<Self, Error> { use schema::comment::dsl::*; @@ -87,6 +67,27 @@ impl Crud<CommentForm> for Comment { } } +#[derive(Identifiable, Queryable, Associations, PartialEq, Debug, Clone)] +#[belongs_to(Comment)] +#[table_name = "comment_like"] +pub struct CommentLike { + pub id: i32, + pub user_id: i32, + pub comment_id: i32, + pub post_id: i32, + pub score: i16, + pub published: chrono::NaiveDateTime, +} + +#[derive(Insertable, AsChangeset, Clone)] +#[table_name="comment_like"] +pub struct CommentLikeForm { + pub user_id: i32, + pub comment_id: i32, + pub post_id: i32, + pub score: i16 +} + impl Likeable <CommentLikeForm> for CommentLike { fn read(conn: &PgConnection, comment_id_from: i32) -> Result<Vec<Self>, Error> { use schema::comment_like::dsl::*; @@ -119,6 +120,39 @@ impl CommentLike { } } +#[derive(Identifiable, Queryable, Associations, PartialEq, Debug)] +#[belongs_to(Comment)] +#[table_name = "comment_saved"] +pub struct CommentSaved { + pub id: i32, + pub comment_id: i32, + pub user_id: i32, + pub published: chrono::NaiveDateTime, +} + +#[derive(Insertable, AsChangeset, Clone)] +#[table_name="comment_saved"] +pub struct CommentSavedForm { + pub comment_id: i32, + pub user_id: i32, +} + +impl Saveable <CommentSavedForm> for CommentSaved { + fn save(conn: &PgConnection, comment_saved_form: &CommentSavedForm) -> Result<Self, Error> { + use schema::comment_saved::dsl::*; + insert_into(comment_saved) + .values(comment_saved_form) + .get_result::<Self>(conn) + } + fn unsave(conn: &PgConnection, comment_saved_form: &CommentSavedForm) -> Result<usize, Error> { + use schema::comment_saved::dsl::*; + diesel::delete(comment_saved + .filter(comment_id.eq(comment_saved_form.comment_id)) + .filter(user_id.eq(comment_saved_form.user_id))) + .execute(conn) + } +} + #[cfg(test)] mod tests { use establish_connection; @@ -150,7 +184,7 @@ mod tests { description: None, category_id: 1, creator_id: inserted_user.id, - removed: None, + removed: false, updated: None }; @@ -162,8 +196,8 @@ mod tests { url: None, body: None, community_id: inserted_community.id, - removed: None, - locked: None, + removed: false, + locked: false, updated: None }; @@ -185,7 +219,8 @@ mod tests { content: "A test comment".into(), creator_id: inserted_user.id, post_id: inserted_post.id, - removed: Some(false), + removed: false, + read: false, parent_id: None, published: inserted_comment.published, updated: None @@ -202,6 +237,7 @@ mod tests { let inserted_child_comment = Comment::create(&conn, &child_comment_form).unwrap(); + // Comment Like let comment_like_form = CommentLikeForm { comment_id: inserted_comment.id, post_id: inserted_post.id, @@ -220,9 +256,25 @@ mod tests { score: 1 }; + // Comment Saved + let comment_saved_form = CommentSavedForm { + comment_id: inserted_comment.id, + user_id: inserted_user.id, + }; + + let inserted_comment_saved = CommentSaved::save(&conn, &comment_saved_form).unwrap(); + + let expected_comment_saved = CommentSaved { + id: inserted_comment_saved.id, + comment_id: inserted_comment.id, + user_id: inserted_user.id, + published: inserted_comment_saved.published, + }; + let read_comment = Comment::read(&conn, inserted_comment.id).unwrap(); let updated_comment = Comment::update(&conn, inserted_comment.id, &comment_form).unwrap(); let like_removed = CommentLike::remove(&conn, &comment_like_form).unwrap(); + let saved_removed = CommentSaved::unsave(&conn, &comment_saved_form).unwrap(); let num_deleted = Comment::delete(&conn, inserted_comment.id).unwrap(); Comment::delete(&conn, inserted_child_comment.id).unwrap(); Post::delete(&conn, inserted_post.id).unwrap(); @@ -233,8 +285,10 @@ mod tests { assert_eq!(expected_comment, inserted_comment); assert_eq!(expected_comment, updated_comment); assert_eq!(expected_comment_like, inserted_comment_like); + assert_eq!(expected_comment_saved, inserted_comment_saved); assert_eq!(expected_comment.id, inserted_child_comment.parent_id.unwrap()); assert_eq!(1, like_removed); + assert_eq!(1, saved_removed); assert_eq!(1, num_deleted); } diff --git a/server/src/actions/comment_view.rs b/server/src/actions/comment_view.rs index 0848ee1c..36043716 100644 --- a/server/src/actions/comment_view.rs +++ b/server/src/actions/comment_view.rs @@ -13,18 +13,20 @@ table! { post_id -> Int4, parent_id -> Nullable<Int4>, content -> Text, - removed -> Nullable<Bool>, + removed -> Bool, + read -> Bool, published -> Timestamp, updated -> Nullable<Timestamp>, community_id -> Int4, - banned -> Nullable<Bool>, + banned -> Bool, + banned_from_community -> Bool, creator_name -> Varchar, score -> BigInt, upvotes -> BigInt, downvotes -> BigInt, user_id -> Nullable<Int4>, my_vote -> Nullable<Int4>, - am_mod -> Nullable<Bool>, + saved -> Nullable<Bool>, } } @@ -36,18 +38,20 @@ pub struct CommentView { pub post_id: i32, pub parent_id: Option<i32>, pub content: String, - pub removed: Option<bool>, + pub removed: bool, + pub read: bool, pub published: chrono::NaiveDateTime, pub updated: Option<chrono::NaiveDateTime>, pub community_id: i32, - pub banned: Option<bool>, + pub banned: bool, + pub banned_from_community: bool, pub creator_name: String, pub score: i64, pub upvotes: i64, pub downvotes: i64, pub user_id: Option<i32>, pub my_vote: Option<i32>, - pub am_mod: Option<bool>, + pub saved: Option<bool>, } impl CommentView { @@ -57,6 +61,7 @@ impl CommentView { for_post_id: Option<i32>, for_creator_id: Option<i32>, my_user_id: Option<i32>, + saved_only: bool, page: Option<i64>, limit: Option<i64>, ) -> Result<Vec<Self>, Error> { @@ -81,6 +86,10 @@ impl CommentView { if let Some(for_post_id) = for_post_id { query = query.filter(post_id.eq(for_post_id)); }; + + if saved_only { + query = query.filter(saved.eq(true)); + } query = match sort { // SortType::Hot => query.order_by(hot_rank.desc()), @@ -159,7 +168,7 @@ mod tests { description: None, category_id: 1, creator_id: inserted_user.id, - removed: None, + removed: false, updated: None }; @@ -171,8 +180,8 @@ mod tests { url: None, body: None, community_id: inserted_community.id, - removed: None, - locked: None, + removed: false, + locked: false, updated: None }; @@ -205,8 +214,10 @@ mod tests { post_id: inserted_post.id, community_id: inserted_community.id, parent_id: None, - removed: Some(false), - banned: None, + removed: false, + read: false, + banned: false, + banned_from_community: false, published: inserted_comment.published, updated: None, creator_name: inserted_user.name.to_owned(), @@ -215,7 +226,7 @@ mod tests { upvotes: 1, user_id: None, my_vote: None, - am_mod: None, + saved: None, }; let expected_comment_view_with_user = CommentView { @@ -225,8 +236,10 @@ mod tests { post_id: inserted_post.id, community_id: inserted_community.id, parent_id: None, - removed: Some(false), - banned: None, + removed: false, + read: false, + banned: false, + banned_from_community: false, published: inserted_comment.published, updated: None, creator_name: inserted_user.name.to_owned(), @@ -235,11 +248,11 @@ mod tests { upvotes: 1, user_id: Some(inserted_user.id), my_vote: Some(1), - am_mod: None, + saved: None, }; - let read_comment_views_no_user = CommentView::list(&conn, &SortType::New, Some(inserted_post.id), None, None, None, None).unwrap(); - let read_comment_views_with_user = CommentView::list(&conn, &SortType::New, Some(inserted_post.id), None, Some(inserted_user.id), None, None).unwrap(); + let read_comment_views_no_user = CommentView::list(&conn, &SortType::New, Some(inserted_post.id), None, None, false, None, None).unwrap(); + let read_comment_views_with_user = CommentView::list(&conn, &SortType::New, Some(inserted_post.id), None, Some(inserted_user.id), false, None, None).unwrap(); let like_removed = CommentLike::remove(&conn, &comment_like_form).unwrap(); let num_deleted = Comment::delete(&conn, inserted_comment.id).unwrap(); Post::delete(&conn, inserted_post.id).unwrap(); diff --git a/server/src/actions/community.rs b/server/src/actions/community.rs index ac331934..594518ba 100644 --- a/server/src/actions/community.rs +++ b/server/src/actions/community.rs @@ -14,7 +14,7 @@ pub struct Community { pub description: Option<String>, pub category_id: i32, pub creator_id: i32, - pub removed: Option<bool>, + pub removed: bool, pub published: chrono::NaiveDateTime, pub updated: Option<chrono::NaiveDateTime> } @@ -27,7 +27,7 @@ pub struct CommunityForm { pub description: Option<String>, pub category_id: i32, pub creator_id: i32, - pub removed: Option<bool>, + pub removed: bool, pub updated: Option<chrono::NaiveDateTime> } @@ -236,7 +236,7 @@ mod tests { title: "nada".to_owned(), description: None, category_id: 1, - removed: None, + removed: false, updated: None, }; @@ -249,7 +249,7 @@ mod tests { title: "nada".to_owned(), description: None, category_id: 1, - removed: Some(false), + removed: false, published: inserted_community.published, updated: None }; diff --git a/server/src/actions/community_view.rs b/server/src/actions/community_view.rs index 4db97491..8966ee15 100644 --- a/server/src/actions/community_view.rs +++ b/server/src/actions/community_view.rs @@ -12,7 +12,7 @@ table! { description -> Nullable<Text>, category_id -> Int4, creator_id -> Int4, - removed -> Nullable<Bool>, + removed -> Bool, published -> Timestamp, updated -> Nullable<Timestamp>, creator_name -> Varchar, @@ -22,7 +22,6 @@ table! { number_of_comments -> BigInt, user_id -> Nullable<Int4>, subscribed -> Nullable<Bool>, - am_mod -> Nullable<Bool>, } } @@ -83,7 +82,7 @@ pub struct CommunityView { pub description: Option<String>, pub category_id: i32, pub creator_id: i32, - pub removed: Option<bool>, + pub removed: bool, pub published: chrono::NaiveDateTime, pub updated: Option<chrono::NaiveDateTime>, pub creator_name: String, @@ -93,7 +92,6 @@ pub struct CommunityView { pub number_of_comments: i64, pub user_id: Option<i32>, pub subscribed: Option<bool>, - pub am_mod: Option<bool>, } impl CommunityView { diff --git a/server/src/actions/moderator.rs b/server/src/actions/moderator.rs index a97b2120..e0d885ce 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: None, + removed: false, updated: None }; @@ -453,8 +453,8 @@ mod tests { body: None, creator_id: inserted_user.id, community_id: inserted_community.id, - removed: None, - locked: None, + removed: false, + locked: false, updated: None }; diff --git a/server/src/actions/post.rs b/server/src/actions/post.rs index 468b3a9b..0fd0e5c5 100644 --- a/server/src/actions/post.rs +++ b/server/src/actions/post.rs @@ -1,9 +1,9 @@ extern crate diesel; -use schema::{post, post_like}; +use schema::{post, post_like, post_saved, post_read}; use diesel::*; use diesel::result::Error; use serde::{Deserialize, Serialize}; -use {Crud, Likeable}; +use {Crud, Likeable, Saveable, Readable}; #[derive(Queryable, Identifiable, PartialEq, Debug, Serialize, Deserialize)] #[table_name="post"] @@ -14,8 +14,8 @@ pub struct Post { pub body: Option<String>, pub creator_id: i32, pub community_id: i32, - pub removed: Option<bool>, - pub locked: Option<bool>, + pub removed: bool, + pub locked: bool, pub published: chrono::NaiveDateTime, pub updated: Option<chrono::NaiveDateTime> } @@ -28,30 +28,11 @@ pub struct PostForm { pub body: Option<String>, pub creator_id: i32, pub community_id: i32, - pub removed: Option<bool>, - pub locked: Option<bool>, + pub removed: bool, + pub locked: bool, pub updated: Option<chrono::NaiveDateTime> } -#[derive(Identifiable, Queryable, Associations, PartialEq, Debug)] -#[belongs_to(Post)] -#[table_name = "post_like"] -pub struct PostLike { - pub id: i32, - pub post_id: i32, - pub user_id: i32, - pub score: i16, - pub published: chrono::NaiveDateTime, -} - -#[derive(Insertable, AsChangeset, Clone)] -#[table_name="post_like"] -pub struct PostLikeForm { - pub post_id: i32, - pub user_id: i32, - pub score: i16 -} - impl Crud<PostForm> for Post { fn read(conn: &PgConnection, post_id: i32) -> Result<Self, Error> { use schema::post::dsl::*; @@ -80,6 +61,25 @@ impl Crud<PostForm> for Post { } } |