use crate::schema::post_aggregates; use diesel::{result::Error, *}; use serde::Serialize; #[derive(Queryable, Associations, Identifiable, PartialEq, Debug, Serialize, Clone)] #[table_name = "post_aggregates"] pub struct PostAggregates { pub id: i32, pub post_id: i32, pub comments: i64, pub score: i64, pub upvotes: i64, pub downvotes: i64, pub newest_comment_time: chrono::NaiveDateTime, } impl PostAggregates { pub fn read(conn: &PgConnection, post_id: i32) -> Result { post_aggregates::table .filter(post_aggregates::post_id.eq(post_id)) .first::(conn) } } // #[cfg(test)] // mod tests { // use crate::{ // aggregates::community_aggregates::CommunityAggregates, // comment::{Comment, CommentForm}, // community::{Community, CommunityFollower, CommunityFollowerForm, CommunityForm}, // post::{Post, PostForm}, // tests::establish_unpooled_connection, // user::{UserForm, User_}, // Crud, // Followable, // ListingType, // SortType, // }; // #[test] // fn test_crud() { // let conn = establish_unpooled_connection(); // let new_user = UserForm { // name: "thommy_community_agg".into(), // preferred_username: None, // password_encrypted: "nope".into(), // email: None, // matrix_user_id: None, // avatar: None, // banner: None, // admin: false, // banned: Some(false), // published: None, // updated: None, // show_nsfw: false, // theme: "browser".into(), // default_sort_type: SortType::Hot as i16, // default_listing_type: ListingType::Subscribed as i16, // lang: "browser".into(), // show_avatars: true, // send_notifications_to_email: false, // actor_id: None, // bio: None, // local: true, // private_key: None, // public_key: None, // last_refreshed_at: None, // }; // let inserted_user = User_::create(&conn, &new_user).unwrap(); // let another_user = UserForm { // name: "jerry_community_agg".into(), // preferred_username: None, // password_encrypted: "nope".into(), // email: None, // matrix_user_id: None, // avatar: None, // banner: None, // admin: false, // banned: Some(false), // published: None, // updated: None, // show_nsfw: false, // theme: "browser".into(), // default_sort_type: SortType::Hot as i16, // default_listing_type: ListingType::Subscribed as i16, // lang: "browser".into(), // show_avatars: true, // send_notifications_to_email: false, // actor_id: None, // bio: None, // local: true, // private_key: None, // public_key: None, // last_refreshed_at: None, // }; // let another_inserted_user = User_::create(&conn, &another_user).unwrap(); // let new_community = CommunityForm { // name: "TIL_community_agg".into(), // creator_id: inserted_user.id, // title: "nada".to_owned(), // description: None, // category_id: 1, // nsfw: false, // removed: None, // deleted: None, // updated: None, // actor_id: None, // local: true, // private_key: None, // public_key: None, // last_refreshed_at: None, // published: None, // icon: None, // banner: None, // }; // let inserted_community = Community::create(&conn, &new_community).unwrap(); // let another_community = CommunityForm { // name: "TIL_community_agg_2".into(), // creator_id: inserted_user.id, // title: "nada".to_owned(), // description: None, // category_id: 1, // nsfw: false, // removed: None, // deleted: None, // updated: None, // actor_id: None, // local: true, // private_key: None, // public_key: None, // last_refreshed_at: None, // published: None, // icon: None, // banner: None, // }; // let another_inserted_community = Community::create(&conn, &another_community).unwrap(); // let first_user_follow = CommunityFollowerForm { // community_id: inserted_community.id, // user_id: inserted_user.id, // pending: false, // }; // CommunityFollower::follow(&conn, &first_user_follow).unwrap(); // let second_user_follow = CommunityFollowerForm { // community_id: inserted_community.id, // user_id: another_inserted_user.id, // pending: false, // }; // CommunityFollower::follow(&conn, &second_user_follow).unwrap(); // let another_community_follow = CommunityFollowerForm { // community_id: another_inserted_community.id, // user_id: inserted_user.id, // pending: false, // }; // CommunityFollower::follow(&conn, &another_community_follow).unwrap(); // let new_post = PostForm { // name: "A test post".into(), // url: None, // body: None, // creator_id: inserted_user.id, // community_id: inserted_community.id, // removed: None, // deleted: None, // locked: None, // stickied: None, // nsfw: false, // updated: None, // embed_title: None, // embed_description: None, // embed_html: None, // thumbnail_url: None, // ap_id: None, // local: true, // published: None, // }; // let inserted_post = Post::create(&conn, &new_post).unwrap(); // let comment_form = CommentForm { // content: "A test comment".into(), // creator_id: inserted_user.id, // post_id: inserted_post.id, // removed: None, // deleted: None, // read: None, // parent_id: None, // published: None, // updated: None, // ap_id: None, // local: true, // }; // let inserted_comment = Comment::create(&conn, &comment_form).unwrap(); // let child_comment_form = CommentForm { // content: "A test comment".into(), // creator_id: inserted_user.id, // post_id: inserted_post.id, // removed: None, // deleted: None, // read: None, // parent_id: Some(inserted_comment.id), // published: None, // updated: None, // ap_id: None, // local: true, // }; // let _inserted_child_comment = Comment::create(&conn, &child_comment_form).unwrap(); // let community_aggregates_before_delete = // CommunityAggregates::read(&conn, inserted_community.id).unwrap(); // assert_eq!(2, community_aggregates_before_delete.subscribers); // assert_eq!(1, community_aggregates_before_delete.posts); // assert_eq!(2, community_aggregates_before_delete.comments); // // Test the other community // let another_community_aggs = // CommunityAggregates::read(&conn, another_inserted_community.id).unwrap(); // assert_eq!(1, another_community_aggs.subscribers); // assert_eq!(0, another_community_aggs.posts); // assert_eq!(0, another_community_aggs.comments); // // Unfollow test // CommunityFollower::unfollow(&conn, &second_user_follow).unwrap(); // let after_unfollow = CommunityAggregates::read(&conn, inserted_community.id).unwrap(); // assert_eq!(1, after_unfollow.subscribers); // // Follow again just for the later tests // CommunityFollower::follow(&conn, &second_user_follow).unwrap(); // let after_follow_again = CommunityAggregates::read(&conn, inserted_community.id).unwrap(); // assert_eq!(2, after_follow_again.subscribers); // // Remove a parent comment (the comment count should also be 0) // Post::delete(&conn, inserted_post.id).unwrap(); // let after_parent_post_delete = CommunityAggregates::read(&conn, inserted_community.id).unwrap(); // assert_eq!(0, after_parent_post_delete.comments); // assert_eq!(0, after_parent_post_delete.posts); // // Remove the 2nd user // User_::delete(&conn, another_inserted_user.id).unwrap(); // let after_user_delete = CommunityAggregates::read(&conn, inserted_community.id).unwrap(); // assert_eq!(1, after_user_delete.subscribers); // // This should delete all the associated rows, and fire triggers // let user_num_deleted = User_::delete(&conn, inserted_user.id).unwrap(); // assert_eq!(1, user_num_deleted); // // Should be none found, since the creator was deleted // let after_delete = CommunityAggregates::read(&conn, inserted_community.id); // assert!(after_delete.is_err()); // } // }