2020-12-21 16:30:34 +00:00
use diesel ::{ result ::Error , * } ;
2020-12-21 23:27:42 +00:00
use lemmy_db_queries ::{
2020-12-15 15:28:25 +00:00
aggregates ::comment_aggregates ::CommentAggregates ,
functions ::hot_rank ,
fuzzy_search ,
limit_and_offset ,
ListingType ,
MaybeOptional ,
SortType ,
ToSafe ,
2020-12-21 23:27:42 +00:00
ViewToVec ,
2020-12-15 15:28:25 +00:00
} ;
2020-12-18 17:27:25 +00:00
use lemmy_db_schema ::{
2020-12-15 15:28:25 +00:00
schema ::{
comment ,
comment_aggregates ,
comment_alias_1 ,
comment_like ,
comment_saved ,
community ,
2021-08-19 20:54:15 +00:00
community_block ,
2020-12-15 15:28:25 +00:00
community_follower ,
2021-03-10 22:33:55 +00:00
community_person_ban ,
person ,
person_alias_1 ,
2021-08-19 20:54:15 +00:00
person_block ,
2021-03-11 04:43:11 +00:00
post ,
2020-12-15 15:28:25 +00:00
} ,
source ::{
comment ::{ Comment , CommentAlias1 , CommentSaved } ,
2021-03-11 04:43:11 +00:00
community ::{ Community , CommunityFollower , CommunityPersonBan , CommunitySafe } ,
person ::{ Person , PersonAlias1 , PersonSafe , PersonSafeAlias1 } ,
2021-08-19 20:54:15 +00:00
person_block ::PersonBlock ,
2020-12-15 15:28:25 +00:00
post ::Post ,
} ,
2021-03-18 20:25:21 +00:00
CommentId ,
CommunityId ,
2021-07-20 04:29:50 +00:00
DbUrl ,
2021-03-18 20:25:21 +00:00
PersonId ,
PostId ,
2020-12-15 15:28:25 +00:00
} ;
use serde ::Serialize ;
#[ derive(Debug, PartialEq, Serialize, Clone) ]
pub struct CommentView {
pub comment : Comment ,
2021-03-10 22:33:55 +00:00
pub creator : PersonSafe ,
pub recipient : Option < PersonSafeAlias1 > , // Left joins to comment and person
2020-12-15 15:28:25 +00:00
pub post : Post ,
pub community : CommunitySafe ,
pub counts : CommentAggregates ,
2021-03-10 22:33:55 +00:00
pub creator_banned_from_community : bool , // Left Join to CommunityPersonBan
2020-12-15 15:28:25 +00:00
pub subscribed : bool , // Left join to CommunityFollower
pub saved : bool , // Left join to CommentSaved
2021-08-19 20:54:15 +00:00
pub creator_blocked : bool , // Left join to PersonBlock
2020-12-15 15:28:25 +00:00
pub my_vote : Option < i16 > , // Left join to CommentLike
}
type CommentViewTuple = (
Comment ,
2021-03-10 22:33:55 +00:00
PersonSafe ,
2020-12-15 15:28:25 +00:00
Option < CommentAlias1 > ,
2021-03-10 22:33:55 +00:00
Option < PersonSafeAlias1 > ,
2020-12-15 15:28:25 +00:00
Post ,
CommunitySafe ,
CommentAggregates ,
2021-02-26 13:49:58 +00:00
Option < CommunityPersonBan > ,
2020-12-15 15:28:25 +00:00
Option < CommunityFollower > ,
Option < CommentSaved > ,
2021-08-19 20:54:15 +00:00
Option < PersonBlock > ,
2020-12-15 15:28:25 +00:00
Option < i16 > ,
) ;
impl CommentView {
pub fn read (
conn : & PgConnection ,
2021-03-18 20:25:21 +00:00
comment_id : CommentId ,
my_person_id : Option < PersonId > ,
2020-12-15 15:28:25 +00:00
) -> Result < Self , Error > {
// The left join below will return None in this case
2021-03-18 20:25:21 +00:00
let person_id_join = my_person_id . unwrap_or ( PersonId ( - 1 ) ) ;
2020-12-15 15:28:25 +00:00
let (
comment ,
creator ,
_parent_comment ,
recipient ,
post ,
community ,
counts ,
creator_banned_from_community ,
subscribed ,
saved ,
2021-08-19 20:54:15 +00:00
creator_blocked ,
2021-01-31 15:29:21 +00:00
comment_like ,
2020-12-15 15:28:25 +00:00
) = comment ::table
. find ( comment_id )
2021-03-10 22:33:55 +00:00
. inner_join ( person ::table )
2020-12-15 15:28:25 +00:00
// recipient here
. left_join ( comment_alias_1 ::table . on ( comment_alias_1 ::id . nullable ( ) . eq ( comment ::parent_id ) ) )
2021-03-10 22:33:55 +00:00
. left_join ( person_alias_1 ::table . on ( person_alias_1 ::id . eq ( comment_alias_1 ::creator_id ) ) )
2020-12-15 15:28:25 +00:00
. inner_join ( post ::table )
. inner_join ( community ::table . on ( post ::community_id . eq ( community ::id ) ) )
. inner_join ( comment_aggregates ::table )
. left_join (
2021-03-10 22:33:55 +00:00
community_person_ban ::table . on (
2020-12-15 15:28:25 +00:00
community ::id
2021-03-10 22:33:55 +00:00
. eq ( community_person_ban ::community_id )
. and ( community_person_ban ::person_id . eq ( comment ::creator_id ) ) ,
2020-12-15 15:28:25 +00:00
) ,
)
. left_join (
community_follower ::table . on (
post ::community_id
. eq ( community_follower ::community_id )
2021-03-10 22:33:55 +00:00
. and ( community_follower ::person_id . eq ( person_id_join ) ) ,
2020-12-15 15:28:25 +00:00
) ,
)
. left_join (
comment_saved ::table . on (
comment ::id
. eq ( comment_saved ::comment_id )
2021-03-10 22:33:55 +00:00
. and ( comment_saved ::person_id . eq ( person_id_join ) ) ,
2020-12-15 15:28:25 +00:00
) ,
)
2021-08-19 20:54:15 +00:00
. left_join (
person_block ::table . on (
comment ::creator_id
. eq ( person_block ::target_id )
. and ( person_block ::person_id . eq ( person_id_join ) ) ,
) ,
)
2020-12-15 15:28:25 +00:00
. left_join (
comment_like ::table . on (
comment ::id
. eq ( comment_like ::comment_id )
2021-03-10 22:33:55 +00:00
. and ( comment_like ::person_id . eq ( person_id_join ) ) ,
2020-12-15 15:28:25 +00:00
) ,
)
. select ( (
comment ::all_columns ,
2021-03-10 22:33:55 +00:00
Person ::safe_columns_tuple ( ) ,
2020-12-15 15:28:25 +00:00
comment_alias_1 ::all_columns . nullable ( ) ,
2021-03-10 22:33:55 +00:00
PersonAlias1 ::safe_columns_tuple ( ) . nullable ( ) ,
2020-12-15 15:28:25 +00:00
post ::all_columns ,
Community ::safe_columns_tuple ( ) ,
comment_aggregates ::all_columns ,
2021-03-10 22:33:55 +00:00
community_person_ban ::all_columns . nullable ( ) ,
2020-12-15 15:28:25 +00:00
community_follower ::all_columns . nullable ( ) ,
comment_saved ::all_columns . nullable ( ) ,
2021-08-19 20:54:15 +00:00
person_block ::all_columns . nullable ( ) ,
2020-12-15 15:28:25 +00:00
comment_like ::score . nullable ( ) ,
) )
. first ::< CommentViewTuple > ( conn ) ? ;
2021-03-10 22:33:55 +00:00
// If a person is given, then my_vote, if None, should be 0, not null
// Necessary to differentiate between other person's votes
let my_vote = if my_person_id . is_some ( ) & & comment_like . is_none ( ) {
2021-01-31 15:29:21 +00:00
Some ( 0 )
} else {
comment_like
} ;
2020-12-15 15:28:25 +00:00
Ok ( CommentView {
comment ,
recipient ,
post ,
creator ,
community ,
counts ,
creator_banned_from_community : creator_banned_from_community . is_some ( ) ,
subscribed : subscribed . is_some ( ) ,
saved : saved . is_some ( ) ,
2021-08-19 20:54:15 +00:00
creator_blocked : creator_blocked . is_some ( ) ,
2020-12-15 15:28:25 +00:00
my_vote ,
} )
}
2020-12-20 01:10:47 +00:00
2021-03-10 22:33:55 +00:00
/// Gets the recipient person id.
2020-12-20 01:10:47 +00:00
/// If there is no parent comment, its the post creator
2021-03-18 20:25:21 +00:00
pub fn get_recipient_id ( & self ) -> PersonId {
2020-12-20 01:10:47 +00:00
match & self . recipient {
Some ( parent_commenter ) = > parent_commenter . id ,
None = > self . post . creator_id ,
}
}
2020-12-15 15:28:25 +00:00
}
pub struct CommentQueryBuilder < ' a > {
conn : & ' a PgConnection ,
2021-04-15 03:37:51 +00:00
listing_type : Option < ListingType > ,
sort : Option < SortType > ,
2021-03-18 20:25:21 +00:00
community_id : Option < CommunityId > ,
2021-07-20 04:29:50 +00:00
community_actor_id : Option < DbUrl > ,
2021-03-18 20:25:21 +00:00
post_id : Option < PostId > ,
creator_id : Option < PersonId > ,
recipient_id : Option < PersonId > ,
my_person_id : Option < PersonId > ,
2020-12-15 15:28:25 +00:00
search_term : Option < String > ,
2021-04-15 03:37:51 +00:00
saved_only : Option < bool > ,
unread_only : Option < bool > ,
show_bot_accounts : Option < bool > ,
2020-12-15 15:28:25 +00:00
page : Option < i64 > ,
limit : Option < i64 > ,
}
impl < ' a > CommentQueryBuilder < ' a > {
2020-12-16 18:59:43 +00:00
pub fn create ( conn : & ' a PgConnection ) -> Self {
2020-12-15 15:28:25 +00:00
CommentQueryBuilder {
conn ,
2021-04-15 03:37:51 +00:00
listing_type : None ,
sort : None ,
2020-12-16 18:59:43 +00:00
community_id : None ,
2021-07-20 04:29:50 +00:00
community_actor_id : None ,
2020-12-16 18:59:43 +00:00
post_id : None ,
creator_id : None ,
recipient_id : None ,
2021-03-10 22:33:55 +00:00
my_person_id : None ,
2020-12-15 15:28:25 +00:00
search_term : None ,
2021-04-15 03:37:51 +00:00
saved_only : None ,
unread_only : None ,
show_bot_accounts : None ,
2020-12-15 15:28:25 +00:00
page : None ,
limit : None ,
}
}
2021-04-15 03:37:51 +00:00
pub fn listing_type < T : MaybeOptional < ListingType > > ( mut self , listing_type : T ) -> Self {
self . listing_type = listing_type . get_optional ( ) ;
2020-12-15 15:28:25 +00:00
self
}
2021-04-15 03:37:51 +00:00
pub fn sort < T : MaybeOptional < SortType > > ( mut self , sort : T ) -> Self {
self . sort = sort . get_optional ( ) ;
2020-12-15 15:28:25 +00:00
self
}
2021-03-18 20:25:21 +00:00
pub fn post_id < T : MaybeOptional < PostId > > ( mut self , post_id : T ) -> Self {
2020-12-16 18:59:43 +00:00
self . post_id = post_id . get_optional ( ) ;
self
}
2021-03-18 20:25:21 +00:00
pub fn creator_id < T : MaybeOptional < PersonId > > ( mut self , creator_id : T ) -> Self {
2020-12-16 18:59:43 +00:00
self . creator_id = creator_id . get_optional ( ) ;
2020-12-15 15:28:25 +00:00
self
}
2021-03-18 20:25:21 +00:00
pub fn recipient_id < T : MaybeOptional < PersonId > > ( mut self , recipient_id : T ) -> Self {
2020-12-16 18:59:43 +00:00
self . recipient_id = recipient_id . get_optional ( ) ;
2020-12-15 15:28:25 +00:00
self
}
2021-03-18 20:25:21 +00:00
pub fn community_id < T : MaybeOptional < CommunityId > > ( mut self , community_id : T ) -> Self {
2020-12-16 18:59:43 +00:00
self . community_id = community_id . get_optional ( ) ;
2020-12-15 15:28:25 +00:00
self
}
2021-03-18 20:25:21 +00:00
pub fn my_person_id < T : MaybeOptional < PersonId > > ( mut self , my_person_id : T ) -> Self {
2021-03-10 22:33:55 +00:00
self . my_person_id = my_person_id . get_optional ( ) ;
2020-12-15 15:28:25 +00:00
self
}
2021-07-20 04:29:50 +00:00
pub fn community_actor_id < T : MaybeOptional < DbUrl > > ( mut self , community_actor_id : T ) -> Self {
self . community_actor_id = community_actor_id . get_optional ( ) ;
2020-12-15 15:28:25 +00:00
self
}
pub fn search_term < T : MaybeOptional < String > > ( mut self , search_term : T ) -> Self {
self . search_term = search_term . get_optional ( ) ;
self
}
2021-04-15 03:37:51 +00:00
pub fn saved_only < T : MaybeOptional < bool > > ( mut self , saved_only : T ) -> Self {
self . saved_only = saved_only . get_optional ( ) ;
2020-12-15 15:28:25 +00:00
self
}
2021-04-15 03:37:51 +00:00
pub fn unread_only < T : MaybeOptional < bool > > ( mut self , unread_only : T ) -> Self {
self . unread_only = unread_only . get_optional ( ) ;
2020-12-15 15:28:25 +00:00
self
}
2021-04-23 06:40:10 +00:00
pub fn show_bot_accounts < T : MaybeOptional < bool > > ( mut self , show_bot_accounts : T ) -> Self {
self . show_bot_accounts = show_bot_accounts . get_optional ( ) ;
2021-04-21 21:41:14 +00:00
self
}
2020-12-15 15:28:25 +00:00
pub fn page < T : MaybeOptional < i64 > > ( mut self , page : T ) -> Self {
self . page = page . get_optional ( ) ;
self
}
pub fn limit < T : MaybeOptional < i64 > > ( mut self , limit : T ) -> Self {
self . limit = limit . get_optional ( ) ;
self
}
pub fn list ( self ) -> Result < Vec < CommentView > , Error > {
use diesel ::dsl ::* ;
2020-12-16 18:59:43 +00:00
// The left join below will return None in this case
2021-03-18 20:25:21 +00:00
let person_id_join = self . my_person_id . unwrap_or ( PersonId ( - 1 ) ) ;
2020-12-16 18:59:43 +00:00
let mut query = comment ::table
2021-03-10 22:33:55 +00:00
. inner_join ( person ::table )
2020-12-16 18:59:43 +00:00
// recipient here
. left_join ( comment_alias_1 ::table . on ( comment_alias_1 ::id . nullable ( ) . eq ( comment ::parent_id ) ) )
2021-03-10 22:33:55 +00:00
. left_join ( person_alias_1 ::table . on ( person_alias_1 ::id . eq ( comment_alias_1 ::creator_id ) ) )
2020-12-16 18:59:43 +00:00
. inner_join ( post ::table )
. inner_join ( community ::table . on ( post ::community_id . eq ( community ::id ) ) )
. inner_join ( comment_aggregates ::table )
. left_join (
2021-03-10 22:33:55 +00:00
community_person_ban ::table . on (
2020-12-16 18:59:43 +00:00
community ::id
2021-03-10 22:33:55 +00:00
. eq ( community_person_ban ::community_id )
. and ( community_person_ban ::person_id . eq ( comment ::creator_id ) ) ,
2020-12-16 18:59:43 +00:00
) ,
)
. left_join (
community_follower ::table . on (
post ::community_id
. eq ( community_follower ::community_id )
2021-03-10 22:33:55 +00:00
. and ( community_follower ::person_id . eq ( person_id_join ) ) ,
2020-12-16 18:59:43 +00:00
) ,
)
. left_join (
comment_saved ::table . on (
comment ::id
. eq ( comment_saved ::comment_id )
2021-03-10 22:33:55 +00:00
. and ( comment_saved ::person_id . eq ( person_id_join ) ) ,
2020-12-16 18:59:43 +00:00
) ,
)
2021-08-19 20:54:15 +00:00
. left_join (
person_block ::table . on (
comment ::creator_id
. eq ( person_block ::target_id )
. and ( person_block ::person_id . eq ( person_id_join ) ) ,
) ,
)
. left_join (
community_block ::table . on (
community ::id
. eq ( community_block ::community_id )
. and ( community_block ::person_id . eq ( person_id_join ) ) ,
) ,
)
2020-12-16 18:59:43 +00:00
. left_join (
comment_like ::table . on (
comment ::id
. eq ( comment_like ::comment_id )
2021-03-10 22:33:55 +00:00
. and ( comment_like ::person_id . eq ( person_id_join ) ) ,
2020-12-16 18:59:43 +00:00
) ,
)
. select ( (
comment ::all_columns ,
2021-03-10 22:33:55 +00:00
Person ::safe_columns_tuple ( ) ,
2020-12-16 18:59:43 +00:00
comment_alias_1 ::all_columns . nullable ( ) ,
2021-03-10 22:33:55 +00:00
PersonAlias1 ::safe_columns_tuple ( ) . nullable ( ) ,
2020-12-16 18:59:43 +00:00
post ::all_columns ,
Community ::safe_columns_tuple ( ) ,
comment_aggregates ::all_columns ,
2021-03-10 22:33:55 +00:00
community_person_ban ::all_columns . nullable ( ) ,
2020-12-16 18:59:43 +00:00
community_follower ::all_columns . nullable ( ) ,
comment_saved ::all_columns . nullable ( ) ,
2021-08-19 20:54:15 +00:00
person_block ::all_columns . nullable ( ) ,
2020-12-16 18:59:43 +00:00
comment_like ::score . nullable ( ) ,
) )
. into_boxed ( ) ;
2020-12-15 15:28:25 +00:00
// The replies
2020-12-16 18:59:43 +00:00
if let Some ( recipient_id ) = self . recipient_id {
2020-12-15 15:28:25 +00:00
query = query
// TODO needs lots of testing
2021-03-10 22:33:55 +00:00
. filter ( person_alias_1 ::id . eq ( recipient_id ) ) // Gets the comment replies
2021-01-13 17:04:00 +00:00
. or_filter (
comment ::parent_id
. is_null ( )
. and ( post ::creator_id . eq ( recipient_id ) ) ,
) // Gets the top level replies
2020-12-15 15:28:25 +00:00
. filter ( comment ::deleted . eq ( false ) )
. filter ( comment ::removed . eq ( false ) ) ;
}
2021-04-26 13:50:34 +00:00
if self . unread_only . unwrap_or ( false ) {
2020-12-15 15:28:25 +00:00
query = query . filter ( comment ::read . eq ( false ) ) ;
}
2020-12-16 18:59:43 +00:00
if let Some ( creator_id ) = self . creator_id {
query = query . filter ( comment ::creator_id . eq ( creator_id ) ) ;
2020-12-15 15:28:25 +00:00
} ;
2020-12-16 18:59:43 +00:00
if let Some ( community_id ) = self . community_id {
query = query . filter ( post ::community_id . eq ( community_id ) ) ;
2020-12-15 15:28:25 +00:00
}
2021-07-20 04:29:50 +00:00
if let Some ( community_actor_id ) = self . community_actor_id {
query = query . filter ( community ::actor_id . eq ( community_actor_id ) )
2020-12-15 15:28:25 +00:00
}
2020-12-16 18:59:43 +00:00
if let Some ( post_id ) = self . post_id {
query = query . filter ( comment ::post_id . eq ( post_id ) ) ;
2020-12-15 15:28:25 +00:00
} ;
if let Some ( search_term ) = self . search_term {
query = query . filter ( comment ::content . ilike ( fuzzy_search ( & search_term ) ) ) ;
} ;
2021-04-15 03:37:51 +00:00
if let Some ( listing_type ) = self . listing_type {
query = match listing_type {
ListingType ::Subscribed = > query . filter ( community_follower ::person_id . is_not_null ( ) ) , // TODO could be this: and(community_follower::person_id.eq(person_id_join)),
ListingType ::Local = > query . filter ( community ::local . eq ( true ) ) ,
_ = > query ,
} ;
}
2020-12-15 15:28:25 +00:00
2021-04-26 13:50:34 +00:00
if self . saved_only . unwrap_or ( false ) {
2020-12-15 15:28:25 +00:00
query = query . filter ( comment_saved ::id . is_not_null ( ) ) ;
}
2021-04-15 03:37:51 +00:00
if ! self . show_bot_accounts . unwrap_or ( true ) {
2021-04-21 21:41:14 +00:00
query = query . filter ( person ::bot_account . eq ( false ) ) ;
} ;
2021-04-15 03:37:51 +00:00
query = match self . sort . unwrap_or ( SortType ::New ) {
2020-12-15 15:28:25 +00:00
SortType ::Hot | SortType ::Active = > query
2021-01-06 04:42:48 +00:00
. order_by ( hot_rank ( comment_aggregates ::score , comment_aggregates ::published ) . desc ( ) )
. then_order_by ( comment_aggregates ::published . desc ( ) ) ,
2021-02-18 15:38:25 +00:00
SortType ::New | SortType ::MostComments | SortType ::NewComments = > {
query . order_by ( comment ::published . desc ( ) )
}
2020-12-15 15:28:25 +00:00
SortType ::TopAll = > query . order_by ( comment_aggregates ::score . desc ( ) ) ,
SortType ::TopYear = > query
. filter ( comment ::published . gt ( now - 1. years ( ) ) )
. order_by ( comment_aggregates ::score . desc ( ) ) ,
SortType ::TopMonth = > query
. filter ( comment ::published . gt ( now - 1. months ( ) ) )
. order_by ( comment_aggregates ::score . desc ( ) ) ,
SortType ::TopWeek = > query
. filter ( comment ::published . gt ( now - 1. weeks ( ) ) )
. order_by ( comment_aggregates ::score . desc ( ) ) ,
SortType ::TopDay = > query
. filter ( comment ::published . gt ( now - 1. days ( ) ) )
. order_by ( comment_aggregates ::score . desc ( ) ) ,
} ;
2021-08-19 20:54:15 +00:00
// Don't show blocked communities or persons
if self . my_person_id . is_some ( ) {
query = query . filter ( community_block ::person_id . is_null ( ) ) ;
query = query . filter ( person_block ::person_id . is_null ( ) ) ;
}
2020-12-15 15:28:25 +00:00
let ( limit , offset ) = limit_and_offset ( self . page , self . limit ) ;
// Note: deleted and removed comments are done on the front side
let res = query
. limit ( limit )
. offset ( offset )
. load ::< CommentViewTuple > ( self . conn ) ? ;
2020-12-23 21:56:20 +00:00
Ok ( CommentView ::from_tuple_to_vec ( res ) )
2020-12-15 15:28:25 +00:00
}
}
impl ViewToVec for CommentView {
type DbTuple = CommentViewTuple ;
2020-12-23 21:56:20 +00:00
fn from_tuple_to_vec ( items : Vec < Self ::DbTuple > ) -> Vec < Self > {
items
2020-12-15 15:28:25 +00:00
. iter ( )
. map ( | a | Self {
comment : a . 0. to_owned ( ) ,
creator : a . 1. to_owned ( ) ,
recipient : a . 3. to_owned ( ) ,
post : a . 4. to_owned ( ) ,
community : a . 5. to_owned ( ) ,
counts : a . 6. to_owned ( ) ,
creator_banned_from_community : a . 7. is_some ( ) ,
subscribed : a . 8. is_some ( ) ,
saved : a . 9. is_some ( ) ,
2021-08-19 20:54:15 +00:00
creator_blocked : a . 10. is_some ( ) ,
my_vote : a . 11 ,
2020-12-15 15:28:25 +00:00
} )
. collect ::< Vec < Self > > ( )
}
}
2020-12-15 19:39:18 +00:00
#[ cfg(test) ]
mod tests {
2020-12-21 16:30:34 +00:00
use crate ::comment_view ::* ;
2020-12-21 23:27:42 +00:00
use lemmy_db_queries ::{
aggregates ::comment_aggregates ::CommentAggregates ,
establish_unpooled_connection ,
2021-08-19 20:54:15 +00:00
Blockable ,
2020-12-21 23:27:42 +00:00
Crud ,
Likeable ,
} ;
2021-08-19 20:54:15 +00:00
use lemmy_db_schema ::source ::{
comment ::* ,
community ::* ,
person ::* ,
person_block ::PersonBlockForm ,
post ::* ,
} ;
2021-02-25 19:43:39 +00:00
use serial_test ::serial ;
2020-12-15 19:39:18 +00:00
#[ test ]
2021-02-25 19:43:39 +00:00
#[ serial ]
2020-12-15 19:39:18 +00:00
fn test_crud ( ) {
let conn = establish_unpooled_connection ( ) ;
2021-03-10 22:33:55 +00:00
let new_person = PersonForm {
2021-03-11 16:41:04 +00:00
name : " timmy " . into ( ) ,
2021-03-20 20:59:07 +00:00
.. PersonForm ::default ( )
2020-12-15 19:39:18 +00:00
} ;
2021-03-10 22:33:55 +00:00
let inserted_person = Person ::create ( & conn , & new_person ) . unwrap ( ) ;
2020-12-15 19:39:18 +00:00
2021-08-19 20:54:15 +00:00
let new_person_2 = PersonForm {
name : " sara " . into ( ) ,
.. PersonForm ::default ( )
} ;
let inserted_person_2 = Person ::create ( & conn , & new_person_2 ) . unwrap ( ) ;
2020-12-15 19:39:18 +00:00
let new_community = CommunityForm {
name : " test community 5 " . to_string ( ) ,
title : " nada " . to_owned ( ) ,
2021-03-20 20:59:07 +00:00
.. CommunityForm ::default ( )
2020-12-15 19:39:18 +00:00
} ;
let inserted_community = Community ::create ( & conn , & new_community ) . unwrap ( ) ;
let new_post = PostForm {
name : " A test post 2 " . into ( ) ,
2021-03-10 22:33:55 +00:00
creator_id : inserted_person . id ,
2020-12-15 19:39:18 +00:00
community_id : inserted_community . id ,
2021-03-20 20:59:07 +00:00
.. PostForm ::default ( )
2020-12-15 19:39:18 +00:00
} ;
let inserted_post = Post ::create ( & conn , & new_post ) . unwrap ( ) ;
let comment_form = CommentForm {
content : " A test comment 32 " . into ( ) ,
2021-03-10 22:33:55 +00:00
creator_id : inserted_person . id ,
2020-12-15 19:39:18 +00:00
post_id : inserted_post . id ,
2021-03-20 20:59:07 +00:00
.. CommentForm ::default ( )
2020-12-15 19:39:18 +00:00
} ;
let inserted_comment = Comment ::create ( & conn , & comment_form ) . unwrap ( ) ;
2021-08-19 20:54:15 +00:00
let comment_form_2 = CommentForm {
content : " A test blocked comment " . into ( ) ,
creator_id : inserted_person_2 . id ,
post_id : inserted_post . id ,
parent_id : Some ( inserted_comment . id ) ,
.. CommentForm ::default ( )
} ;
let inserted_comment_2 = Comment ::create ( & conn , & comment_form_2 ) . unwrap ( ) ;
let timmy_blocks_sara_form = PersonBlockForm {
person_id : inserted_person . id ,
target_id : inserted_person_2 . id ,
} ;
let inserted_block = PersonBlock ::block ( & conn , & timmy_blocks_sara_form ) . unwrap ( ) ;
let expected_block = PersonBlock {
id : inserted_block . id ,
person_id : inserted_person . id ,
target_id : inserted_person_2 . id ,
published : inserted_block . published ,
} ;
assert_eq! ( expected_block , inserted_block ) ;
2020-12-15 19:39:18 +00:00
let comment_like_form = CommentLikeForm {
comment_id : inserted_comment . id ,
post_id : inserted_post . id ,
2021-03-10 22:33:55 +00:00
person_id : inserted_person . id ,
2020-12-15 19:39:18 +00:00
score : 1 ,
} ;
let _inserted_comment_like = CommentLike ::like ( & conn , & comment_like_form ) . unwrap ( ) ;
2020-12-18 17:25:27 +00:00
let agg = CommentAggregates ::read ( & conn , inserted_comment . id ) . unwrap ( ) ;
2021-03-10 22:33:55 +00:00
let expected_comment_view_no_person = CommentView {
2020-12-15 19:39:18 +00:00
creator_banned_from_community : false ,
my_vote : None ,
subscribed : false ,
saved : false ,
2021-08-19 20:54:15 +00:00
creator_blocked : false ,
2020-12-15 19:39:18 +00:00
comment : Comment {
id : inserted_comment . id ,
content : " A test comment 32 " . into ( ) ,
2021-03-10 22:33:55 +00:00
creator_id : inserted_person . id ,
2020-12-15 19:39:18 +00:00
post_id : inserted_post . id ,
parent_id : None ,
removed : false ,
deleted : false ,
read : false ,
published : inserted_comment . published ,
ap_id : inserted_comment . ap_id ,
updated : None ,
local : true ,
} ,
2021-03-10 22:33:55 +00:00
creator : PersonSafe {
id : inserted_person . id ,
2020-12-15 19:39:18 +00:00
name : " timmy " . into ( ) ,
2021-04-01 17:57:45 +00:00
display_name : None ,
2021-03-10 22:33:55 +00:00
published : inserted_person . published ,
2020-12-15 19:39:18 +00:00
avatar : None ,
2021-03-10 22:33:55 +00:00
actor_id : inserted_person . actor_id . to_owned ( ) ,
2020-12-15 19:39:18 +00:00
local : true ,
banned : false ,
deleted : false ,
2021-03-22 14:28:00 +00:00
admin : false ,
2021-04-21 21:41:14 +00:00
bot_account : false ,
2020-12-15 19:39:18 +00:00
bio : None ,
banner : None ,
updated : None ,
2021-03-10 22:33:55 +00:00
inbox_url : inserted_person . inbox_url . to_owned ( ) ,
2021-02-04 16:34:58 +00:00
shared_inbox_url : None ,
2021-03-20 19:21:51 +00:00
matrix_user_id : None ,
2020-12-15 19:39:18 +00:00
} ,
recipient : None ,
post : Post {
id : inserted_post . id ,
name : inserted_post . name . to_owned ( ) ,
2021-03-10 22:33:55 +00:00
creator_id : inserted_person . id ,
2020-12-15 19:39:18 +00:00
url : None ,
body : None ,
published : inserted_post . published ,
updated : None ,
community_id : inserted_community . id ,
removed : false ,
deleted : false ,
locked : false ,
stickied : false ,
nsfw : false ,
embed_title : None ,
embed_description : None ,
embed_html : None ,
thumbnail_url : None ,
ap_id : inserted_post . ap_id . to_owned ( ) ,
local : true ,
} ,
community : CommunitySafe {
id : inserted_community . id ,
name : " test community 5 " . to_string ( ) ,
icon : None ,
removed : false ,
deleted : false ,
nsfw : false ,
actor_id : inserted_community . actor_id . to_owned ( ) ,
local : true ,
title : " nada " . to_owned ( ) ,
description : None ,
updated : None ,
banner : None ,
published : inserted_community . published ,
} ,
counts : CommentAggregates {
2020-12-18 17:25:27 +00:00
id : agg . id ,
2020-12-15 19:39:18 +00:00
comment_id : inserted_comment . id ,
score : 1 ,
upvotes : 1 ,
downvotes : 0 ,
2021-01-06 04:42:48 +00:00
published : agg . published ,
2020-12-15 19:39:18 +00:00
} ,
} ;
2021-03-10 22:33:55 +00:00
let mut expected_comment_view_with_person = expected_comment_view_no_person . to_owned ( ) ;
expected_comment_view_with_person . my_vote = Some ( 1 ) ;
2020-12-15 19:39:18 +00:00
2021-03-10 22:33:55 +00:00
let read_comment_views_no_person = CommentQueryBuilder ::create ( & conn )
2020-12-16 18:59:43 +00:00
. post_id ( inserted_post . id )
2020-12-15 19:39:18 +00:00
. list ( )
. unwrap ( ) ;
2021-03-10 22:33:55 +00:00
let read_comment_views_with_person = CommentQueryBuilder ::create ( & conn )
2020-12-16 18:59:43 +00:00
. post_id ( inserted_post . id )
2021-03-10 22:33:55 +00:00
. my_person_id ( inserted_person . id )
2020-12-15 19:39:18 +00:00
. list ( )
. unwrap ( ) ;
2021-08-19 20:54:15 +00:00
let read_comment_from_blocked_person =
CommentView ::read ( & conn , inserted_comment_2 . id , Some ( inserted_person . id ) ) . unwrap ( ) ;
2021-03-10 22:33:55 +00:00
let like_removed = CommentLike ::remove ( & conn , inserted_person . id , inserted_comment . id ) . unwrap ( ) ;
2020-12-15 19:39:18 +00:00
let num_deleted = Comment ::delete ( & conn , inserted_comment . id ) . unwrap ( ) ;
2021-08-19 20:54:15 +00:00
Comment ::delete ( & conn , inserted_comment_2 . id ) . unwrap ( ) ;
2020-12-15 19:39:18 +00:00
Post ::delete ( & conn , inserted_post . id ) . unwrap ( ) ;
Community ::delete ( & conn , inserted_community . id ) . unwrap ( ) ;
2021-03-10 22:33:55 +00:00
Person ::delete ( & conn , inserted_person . id ) . unwrap ( ) ;
2021-08-19 20:54:15 +00:00
Person ::delete ( & conn , inserted_person_2 . id ) . unwrap ( ) ;
// Make sure its 1, not showing the blocked comment
assert_eq! ( 1 , read_comment_views_with_person . len ( ) ) ;
2020-12-15 19:39:18 +00:00
2021-03-11 04:43:11 +00:00
assert_eq! (
expected_comment_view_no_person ,
2021-08-19 20:54:15 +00:00
read_comment_views_no_person [ 1 ]
2021-03-11 04:43:11 +00:00
) ;
2020-12-15 19:39:18 +00:00
assert_eq! (
2021-03-10 22:33:55 +00:00
expected_comment_view_with_person ,
read_comment_views_with_person [ 0 ]
2020-12-15 19:39:18 +00:00
) ;
2021-08-19 20:54:15 +00:00
// Make sure block set the creator blocked
assert_eq! ( true , read_comment_from_blocked_person . creator_blocked ) ;
2020-12-15 19:39:18 +00:00
assert_eq! ( 1 , num_deleted ) ;
assert_eq! ( 1 , like_removed ) ;
}
}