Fix site aggs.

This commit is contained in:
Dessalines 2020-12-20 00:09:20 -05:00
parent 2d7d9cf7d8
commit a27b7f8d1f
3 changed files with 40 additions and 15 deletions

View File

@ -27,6 +27,7 @@ mod tests {
comment::{Comment, CommentForm},
community::{Community, CommunityForm},
post::{Post, PostForm},
site::{Site, SiteForm},
user::{UserForm, User_},
},
tests::establish_unpooled_connection,
@ -68,6 +69,20 @@ mod tests {
let inserted_user = User_::create(&conn, &new_user).unwrap();
let site_form = SiteForm {
name: "test_site".into(),
description: None,
icon: None,
banner: None,
creator_id: inserted_user.id,
enable_downvotes: true,
open_registration: true,
enable_nsfw: true,
updated: None,
};
Site::create(&conn, &site_form).unwrap();
let new_community = CommunityForm {
name: "TIL_site_agg".into(),
creator_id: inserted_user.id,
@ -165,10 +180,7 @@ mod tests {
let user_num_deleted = User_::delete(&conn, inserted_user.id).unwrap();
assert_eq!(1, user_num_deleted);
let site_aggregates_after_delete = SiteAggregates::read(&conn).unwrap();
assert_eq!(0, site_aggregates_after_delete.users);
assert_eq!(0, site_aggregates_after_delete.communities);
assert_eq!(0, site_aggregates_after_delete.posts);
assert_eq!(0, site_aggregates_after_delete.comments);
let after_delete = SiteAggregates::read(&conn);
assert!(after_delete.is_err());
}
}

View File

@ -50,6 +50,10 @@ impl Crud<SiteForm> for Site {
.set(new_site)
.get_result::<Self>(conn)
}
fn delete(conn: &PgConnection, site_id: i32) -> Result<usize, Error> {
use crate::schema::site::dsl::*;
diesel::delete(site.find(site_id)).execute(conn)
}
}
impl Site {

View File

@ -2,7 +2,7 @@
create table site_aggregates (
id serial primary key,
site_id int references site on update cascade on delete cascade not null,
users bigint not null default 0,
users bigint not null default 1,
posts bigint not null default 0,
comments bigint not null default 0,
communities bigint not null default 0
@ -36,7 +36,7 @@ execute procedure site_aggregates_site();
-- Add site aggregate triggers
-- user
create function site_aggregates_user()
create or replace function site_aggregates_user()
returns trigger language plpgsql
as $$
begin
@ -44,8 +44,11 @@ begin
update site_aggregates
set users = users + 1;
ELSIF (TG_OP = 'DELETE') THEN
update site_aggregates
set users = users - 1;
-- Join to site since the creator might not be there anymore
update site_aggregates sa
set users = users - 1
from site s
where sa.site_id = s.id;
END IF;
return null;
end $$;
@ -64,8 +67,10 @@ begin
update site_aggregates
set posts = posts + 1;
ELSIF (TG_OP = 'DELETE') THEN
update site_aggregates
set posts = posts - 1;
update site_aggregates sa
set posts = posts - 1
from site s
where sa.site_id = s.id;
END IF;
return null;
end $$;
@ -84,8 +89,10 @@ begin
update site_aggregates
set comments = comments + 1;
ELSIF (TG_OP = 'DELETE') THEN
update site_aggregates
set comments = comments - 1;
update site_aggregates sa
set comments = comments - 1
from site s
where sa.site_id = s.id;
END IF;
return null;
end $$;
@ -104,8 +111,10 @@ begin
update site_aggregates
set communities = communities + 1;
ELSIF (TG_OP = 'DELETE') THEN
update site_aggregates
set communities = communities - 1;
update site_aggregates sa
set communities = communities - 1
from site s
where sa.site_id = s.id;
END IF;
return null;
end $$;