Removing old communityviews

This commit is contained in:
Dessalines 2020-12-06 09:12:51 -05:00
parent 5e510e7a67
commit 36f7b20784
18 changed files with 82 additions and 469 deletions

View file

@ -13,13 +13,17 @@ use lemmy_db::{
comment::Comment, comment::Comment,
comment_view::CommentQueryBuilder, comment_view::CommentQueryBuilder,
community::*, community::*,
community_view::*,
diesel_option_overwrite, diesel_option_overwrite,
moderator::*, moderator::*,
naive_now, naive_now,
post::Post, post::Post,
site::*, site::*,
views::user_view::UserViewSafe, views::{
community_follower_view::CommunityFollowerView,
community_moderator_view::CommunityModeratorView,
community_view::{CommunityQueryBuilder, CommunityView},
user_view::UserViewSafe,
},
Bannable, Bannable,
Crud, Crud,
Followable, Followable,
@ -95,7 +99,7 @@ impl Perform for GetCommunity {
.unwrap_or(1); .unwrap_or(1);
let res = GetCommunityResponse { let res = GetCommunityResponse {
community: community_view, community_view,
moderators, moderators,
online, online,
}; };
@ -202,9 +206,7 @@ impl Perform for CreateCommunity {
}) })
.await??; .await??;
Ok(CommunityResponse { Ok(CommunityResponse { community_view })
community: community_view,
})
} }
} }
@ -227,7 +229,7 @@ impl Perform for EditCommunity {
let edit_id = data.edit_id; let edit_id = data.edit_id;
let mods: Vec<i32> = blocking(context.pool(), move |conn| { let mods: Vec<i32> = blocking(context.pool(), move |conn| {
CommunityModeratorView::for_community(conn, edit_id) CommunityModeratorView::for_community(conn, edit_id)
.map(|v| v.into_iter().map(|m| m.user_id).collect()) .map(|v| v.into_iter().map(|m| m.moderator.id).collect())
}) })
.await??; .await??;
if !mods.contains(&user.id) { if !mods.contains(&user.id) {
@ -284,9 +286,7 @@ impl Perform for EditCommunity {
}) })
.await??; .await??;
let res = CommunityResponse { let res = CommunityResponse { community_view };
community: community_view,
};
send_community_websocket(&res, context, websocket_id, UserOperation::EditCommunity); send_community_websocket(&res, context, websocket_id, UserOperation::EditCommunity);
@ -340,9 +340,7 @@ impl Perform for DeleteCommunity {
}) })
.await??; .await??;
let res = CommunityResponse { let res = CommunityResponse { community_view };
community: community_view,
};
send_community_websocket(&res, context, websocket_id, UserOperation::DeleteCommunity); send_community_websocket(&res, context, websocket_id, UserOperation::DeleteCommunity);
@ -408,9 +406,7 @@ impl Perform for RemoveCommunity {
}) })
.await??; .await??;
let res = CommunityResponse { let res = CommunityResponse { community_view };
community: community_view,
};
send_community_websocket(&res, context, websocket_id, UserOperation::RemoveCommunity); send_community_websocket(&res, context, websocket_id, UserOperation::RemoveCommunity);
@ -445,9 +441,8 @@ impl Perform for ListCommunities {
let page = data.page; let page = data.page;
let limit = data.limit; let limit = data.limit;
let communities = blocking(context.pool(), move |conn| { let communities = blocking(context.pool(), move |conn| {
CommunityQueryBuilder::create(conn) CommunityQueryBuilder::create(conn, user_id)
.sort(&sort) .sort(&sort)
.for_user(user_id)
.show_nsfw(show_nsfw) .show_nsfw(show_nsfw)
.page(page) .page(page)
.limit(limit) .limit(limit)
@ -519,12 +514,10 @@ impl Perform for FollowCommunity {
// For now, just assume that remote follows are accepted. // For now, just assume that remote follows are accepted.
// Otherwise, the subscribed will be null // Otherwise, the subscribed will be null
if !community.local { if !community.local {
community_view.subscribed = Some(data.follow); community_view.subscribed = data.follow;
} }
Ok(CommunityResponse { Ok(CommunityResponse { community_view })
community: community_view,
})
} }
} }
@ -645,7 +638,7 @@ impl Perform for BanFromCommunity {
.await??; .await??;
let res = BanFromCommunityResponse { let res = BanFromCommunityResponse {
user: user_view, user_view,
banned: data.ban, banned: data.ban,
}; };
@ -779,7 +772,7 @@ impl Perform for TransferCommunity {
.await??; .await??;
let creator_index = community_mods let creator_index = community_mods
.iter() .iter()
.position(|r| r.user_id == data.user_id) .position(|r| r.moderator.id == data.user_id)
.context(location_info!())?; .context(location_info!())?;
let creator_user = community_mods.remove(creator_index); let creator_user = community_mods.remove(creator_index);
community_mods.insert(0, creator_user); community_mods.insert(0, creator_user);
@ -793,8 +786,8 @@ impl Perform for TransferCommunity {
// TODO: this should probably be a bulk operation // TODO: this should probably be a bulk operation
for cmod in &community_mods { for cmod in &community_mods {
let community_moderator_form = CommunityModeratorForm { let community_moderator_form = CommunityModeratorForm {
community_id: cmod.community_id, community_id: cmod.community.id,
user_id: cmod.user_id, user_id: cmod.moderator.id,
}; };
let join = move |conn: &'_ _| CommunityModerator::join(conn, &community_moderator_form); let join = move |conn: &'_ _| CommunityModerator::join(conn, &community_moderator_form);
@ -838,7 +831,7 @@ impl Perform for TransferCommunity {
// Return the jwt // Return the jwt
Ok(GetCommunityResponse { Ok(GetCommunityResponse {
community: community_view, community_view,
moderators, moderators,
online: 0, online: 0,
}) })
@ -851,15 +844,16 @@ fn send_community_websocket(
websocket_id: Option<ConnectionId>, websocket_id: Option<ConnectionId>,
op: UserOperation, op: UserOperation,
) { ) {
// TODO is there any way around this?
// Strip out the user id and subscribed when sending to others // Strip out the user id and subscribed when sending to others
let mut res_sent = res.clone(); // let mut res_sent = res.clone();
res_sent.community.user_id = None; // res_sent.community_view.user_id = None;
res_sent.community.subscribed = None; // res_sent.community.subscribed = None;
context.chat_server().do_send(SendCommunityRoomMessage { context.chat_server().do_send(SendCommunityRoomMessage {
op, op,
response: res_sent, response: res.to_owned(),
community_id: res.community.id, community_id: res.community_view.community.id,
websocket_id, websocket_id,
}); });
} }

View file

@ -2,9 +2,9 @@ use crate::claims::Claims;
use actix_web::{web, web::Data}; use actix_web::{web, web::Data};
use lemmy_db::{ use lemmy_db::{
community::{Community, CommunityModerator}, community::{Community, CommunityModerator},
community_view::CommunityUserBanView,
post::Post, post::Post,
user::User_, user::User_,
views::community_user_ban_view::CommunityUserBanView,
Crud, Crud,
DbPool, DbPool,
}; };

View file

@ -11,13 +11,16 @@ use actix_web::web::Data;
use lemmy_apub::{ApubLikeableType, ApubObjectType}; use lemmy_apub::{ApubLikeableType, ApubObjectType};
use lemmy_db::{ use lemmy_db::{
comment_view::*, comment_view::*,
community_view::*,
moderator::*, moderator::*,
naive_now, naive_now,
post::*, post::*,
post_report::*, post_report::*,
post_view::*, post_view::*,
views::site_view::SiteView, views::{
community_moderator_view::CommunityModeratorView,
community_view::CommunityView,
site_view::SiteView,
},
Crud, Crud,
Likeable, Likeable,
ListingType, ListingType,

View file

@ -13,7 +13,6 @@ use lemmy_db::{
aggregates::site_aggregates::SiteAggregates, aggregates::site_aggregates::SiteAggregates,
category::*, category::*,
comment_view::*, comment_view::*,
community_view::*,
diesel_option_overwrite, diesel_option_overwrite,
moderator::*, moderator::*,
moderator_views::*, moderator_views::*,
@ -21,6 +20,7 @@ use lemmy_db::{
post_view::*, post_view::*,
site::*, site::*,
views::{ views::{
community_view::CommunityQueryBuilder,
site_view::SiteView, site_view::SiteView,
user_view::{UserQueryBuilder, UserViewSafe}, user_view::{UserQueryBuilder, UserViewSafe},
}, },
@ -392,7 +392,7 @@ impl Perform for Search {
} }
SearchType::Communities => { SearchType::Communities => {
communities = blocking(context.pool(), move |conn| { communities = blocking(context.pool(), move |conn| {
CommunityQueryBuilder::create(conn) CommunityQueryBuilder::create(conn, None)
.sort(&sort) .sort(&sort)
.search_term(q) .search_term(q)
.page(page) .page(page)
@ -445,7 +445,7 @@ impl Perform for Search {
let sort = SortType::from_str(&data.sort)?; let sort = SortType::from_str(&data.sort)?;
communities = blocking(context.pool(), move |conn| { communities = blocking(context.pool(), move |conn| {
CommunityQueryBuilder::create(conn) CommunityQueryBuilder::create(conn, None)
.sort(&sort) .sort(&sort)
.search_term(q) .search_term(q)
.page(page) .page(page)

View file

@ -19,7 +19,6 @@ use lemmy_db::{
comment_report::CommentReportView, comment_report::CommentReportView,
comment_view::*, comment_view::*,
community::*, community::*,
community_view::*,
diesel_option_overwrite, diesel_option_overwrite,
moderator::*, moderator::*,
naive_now, naive_now,
@ -34,6 +33,8 @@ use lemmy_db::{
user_mention::*, user_mention::*,
user_mention_view::*, user_mention_view::*,
views::{ views::{
community_follower_view::CommunityFollowerView,
community_moderator_view::CommunityModeratorView,
site_view::SiteView, site_view::SiteView,
user_view::{UserViewDangerous, UserViewSafe}, user_view::{UserViewDangerous, UserViewSafe},
}, },

View file

@ -4,7 +4,7 @@ use activitystreams::{
base::{AnyBase, ExtendsExt}, base::{AnyBase, ExtendsExt},
}; };
use anyhow::Context; use anyhow::Context;
use lemmy_db::{community::Community, community_view::CommunityView}; use lemmy_db::{community::Community, views::community_view::CommunityView};
use lemmy_structs::{blocking, community::CommunityResponse}; use lemmy_structs::{blocking, community::CommunityResponse};
use lemmy_utils::{location_info, LemmyError}; use lemmy_utils::{location_info, LemmyError};
use lemmy_websocket::{messages::SendCommunityRoomMessage, LemmyContext, UserOperation}; use lemmy_websocket::{messages::SendCommunityRoomMessage, LemmyContext, UserOperation};
@ -21,13 +21,13 @@ pub(crate) async fn receive_delete_community(
let community_id = deleted_community.id; let community_id = deleted_community.id;
let res = CommunityResponse { let res = CommunityResponse {
community: blocking(context.pool(), move |conn| { community_view: blocking(context.pool(), move |conn| {
CommunityView::read(conn, community_id, None) CommunityView::read(conn, community_id, None)
}) })
.await??, .await??,
}; };
let community_id = res.community.id; let community_id = res.community_view.community.id;
context.chat_server().do_send(SendCommunityRoomMessage { context.chat_server().do_send(SendCommunityRoomMessage {
op: UserOperation::EditCommunity, op: UserOperation::EditCommunity,
response: res, response: res,
@ -64,13 +64,13 @@ pub(crate) async fn receive_remove_community(
let community_id = removed_community.id; let community_id = removed_community.id;
let res = CommunityResponse { let res = CommunityResponse {
community: blocking(context.pool(), move |conn| { community_view: blocking(context.pool(), move |conn| {
CommunityView::read(conn, community_id, None) CommunityView::read(conn, community_id, None)
}) })
.await??, .await??,
}; };
let community_id = res.community.id; let community_id = res.community_view.community.id;
context.chat_server().do_send(SendCommunityRoomMessage { context.chat_server().do_send(SendCommunityRoomMessage {
op: UserOperation::EditCommunity, op: UserOperation::EditCommunity,
response: res, response: res,
@ -100,13 +100,13 @@ pub(crate) async fn receive_undo_delete_community(
let community_id = deleted_community.id; let community_id = deleted_community.id;
let res = CommunityResponse { let res = CommunityResponse {
community: blocking(context.pool(), move |conn| { community_view: blocking(context.pool(), move |conn| {
CommunityView::read(conn, community_id, None) CommunityView::read(conn, community_id, None)
}) })
.await??, .await??,
}; };
let community_id = res.community.id; let community_id = res.community_view.community.id;
context.chat_server().do_send(SendCommunityRoomMessage { context.chat_server().do_send(SendCommunityRoomMessage {
op: UserOperation::EditCommunity, op: UserOperation::EditCommunity,
response: res, response: res,
@ -146,13 +146,13 @@ pub(crate) async fn receive_undo_remove_community(
let community_id = removed_community.id; let community_id = removed_community.id;
let res = CommunityResponse { let res = CommunityResponse {
community: blocking(context.pool(), move |conn| { community_view: blocking(context.pool(), move |conn| {
CommunityView::read(conn, community_id, None) CommunityView::read(conn, community_id, None)
}) })
.await??, .await??,
}; };
let community_id = res.community.id; let community_id = res.community_view.community.id;
context.chat_server().do_send(SendCommunityRoomMessage { context.chat_server().do_send(SendCommunityRoomMessage {
op: UserOperation::EditCommunity, op: UserOperation::EditCommunity,

View file

@ -23,7 +23,11 @@ use activitystreams::{
}; };
use anyhow::Context; use anyhow::Context;
use itertools::Itertools; use itertools::Itertools;
use lemmy_db::{community::Community, community_view::CommunityFollowerView, DbPool}; use lemmy_db::{
community::Community,
views::community_follower_view::CommunityFollowerView,
DbPool,
};
use lemmy_structs::blocking; use lemmy_structs::blocking;
use lemmy_utils::{location_info, settings::Settings, LemmyError}; use lemmy_utils::{location_info, settings::Settings, LemmyError};
use lemmy_websocket::LemmyContext; use lemmy_websocket::LemmyContext;
@ -179,9 +183,9 @@ impl ActorType for Community {
.await??; .await??;
let inboxes = inboxes let inboxes = inboxes
.into_iter() .into_iter()
.filter(|i| !i.user_local) .filter(|i| !i.follower.local)
.map(|u| -> Result<Url, LemmyError> { .map(|u| -> Result<Url, LemmyError> {
let url = Url::parse(&u.user_actor_id)?; let url = Url::parse(&u.follower.actor_id)?;
let domain = url.domain().context(location_info!())?; let domain = url.domain().context(location_info!())?;
let port = if let Some(port) = url.port() { let port = if let Some(port) = url.port() {
format!(":{}", port) format!(":{}", port)

View file

@ -16,12 +16,11 @@ use lemmy_db::{
comment::{Comment, CommentForm}, comment::{Comment, CommentForm},
comment_view::CommentView, comment_view::CommentView,
community::{Community, CommunityForm, CommunityModerator, CommunityModeratorForm}, community::{Community, CommunityForm, CommunityModerator, CommunityModeratorForm},
community_view::CommunityView,
naive_now, naive_now,
post::{Post, PostForm}, post::{Post, PostForm},
post_view::PostView, post_view::PostView,
user::{UserForm, User_}, user::{UserForm, User_},
views::user_view::UserViewSafe, views::{community_view::CommunityView, user_view::UserViewSafe},
Crud, Crud,
Joinable, Joinable,
SearchType, SearchType,

View file

@ -9,7 +9,11 @@ use activitystreams::{
collection::{CollectionExt, OrderedCollection, UnorderedCollection}, collection::{CollectionExt, OrderedCollection, UnorderedCollection},
}; };
use actix_web::{body::Body, web, HttpResponse}; use actix_web::{body::Body, web, HttpResponse};
use lemmy_db::{community::Community, community_view::CommunityFollowerView, post::Post}; use lemmy_db::{
community::Community,
post::Post,
views::community_follower_view::CommunityFollowerView,
};
use lemmy_structs::blocking; use lemmy_structs::blocking;
use lemmy_utils::LemmyError; use lemmy_utils::LemmyError;
use lemmy_websocket::LemmyContext; use lemmy_websocket::LemmyContext;

View file

@ -28,8 +28,8 @@ use actix_web::{web, HttpRequest, HttpResponse};
use anyhow::{anyhow, Context}; use anyhow::{anyhow, Context};
use lemmy_db::{ use lemmy_db::{
community::{Community, CommunityFollower, CommunityFollowerForm}, community::{Community, CommunityFollower, CommunityFollowerForm},
community_view::CommunityUserBanView,
user::User_, user::User_,
views::community_user_ban_view::CommunityUserBanView,
DbPool, DbPool,
Followable, Followable,
}; };

View file

@ -22,8 +22,8 @@ use activitystreams_ext::Ext2;
use anyhow::Context; use anyhow::Context;
use lemmy_db::{ use lemmy_db::{
community::{Community, CommunityForm}, community::{Community, CommunityForm},
community_view::CommunityModeratorView,
naive_now, naive_now,
views::community_moderator_view::CommunityModeratorView,
DbPool, DbPool,
}; };
use lemmy_structs::blocking; use lemmy_structs::blocking;
@ -49,7 +49,10 @@ impl ToApub for Community {
CommunityModeratorView::for_community(&conn, id) CommunityModeratorView::for_community(&conn, id)
}) })
.await??; .await??;
let moderators: Vec<String> = moderators.into_iter().map(|m| m.user_actor_id).collect(); let moderators: Vec<String> = moderators
.into_iter()
.map(|m| m.moderator.actor_id)
.collect();
let mut group = ApObject::new(Group::new()); let mut group = ApObject::new(Group::new());
group group

View file

@ -210,11 +210,11 @@ impl Community {
} }
fn community_mods_and_admins(conn: &PgConnection, community_id: i32) -> Result<Vec<i32>, Error> { fn community_mods_and_admins(conn: &PgConnection, community_id: i32) -> Result<Vec<i32>, Error> {
use crate::{community_view::CommunityModeratorView, views::user_view::UserViewSafe}; use crate::views::{community_moderator_view::CommunityModeratorView, user_view::UserViewSafe};
let mut mods_and_admins: Vec<i32> = Vec::new(); let mut mods_and_admins: Vec<i32> = Vec::new();
mods_and_admins.append( mods_and_admins.append(
&mut CommunityModeratorView::for_community(conn, community_id) &mut CommunityModeratorView::for_community(conn, community_id)
.map(|v| v.into_iter().map(|m| m.user_id).collect())?, .map(|v| v.into_iter().map(|m| m.moderator.id).collect())?,
); );
mods_and_admins mods_and_admins
.append(&mut UserViewSafe::admins(conn).map(|v| v.into_iter().map(|a| a.user.id).collect())?); .append(&mut UserViewSafe::admins(conn).map(|v| v.into_iter().map(|a| a.user.id).collect())?);

View file

@ -1,398 +0,0 @@
use super::community_view::community_fast_view::BoxedQuery;
use crate::{fuzzy_search, limit_and_offset, MaybeOptional, SortType};
use diesel::{pg::Pg, result::Error, *};
use serde::{Deserialize, Serialize};
table! {
community_view (id) {
id -> Int4,
name -> Varchar,
title -> Varchar,
icon -> Nullable<Text>,
banner -> Nullable<Text>,
description -> Nullable<Text>,
category_id -> Int4,
creator_id -> Int4,
removed -> Bool,
published -> Timestamp,
updated -> Nullable<Timestamp>,
deleted -> Bool,
nsfw -> Bool,
actor_id -> Text,
local -> Bool,
last_refreshed_at -> Timestamp,
creator_actor_id -> Text,
creator_local -> Bool,
creator_name -> Varchar,
creator_preferred_username -> Nullable<Varchar>,
creator_avatar -> Nullable<Text>,
category_name -> Varchar,
number_of_subscribers -> BigInt,
number_of_posts -> BigInt,
number_of_comments -> BigInt,
hot_rank -> Int4,
user_id -> Nullable<Int4>,
subscribed -> Nullable<Bool>,
}
}
table! {
community_fast_view (id) {
id -> Int4,
name -> Varchar,
title -> Varchar,
icon -> Nullable<Text>,
banner -> Nullable<Text>,
description -> Nullable<Text>,
category_id -> Int4,
creator_id -> Int4,
removed -> Bool,
published -> Timestamp,
updated -> Nullable<Timestamp>,
deleted -> Bool,
nsfw -> Bool,
actor_id -> Text,
local -> Bool,
last_refreshed_at -> Timestamp,
creator_actor_id -> Text,
creator_local -> Bool,
creator_name -> Varchar,
creator_preferred_username -> Nullable<Varchar>,
creator_avatar -> Nullable<Text>,
category_name -> Varchar,
number_of_subscribers -> BigInt,
number_of_posts -> BigInt,
number_of_comments -> BigInt,
hot_rank -> Int4,
user_id -> Nullable<Int4>,
subscribed -> Nullable<Bool>,
}
}
table! {
community_moderator_view (id) {
id -> Int4,
community_id -> Int4,
user_id -> Int4,
published -> Timestamp,
user_actor_id -> Text,
user_local -> Bool,
user_name -> Varchar,
user_preferred_username -> Nullable<Varchar>,
avatar -> Nullable<Text>,
community_actor_id -> Text,
community_local -> Bool,
community_name -> Varchar,
community_icon -> Nullable<Text>,
}
}
table! {
community_follower_view (id) {
id -> Int4,
community_id -> Int4,
user_id -> Int4,
published -> Timestamp,
user_actor_id -> Text,
user_local -> Bool,
user_name -> Varchar,
user_preferred_username -> Nullable<Varchar>,
avatar -> Nullable<Text>,
community_actor_id -> Text,
community_local -> Bool,
community_name -> Varchar,
community_icon -> Nullable<Text>,
}
}
table! {
community_user_ban_view (id) {
id -> Int4,
community_id -> Int4,
user_id -> Int4,
published -> Timestamp,
user_actor_id -> Text,
user_local -> Bool,
user_name -> Varchar,
user_preferred_username -> Nullable<Varchar>,
avatar -> Nullable<Text>,
community_actor_id -> Text,
community_local -> Bool,
community_name -> Varchar,
community_icon -> Nullable<Text>,
}
}
#[derive(Queryable, Identifiable, PartialEq, Debug, Serialize, QueryableByName, Clone)]
#[table_name = "community_fast_view"]
pub struct CommunityView {
pub id: i32,
pub name: String,
pub title: String,
pub icon: Option<String>,
pub banner: Option<String>,
pub description: Option<String>,
pub category_id: i32,
pub creator_id: i32,
pub removed: bool,
pub published: chrono::NaiveDateTime,
pub updated: Option<chrono::NaiveDateTime>,
pub deleted: bool,
pub nsfw: bool,
pub actor_id: String,
pub local: bool,
pub last_refreshed_at: chrono::NaiveDateTime,
pub creator_actor_id: String,
pub creator_local: bool,
pub creator_name: String,
pub creator_preferred_username: Option<String>,
pub creator_avatar: Option<String>,
pub category_name: String,
pub number_of_subscribers: i64,
pub number_of_posts: i64,
pub number_of_comments: i64,
pub hot_rank: i32,
pub user_id: Option<i32>,
pub subscribed: Option<bool>,
}
pub struct CommunityQueryBuilder<'a> {
conn: &'a PgConnection,
query: BoxedQuery<'a, Pg>,
sort: &'a SortType,
from_user_id: Option<i32>,
show_nsfw: bool,
search_term: Option<String>,
page: Option<i64>,
limit: Option<i64>,
}
impl<'a> CommunityQueryBuilder<'a> {
pub fn create(conn: &'a PgConnection) -> Self {
use super::community_view::community_fast_view::dsl::*;
let query = community_fast_view.into_boxed();
CommunityQueryBuilder {
conn,
query,
sort: &SortType::Hot,
from_user_id: None,
show_nsfw: true,
search_term: None,
page: None,
limit: None,
}
}
pub fn sort(mut self, sort: &'a SortType) -> Self {
self.sort = sort;
self
}
pub fn for_user<T: MaybeOptional<i32>>(mut self, from_user_id: T) -> Self {
self.from_user_id = from_user_id.get_optional();
self
}
pub fn show_nsfw(mut self, show_nsfw: bool) -> Self {
self.show_nsfw = show_nsfw;
self
}
pub fn search_term<T: MaybeOptional<String>>(mut self, search_term: T) -> Self {
self.search_term = search_term.get_optional();
self
}
pub fn page<T: MaybeOptional<i64>>(mut self, page: T) -> Self {
self.page = page.get_optional();
self
}
pub fn limit<T: MaybeOptional<i64>>(mut self, limit: T) -> Self {
self.limit = limit.get_optional();
self
}
pub fn list(self) -> Result<Vec<CommunityView>, Error> {
use super::community_view::community_fast_view::dsl::*;
let mut query = self.query;
if let Some(search_term) = self.search_term {
let searcher = fuzzy_search(&search_term);
query = query
.filter(name.ilike(searcher.to_owned()))
.or_filter(title.ilike(searcher.to_owned()))
.or_filter(description.ilike(searcher));
};
// The view lets you pass a null user_id, if you're not logged in
match self.sort {
SortType::New => query = query.order_by(published.desc()).filter(user_id.is_null()),
SortType::TopAll => match self.from_user_id {
Some(from_user_id) => {
query = query
.filter(user_id.eq(from_user_id))
.order_by((subscribed.asc(), number_of_subscribers.desc()))
}
None => {
query = query
.order_by(number_of_subscribers.desc())
.filter(user_id.is_null())
}
},
// Covers all other sorts, including hot
_ => {
query = query
.order_by(hot_rank.desc())
.then_order_by(number_of_subscribers.desc())
.filter(user_id.is_null())
}
};
if !self.show_nsfw {
query = query.filter(nsfw.eq(false));
};
let (limit, offset) = limit_and_offset(self.page, self.limit);
query
.limit(limit)
.offset(offset)
.filter(removed.eq(false))
.filter(deleted.eq(false))
.load::<CommunityView>(self.conn)
}
}
impl CommunityView {
pub fn read(
conn: &PgConnection,
from_community_id: i32,
from_user_id: Option<i32>,
) -> Result<Self, Error> {
use super::community_view::community_fast_view::dsl::*;
let mut query = community_fast_view.into_boxed();
query = query.filter(id.eq(from_community_id));
// The view lets you pass a null user_id, if you're not logged in
if let Some(from_user_id) = from_user_id {
query = query.filter(user_id.eq(from_user_id));
} else {
query = query.filter(user_id.is_null());
};
query.first::<Self>(conn)
}
}
#[derive(
Queryable, Identifiable, PartialEq, Debug, Serialize, Deserialize, QueryableByName, Clone,
)]
#[table_name = "community_moderator_view"]
pub struct CommunityModeratorView {
pub id: i32,
pub community_id: i32,
pub user_id: i32,
pub published: chrono::NaiveDateTime,
pub user_actor_id: String,
pub user_local: bool,
pub user_name: String,
pub user_preferred_username: Option<String>,
pub avatar: Option<String>,
pub community_actor_id: String,
pub community_local: bool,
pub community_name: String,
pub community_icon: Option<String>,
}
impl CommunityModeratorView {
pub fn for_community(conn: &PgConnection, for_community_id: i32) -> Result<Vec<Self>, Error> {
use super::community_view::community_moderator_view::dsl::*;
community_moderator_view
.filter(community_id.eq(for_community_id))
.order_by(published)
.load::<Self>(conn)
}
pub fn for_user(conn: &PgConnection, for_user_id: i32) -> Result<Vec<Self>, Error> {
use super::community_view::community_moderator_view::dsl::*;
community_moderator_view
.filter(user_id.eq(for_user_id))
.order_by(published)
.load::<Self>(conn)
}
}
#[derive(
Queryable, Identifiable, PartialEq, Debug, Serialize, Deserialize, QueryableByName, Clone,
)]
#[table_name = "community_follower_view"]
pub struct CommunityFollowerView {
pub id: i32,
pub community_id: i32,
pub user_id: i32,
pub published: chrono::NaiveDateTime,
pub user_actor_id: String,
pub user_local: bool,
pub user_name: String,
pub user_preferred_username: Option<String>,
pub avatar: Option<String>,
pub community_actor_id: String,
pub community_local: bool,
pub community_name: String,
pub community_icon: Option<String>,
}
impl CommunityFollowerView {
pub fn for_community(conn: &PgConnection, from_community_id: i32) -> Result<Vec<Self>, Error> {
use super::community_view::community_follower_view::dsl::*;
community_follower_view
.filter(community_id.eq(from_community_id))
.load::<Self>(conn)
}
pub fn for_user(conn: &PgConnection, from_user_id: i32) -> Result<Vec<Self>, Error> {
use super::community_view::community_follower_view::dsl::*;
community_follower_view
.filter(user_id.eq(from_user_id))
.load::<Self>(conn)
}
}
#[derive(
Queryable, Identifiable, PartialEq, Debug, Serialize, Deserialize, QueryableByName, Clone,
)]
#[table_name = "community_user_ban_view"]
pub struct CommunityUserBanView {
pub id: i32,
pub community_id: i32,
pub user_id: i32,
pub published: chrono::NaiveDateTime,
pub user_actor_id: String,
pub user_local: bool,
pub user_name: String,
pub user_preferred_username: Option<String>,
pub avatar: Option<String>,
pub community_actor_id: String,
pub community_local: bool,
pub community_name: String,
pub community_icon: Option<String>,
}
impl CommunityUserBanView {
pub fn get(
conn: &PgConnection,
from_user_id: i32,
from_community_id: i32,
) -> Result<Self, Error> {
use super::community_view::community_user_ban_view::dsl::*;
community_user_ban_view
.filter(user_id.eq(from_user_id))
.filter(community_id.eq(from_community_id))
.first::<Self>(conn)
}
}

View file

@ -18,7 +18,6 @@ pub mod comment;
pub mod comment_report; pub mod comment_report;
pub mod comment_view; pub mod comment_view;
pub mod community; pub mod community;
pub mod community_view;
pub mod moderator; pub mod moderator;
pub mod moderator_views; pub mod moderator_views;
pub mod password_reset_request; pub mod password_reset_request;

View file

@ -1,6 +1,8 @@
use lemmy_db::{ use lemmy_db::views::{
community_view::{CommunityFollowerView, CommunityModeratorView, CommunityView}, community_follower_view::CommunityFollowerView,
views::user_view::UserViewSafe, community_moderator_view::CommunityModeratorView,
community_view::CommunityView,
user_view::UserViewSafe,
}; };
use serde::{Deserialize, Serialize}; use serde::{Deserialize, Serialize};
@ -13,7 +15,7 @@ pub struct GetCommunity {
#[derive(Serialize)] #[derive(Serialize)]
pub struct GetCommunityResponse { pub struct GetCommunityResponse {
pub community: CommunityView, pub community_view: CommunityView,
pub moderators: Vec<CommunityModeratorView>, pub moderators: Vec<CommunityModeratorView>,
pub online: usize, pub online: usize,
} }
@ -32,7 +34,7 @@ pub struct CreateCommunity {
#[derive(Serialize, Clone)] #[derive(Serialize, Clone)]
pub struct CommunityResponse { pub struct CommunityResponse {
pub community: CommunityView, pub community_view: CommunityView,
} }
#[derive(Deserialize, Debug)] #[derive(Deserialize, Debug)]
@ -61,7 +63,7 @@ pub struct BanFromCommunity {
#[derive(Serialize, Clone)] #[derive(Serialize, Clone)]
pub struct BanFromCommunityResponse { pub struct BanFromCommunityResponse {
pub user: UserViewSafe, pub user_view: UserViewSafe,
pub banned: bool, pub banned: bool,
} }

View file

@ -1,8 +1,8 @@
use lemmy_db::{ use lemmy_db::{
comment_view::CommentView, comment_view::CommentView,
community_view::{CommunityModeratorView, CommunityView},
post_report::PostReportView, post_report::PostReportView,
post_view::PostView, post_view::PostView,
views::{community_moderator_view::CommunityModeratorView, community_view::CommunityView},
}; };
use serde::{Deserialize, Serialize}; use serde::{Deserialize, Serialize};

View file

@ -2,11 +2,10 @@ use lemmy_db::{
aggregates::site_aggregates::SiteAggregates, aggregates::site_aggregates::SiteAggregates,
category::*, category::*,
comment_view::*, comment_view::*,
community_view::*,
moderator_views::*, moderator_views::*,
post_view::*, post_view::*,
user::*, user::*,
views::{site_view::SiteView, user_view::UserViewSafe}, views::{community_view::CommunityView, site_view::SiteView, user_view::UserViewSafe},
}; };
use serde::{Deserialize, Serialize}; use serde::{Deserialize, Serialize};

View file

@ -1,10 +1,13 @@
use lemmy_db::{ use lemmy_db::{
comment_view::{CommentView, ReplyView}, comment_view::{CommentView, ReplyView},
community_view::{CommunityFollowerView, CommunityModeratorView},
post_view::PostView, post_view::PostView,
private_message_view::PrivateMessageView, private_message_view::PrivateMessageView,
user_mention_view::UserMentionView, user_mention_view::UserMentionView,
views::user_view::{UserViewDangerous, UserViewSafe}, views::{
community_follower_view::CommunityFollowerView,
community_moderator_view::CommunityModeratorView,
user_view::{UserViewDangerous, UserViewSafe},
},
}; };
use serde::{Deserialize, Serialize}; use serde::{Deserialize, Serialize};