]> Untitled Git - lemmy.git/blob - crates/db_queries/src/aggregates/site_aggregates.rs
Moving matrix_user_id to person table. #1438
[lemmy.git] / crates / db_queries / src / aggregates / site_aggregates.rs
1 use diesel::{result::Error, *};
2 use lemmy_db_schema::schema::site_aggregates;
3 use serde::Serialize;
4
5 #[derive(Queryable, Associations, Identifiable, PartialEq, Debug, Serialize, Clone)]
6 #[table_name = "site_aggregates"]
7 pub struct SiteAggregates {
8   pub id: i32,
9   pub site_id: i32,
10   pub users: i64,
11   pub posts: i64,
12   pub comments: i64,
13   pub communities: i64,
14   pub users_active_day: i64,
15   pub users_active_week: i64,
16   pub users_active_month: i64,
17   pub users_active_half_year: i64,
18 }
19
20 impl SiteAggregates {
21   pub fn read(conn: &PgConnection) -> Result<Self, Error> {
22     site_aggregates::table.first::<Self>(conn)
23   }
24 }
25
26 #[cfg(test)]
27 mod tests {
28   use crate::{aggregates::site_aggregates::SiteAggregates, establish_unpooled_connection, Crud};
29   use lemmy_db_schema::source::{
30     comment::{Comment, CommentForm},
31     community::{Community, CommunityForm},
32     person::{Person, PersonForm},
33     post::{Post, PostForm},
34     site::{Site, SiteForm},
35   };
36   use serial_test::serial;
37
38   #[test]
39   #[serial]
40   fn test_crud() {
41     let conn = establish_unpooled_connection();
42
43     let new_person = PersonForm {
44       name: "thommy_site_agg".into(),
45       preferred_username: None,
46       avatar: None,
47       banner: None,
48       banned: None,
49       deleted: None,
50       published: None,
51       updated: None,
52       actor_id: None,
53       bio: None,
54       local: None,
55       private_key: None,
56       public_key: None,
57       last_refreshed_at: None,
58       inbox_url: None,
59       shared_inbox_url: None,
60       matrix_user_id: None,
61     };
62
63     let inserted_person = Person::create(&conn, &new_person).unwrap();
64
65     let site_form = SiteForm {
66       name: "test_site".into(),
67       description: None,
68       icon: None,
69       banner: None,
70       creator_id: inserted_person.id,
71       enable_downvotes: true,
72       open_registration: true,
73       enable_nsfw: true,
74       updated: None,
75     };
76
77     Site::create(&conn, &site_form).unwrap();
78
79     let new_community = CommunityForm {
80       name: "TIL_site_agg".into(),
81       creator_id: inserted_person.id,
82       title: "nada".to_owned(),
83       description: None,
84       nsfw: false,
85       removed: None,
86       deleted: None,
87       updated: None,
88       actor_id: None,
89       local: true,
90       private_key: None,
91       public_key: None,
92       last_refreshed_at: None,
93       published: None,
94       icon: None,
95       banner: None,
96       followers_url: None,
97       inbox_url: None,
98       shared_inbox_url: None,
99     };
100
101     let inserted_community = Community::create(&conn, &new_community).unwrap();
102
103     let new_post = PostForm {
104       name: "A test post".into(),
105       url: None,
106       body: None,
107       creator_id: inserted_person.id,
108       community_id: inserted_community.id,
109       removed: None,
110       deleted: None,
111       locked: None,
112       stickied: None,
113       nsfw: false,
114       updated: None,
115       embed_title: None,
116       embed_description: None,
117       embed_html: None,
118       thumbnail_url: None,
119       ap_id: None,
120       local: true,
121       published: None,
122     };
123
124     // Insert two of those posts
125     let inserted_post = Post::create(&conn, &new_post).unwrap();
126     let _inserted_post_again = Post::create(&conn, &new_post).unwrap();
127
128     let comment_form = CommentForm {
129       content: "A test comment".into(),
130       creator_id: inserted_person.id,
131       post_id: inserted_post.id,
132       removed: None,
133       deleted: None,
134       read: None,
135       parent_id: None,
136       published: None,
137       updated: None,
138       ap_id: None,
139       local: true,
140     };
141
142     // Insert two of those comments
143     let inserted_comment = Comment::create(&conn, &comment_form).unwrap();
144
145     let child_comment_form = CommentForm {
146       content: "A test comment".into(),
147       creator_id: inserted_person.id,
148       post_id: inserted_post.id,
149       removed: None,
150       deleted: None,
151       read: None,
152       parent_id: Some(inserted_comment.id),
153       published: None,
154       updated: None,
155       ap_id: None,
156       local: true,
157     };
158
159     let _inserted_child_comment = Comment::create(&conn, &child_comment_form).unwrap();
160
161     let site_aggregates_before_delete = SiteAggregates::read(&conn).unwrap();
162
163     assert_eq!(1, site_aggregates_before_delete.users);
164     assert_eq!(1, site_aggregates_before_delete.communities);
165     assert_eq!(2, site_aggregates_before_delete.posts);
166     assert_eq!(2, site_aggregates_before_delete.comments);
167
168     // Try a post delete
169     Post::delete(&conn, inserted_post.id).unwrap();
170     let site_aggregates_after_post_delete = SiteAggregates::read(&conn).unwrap();
171     assert_eq!(1, site_aggregates_after_post_delete.posts);
172     assert_eq!(0, site_aggregates_after_post_delete.comments);
173
174     // This shouuld delete all the associated rows, and fire triggers
175     let person_num_deleted = Person::delete(&conn, inserted_person.id).unwrap();
176     assert_eq!(1, person_num_deleted);
177
178     let after_delete = SiteAggregates::read(&conn);
179     assert!(after_delete.is_err());
180   }
181 }