mirror of https://github.com/LemmyNet/lemmy
Adding SiteAggregates.
parent
ca7224c086
commit
7731479607
@ -0,0 +1,19 @@
|
||||
use crate::schema::site_aggregates;
|
||||
use diesel::{result::Error, *};
|
||||
use serde::Serialize;
|
||||
|
||||
#[derive(Queryable, Associations, Identifiable, PartialEq, Debug, Serialize)]
|
||||
#[table_name = "site_aggregates"]
|
||||
pub struct SiteAggregates {
|
||||
pub id: i32,
|
||||
pub users: i64,
|
||||
pub posts: i64,
|
||||
pub comments: i64,
|
||||
pub communities: i64,
|
||||
}
|
||||
|
||||
impl SiteAggregates {
|
||||
pub fn read(conn: &PgConnection) -> Result<Self, Error> {
|
||||
site_aggregates::table.first::<Self>(conn)
|
||||
}
|
||||
}
|
@ -1,55 +0,0 @@
|
||||
use diesel::{result::Error, *};
|
||||
use serde::Serialize;
|
||||
|
||||
table! {
|
||||
site_view (id) {
|
||||
id -> Int4,
|
||||
name -> Varchar,
|
||||
description -> Nullable<Text>,
|
||||
creator_id -> Int4,
|
||||
published -> Timestamp,
|
||||
updated -> Nullable<Timestamp>,
|
||||
enable_downvotes -> Bool,
|
||||
open_registration -> Bool,
|
||||
enable_nsfw -> Bool,
|
||||
icon -> Nullable<Text>,
|
||||
banner -> Nullable<Text>,
|
||||
creator_name -> Varchar,
|
||||
creator_preferred_username -> Nullable<Varchar>,
|
||||
creator_avatar -> Nullable<Text>,
|
||||
number_of_users -> BigInt,
|
||||
number_of_posts -> BigInt,
|
||||
number_of_comments -> BigInt,
|
||||
number_of_communities -> BigInt,
|
||||
}
|
||||
}
|
||||
|
||||
#[derive(Queryable, Identifiable, PartialEq, Debug, Serialize, QueryableByName, Clone)]
|
||||
#[table_name = "site_view"]
|
||||
pub struct SiteView {
|
||||
pub id: i32,
|
||||
pub name: String,
|
||||
pub description: Option<String>,
|
||||
pub creator_id: i32,
|
||||
pub published: chrono::NaiveDateTime,
|
||||
pub updated: Option<chrono::NaiveDateTime>,
|
||||
pub enable_downvotes: bool,
|
||||
pub open_registration: bool,
|
||||
pub enable_nsfw: bool,
|
||||
pub icon: Option<String>,
|
||||
pub banner: Option<String>,
|
||||
pub creator_name: String,
|
||||
pub creator_preferred_username: Option<String>,
|
||||
pub creator_avatar: Option<String>,
|
||||
pub number_of_users: i64,
|
||||
pub number_of_posts: i64,
|
||||
pub number_of_comments: i64,
|
||||
pub number_of_communities: i64,
|
||||
}
|
||||
|
||||
impl SiteView {
|
||||
pub fn read(conn: &PgConnection) -> Result<Self, Error> {
|
||||
use super::site_view::site_view::dsl::*;
|
||||
site_view.first::<Self>(conn)
|
||||
}
|
||||
}
|
@ -1 +1,2 @@
|
||||
pub mod site_view;
|
||||
pub mod user_view;
|
||||
|
@ -0,0 +1,65 @@
|
||||
use crate::{
|
||||
schema::user_,
|
||||
user::{UserSafe, User_},
|
||||
};
|
||||
use diesel::{result::Error, *};
|
||||
use serde::Serialize;
|
||||
|
||||
#[derive(Debug, Serialize, Clone)]
|
||||
pub struct UserViewSafe {
|
||||
pub user: UserSafe,
|
||||
// TODO
|
||||
// pub number_of_posts: i64,
|
||||
// pub post_score: i64,
|
||||
// pub number_of_comments: i64,
|
||||
// pub comment_score: i64,
|
||||
}
|
||||
|
||||
pub struct UserViewDangerous {
|
||||
pub user: User_,
|
||||
// TODO
|
||||
// pub number_of_posts: i64,
|
||||
// pub post_score: i64,
|
||||
// pub number_of_comments: i64,
|
||||
// pub comment_score: i64,
|
||||
}
|
||||
|
||||
impl UserViewDangerous {
|
||||
pub fn read(conn: &PgConnection, id: i32) -> Result<Self, Error> {
|
||||
let user = user_::table.find(id).first::<User_>(conn)?;
|
||||
Ok(Self { user })
|
||||
}
|
||||
}
|
||||
|
||||
impl UserViewSafe {
|
||||
pub fn read(conn: &PgConnection, id: i32) -> Result<Self, Error> {
|
||||
let user = user_::table.find(id).first::<User_>(conn)?.to_safe();
|
||||
Ok(Self { user })
|
||||
}
|
||||
|
||||
pub fn admins(conn: &PgConnection) -> Result<Vec<Self>, Error> {
|
||||
let admins = user_::table
|
||||
// TODO do joins here
|
||||
.filter(user_::admin.eq(true))
|
||||
.order_by(user_::published)
|
||||
.load::<User_>(conn)?;
|
||||
|
||||
Ok(vec_to_user_view_safe(admins))
|
||||
}
|
||||
|
||||
pub fn banned(conn: &PgConnection) -> Result<Vec<Self>, Error> {
|
||||
let banned = user_::table
|
||||
// TODO do joins here
|
||||
.filter(user_::banned.eq(true))
|
||||
.load::<User_>(conn)?;
|
||||
|
||||
Ok(vec_to_user_view_safe(banned))
|
||||
}
|
||||
}
|
||||
|
||||
fn vec_to_user_view_safe(users: Vec<User_>) -> Vec<UserViewSafe> {
|
||||
users
|
||||
.iter()
|
||||
.map(|a| UserViewSafe { user: a.to_safe() })
|
||||
.collect::<Vec<UserViewSafe>>()
|
||||
}
|
@ -0,0 +1,19 @@
|
||||
-- Site aggregates
|
||||
drop table site_aggregates;
|
||||
drop trigger site_aggregates_insert_user on user_;
|
||||
drop trigger site_aggregates_delete_user on user_;
|
||||
drop trigger site_aggregates_insert_post on post;
|
||||
drop trigger site_aggregates_delete_post on post;
|
||||
drop trigger site_aggregates_insert_comment on comment;
|
||||
drop trigger site_aggregates_delete_comment on comment;
|
||||
drop trigger site_aggregates_insert_community on community;
|
||||
drop trigger site_aggregates_delete_community on community;
|
||||
drop function
|
||||
site_aggregates_user_increment,
|
||||
site_aggregates_user_decrement,
|
||||
site_aggregates_post_increment,
|
||||
site_aggregates_post_decrement,
|
||||
site_aggregates_comment_increment,
|
||||
site_aggregates_comment_decrement,
|
||||
site_aggregates_community_increment,
|
||||
site_aggregates_community_decrement;
|
@ -0,0 +1,124 @@
|
||||
-- Add site aggregates
|
||||
create table site_aggregates (
|
||||
id serial primary key,
|
||||
users bigint not null,
|
||||
posts bigint not null,
|
||||
comments bigint not null,
|
||||
communities bigint not null
|
||||
);
|
||||
|
||||
insert into site_aggregates (users, posts, comments, communities)
|
||||
select ( select coalesce(count(*), 0) from user_) as users,
|
||||
( select coalesce(count(*), 0) from post) as posts,
|
||||
( select coalesce(count(*), 0) from comment) as comments,
|
||||
( select coalesce(count(*), 0) from community) as communities;
|
||||
|
||||
-- Add site aggregate triggers
|
||||
-- user
|
||||
create function site_aggregates_user_increment()
|
||||
returns trigger language plpgsql
|
||||
as $$
|
||||
begin
|
||||
update site_aggregates
|
||||
set users = users + 1;
|
||||
return null;
|
||||
end $$;
|
||||
|
||||
create trigger site_aggregates_insert_user
|
||||
after insert on user_
|
||||
execute procedure site_aggregates_user_increment();
|
||||
|
||||
create function site_aggregates_user_decrement()
|
||||
returns trigger language plpgsql
|
||||
as $$
|
||||
begin
|
||||
update site_aggregates
|
||||
set users = users - 1;
|
||||
return null;
|
||||
end $$;
|
||||
|
||||
create trigger site_aggregates_delete_user
|
||||
after delete on user_
|
||||
execute procedure site_aggregates_user_decrement();
|
||||
|
||||
-- post
|
||||
create function site_aggregates_post_increment()
|
||||
returns trigger language plpgsql
|
||||
as $$
|
||||
begin
|
||||
update site_aggregates
|
||||
set posts = posts + 1;
|
||||
return null;
|
||||
end $$;
|
||||
|
||||
create trigger site_aggregates_insert_post
|
||||
after insert on post
|
||||
execute procedure site_aggregates_post_increment();
|
||||
|
||||
create function site_aggregates_post_decrement()
|
||||
returns trigger language plpgsql
|
||||
as $$
|
||||
begin
|
||||
update site_aggregates
|
||||
set posts = posts - 1;
|
||||
return null;
|
||||
end $$;
|
||||
|
||||
create trigger site_aggregates_delete_post
|
||||
after delete on post
|
||||
execute procedure site_aggregates_post_decrement();
|
||||
|
||||
-- comment
|
||||
create function site_aggregates_comment_increment()
|
||||
returns trigger language plpgsql
|
||||
as $$
|
||||
begin
|
||||
update site_aggregates
|
||||
set comments = comments + 1;
|
||||
return null;
|
||||
end $$;
|
||||
|
||||
create trigger site_aggregates_insert_comment
|
||||
after insert on comment
|
||||
execute procedure site_aggregates_comment_increment();
|
||||
|
||||
create function site_aggregates_comment_decrement()
|
||||
returns trigger language plpgsql
|
||||
as $$
|
||||
begin
|
||||
update site_aggregates
|
||||
set comments = comments - 1;
|
||||
return null;
|
||||
end $$;
|
||||
|
||||
create trigger site_aggregates_delete_comment
|
||||
after delete on comment
|
||||
execute procedure site_aggregates_comment_decrement();
|
||||
|
||||
-- community
|
||||
create function site_aggregates_community_increment()
|
||||
returns trigger language plpgsql
|
||||
as $$
|
||||
begin
|
||||
update site_aggregates
|
||||
set communities = communities + 1;
|
||||
return null;
|
||||
end $$;
|
||||
|
||||
create trigger site_aggregates_insert_community
|
||||
after insert on community
|
||||
execute procedure site_aggregates_community_increment();
|
||||
|
||||
create function site_aggregates_community_decrement()
|
||||
returns trigger language plpgsql
|
||||
as $$
|
||||
begin
|
||||
update site_aggregates
|
||||
set communities = communities - 1;
|
||||
return null;
|
||||
end $$;
|
||||
|
||||
create trigger site_aggregates_delete_community
|
||||
after delete on community
|
||||
execute procedure site_aggregates_community_decrement();
|
||||
|
@ -1 +0,0 @@
|
||||
-- This file should undo anything in `up.sql`
|
@ -1 +0,0 @@
|
||||
-- Your SQL goes here
|
Loading…
Reference in New Issue