]> Untitled Git - lemmy.git/blob - crates/db_schema/src/aggregates/site_aggregates.rs
Implement instance actor (#1798)
[lemmy.git] / crates / db_schema / src / aggregates / site_aggregates.rs
1 use crate::schema::site_aggregates;
2 use diesel::{result::Error, *};
3 use serde::{Deserialize, Serialize};
4
5 #[derive(
6   Queryable, Associations, Identifiable, PartialEq, Debug, Serialize, Deserialize, Clone,
7 )]
8 #[table_name = "site_aggregates"]
9 pub struct SiteAggregates {
10   pub id: i32,
11   pub site_id: i32,
12   pub users: i64,
13   pub posts: i64,
14   pub comments: i64,
15   pub communities: i64,
16   pub users_active_day: i64,
17   pub users_active_week: i64,
18   pub users_active_month: i64,
19   pub users_active_half_year: i64,
20 }
21
22 impl SiteAggregates {
23   pub fn read(conn: &PgConnection) -> Result<Self, Error> {
24     site_aggregates::table.first::<Self>(conn)
25   }
26 }
27
28 #[cfg(test)]
29 mod tests {
30   use crate::{
31     aggregates::site_aggregates::SiteAggregates,
32     establish_unpooled_connection,
33     source::{
34       comment::{Comment, CommentForm},
35       community::{Community, CommunityForm},
36       person::{Person, PersonForm},
37       post::{Post, PostForm},
38       site::{Site, SiteForm},
39     },
40     traits::Crud,
41   };
42   use serial_test::serial;
43
44   #[test]
45   #[serial]
46   fn test_crud() {
47     let conn = establish_unpooled_connection();
48
49     let new_person = PersonForm {
50       name: "thommy_site_agg".into(),
51       ..PersonForm::default()
52     };
53
54     let inserted_person = Person::create(&conn, &new_person).unwrap();
55
56     let site_form = SiteForm {
57       name: "test_site".into(),
58       ..Default::default()
59     };
60
61     Site::create(&conn, &site_form).unwrap();
62
63     let new_community = CommunityForm {
64       name: "TIL_site_agg".into(),
65       title: "nada".to_owned(),
66       ..CommunityForm::default()
67     };
68
69     let inserted_community = Community::create(&conn, &new_community).unwrap();
70
71     let new_post = PostForm {
72       name: "A test post".into(),
73       creator_id: inserted_person.id,
74       community_id: inserted_community.id,
75       ..PostForm::default()
76     };
77
78     // Insert two of those posts
79     let inserted_post = Post::create(&conn, &new_post).unwrap();
80     let _inserted_post_again = Post::create(&conn, &new_post).unwrap();
81
82     let comment_form = CommentForm {
83       content: "A test comment".into(),
84       creator_id: inserted_person.id,
85       post_id: inserted_post.id,
86       ..CommentForm::default()
87     };
88
89     // Insert two of those comments
90     let inserted_comment = Comment::create(&conn, &comment_form).unwrap();
91
92     let child_comment_form = CommentForm {
93       content: "A test comment".into(),
94       creator_id: inserted_person.id,
95       post_id: inserted_post.id,
96       parent_id: Some(inserted_comment.id),
97       ..CommentForm::default()
98     };
99
100     let _inserted_child_comment = Comment::create(&conn, &child_comment_form).unwrap();
101
102     let site_aggregates_before_delete = SiteAggregates::read(&conn).unwrap();
103
104     assert_eq!(1, site_aggregates_before_delete.users);
105     assert_eq!(1, site_aggregates_before_delete.communities);
106     assert_eq!(2, site_aggregates_before_delete.posts);
107     assert_eq!(2, site_aggregates_before_delete.comments);
108
109     // Try a post delete
110     Post::delete(&conn, inserted_post.id).unwrap();
111     let site_aggregates_after_post_delete = SiteAggregates::read(&conn).unwrap();
112     assert_eq!(1, site_aggregates_after_post_delete.posts);
113     assert_eq!(0, site_aggregates_after_post_delete.comments);
114
115     // This shouuld delete all the associated rows, and fire triggers
116     let person_num_deleted = Person::delete(&conn, inserted_person.id).unwrap();
117     assert_eq!(1, person_num_deleted);
118
119     // Delete the community
120     let community_num_deleted = Community::delete(&conn, inserted_community.id).unwrap();
121     assert_eq!(1, community_num_deleted);
122
123     // Site should still exist, it can without a site creator.
124     let after_delete_creator = SiteAggregates::read(&conn);
125     assert!(after_delete_creator.is_ok());
126
127     let site_id = after_delete_creator.unwrap().id;
128     Site::delete(&conn, site_id).unwrap();
129     let after_delete_site = SiteAggregates::read(&conn);
130     assert!(after_delete_site.is_err());
131   }
132 }