comment::{Comment, CommentForm},
community::{Community, CommunityForm},
post::{Post, PostForm},
+ site::{Site, SiteForm},
user::{UserForm, User_},
},
tests::establish_unpooled_connection,
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,
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());
}
}
.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 {
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
-- Add site aggregate triggers
-- user
-create function site_aggregates_user()
+create or replace function site_aggregates_user()
returns trigger language plpgsql
as $$
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 $$;
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 $$;
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 $$;
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 $$;