},
traits::{Crud, Readable},
utils::DbPool,
- ListingType,
};
use lemmy_db_views::{comment_view::CommentQuery, structs::LocalUserView};
use lemmy_db_views_actor::structs::{
use regex::Regex;
use reqwest_middleware::ClientWithMiddleware;
use rosetta_i18n::{Language, LanguageId};
-use std::str::FromStr;
use tracing::warn;
use url::{ParseError, Url};
Ok(())
}
-pub fn listing_type_with_site_default(
- listing_type: Option<ListingType>,
- local_site: &LocalSite,
-) -> Result<ListingType, LemmyError> {
- Ok(listing_type.unwrap_or(ListingType::from_str(
- &local_site.default_post_listing_type,
- )?))
-}
-
#[cfg(test)]
mod tests {
use crate::utils::{honeypot_check, password_length_check};
use crate::{
- api::PerformApub,
+ api::{listing_type_with_default, PerformApub},
fetcher::resolve_actor_identifier,
objects::community::ApubCommunity,
};
use lemmy_api_common::{
comment::{GetComments, GetCommentsResponse},
context::LemmyContext,
- utils::{
- check_private_instance,
- get_local_user_view_from_jwt_opt,
- listing_type_with_site_default,
- },
+ utils::{check_private_instance, get_local_user_view_from_jwt_opt},
};
use lemmy_db_schema::{
source::{comment::Comment, community::Community, local_site::LocalSite},
let local_site = LocalSite::read(context.pool()).await?;
check_private_instance(&local_user_view, &local_site)?;
- let community_id = data.community_id;
- let listing_type = listing_type_with_site_default(data.type_, &local_site)?;
-
- let community_actor_id = if let Some(name) = &data.community_name {
+ let community_id = if let Some(name) = &data.community_name {
resolve_actor_identifier::<ApubCommunity, Community>(name, context, &None, true)
.await
.ok()
- .map(|c| c.actor_id.clone())
+ .map(|c| c.id)
} else {
- None
+ data.community_id
};
let sort = data.sort;
let max_depth = data.max_depth;
let limit = data.limit;
let parent_id = data.parent_id;
+ let listing_type = listing_type_with_default(data.type_, &local_site, community_id)?;
+
// If a parent_id is given, fetch the comment to get the path
let parent_path = if let Some(parent_id) = parent_id {
Some(Comment::read(context.pool(), parent_id).await?.path)
.max_depth(max_depth)
.saved_only(saved_only)
.community_id(community_id)
- .community_actor_id(community_actor_id)
.parent_path(parent_path_cloned)
.post_id(post_id)
.local_user(local_user.as_ref())
use crate::{
- api::PerformApub,
+ api::{listing_type_with_default, PerformApub},
fetcher::resolve_actor_identifier,
objects::community::ApubCommunity,
};
use lemmy_api_common::{
context::LemmyContext,
post::{GetPosts, GetPostsResponse},
- utils::{
- check_private_instance,
- get_local_user_view_from_jwt_opt,
- is_mod_or_admin_opt,
- listing_type_with_site_default,
- },
+ utils::{check_private_instance, get_local_user_view_from_jwt_opt, is_mod_or_admin_opt},
};
use lemmy_db_schema::source::{community::Community, local_site::LocalSite};
use lemmy_db_views::post_view::PostQuery;
check_private_instance(&local_user_view, &local_site)?;
let sort = data.sort;
- let listing_type = listing_type_with_site_default(data.type_, &local_site)?;
let page = data.page;
let limit = data.limit;
- let community_id = data.community_id;
- let community_actor_id = if let Some(name) = &data.community_name {
+ let community_id = if let Some(name) = &data.community_name {
resolve_actor_identifier::<ApubCommunity, Community>(name, context, &None, true)
.await
.ok()
- .map(|c| c.actor_id.clone())
+ .map(|c| c.id)
} else {
- None
+ data.community_id
};
let saved_only = data.saved_only;
+ let listing_type = listing_type_with_default(data.type_, &local_site, community_id)?;
+
let is_mod_or_admin =
is_mod_or_admin_opt(context.pool(), local_user_view.as_ref(), community_id)
.await
.listing_type(Some(listing_type))
.sort(sort)
.community_id(community_id)
- .community_actor_id(community_actor_id)
.saved_only(saved_only)
.page(page)
.limit(limit)
use activitypub_federation::config::Data;
use lemmy_api_common::context::LemmyContext;
+use lemmy_db_schema::{newtypes::CommunityId, source::local_site::LocalSite, ListingType};
use lemmy_utils::{error::LemmyError, ConnectionId};
+use std::str::FromStr;
mod list_comments;
mod list_posts;
websocket_id: Option<ConnectionId>,
) -> Result<Self::Response, LemmyError>;
}
+
+/// Returns default listing type, depending if the query is for frontpage or community.
+fn listing_type_with_default(
+ type_: Option<ListingType>,
+ local_site: &LocalSite,
+ community_id: Option<CommunityId>,
+) -> Result<ListingType, LemmyError> {
+ // On frontpage use listing type from param or admin configured default
+ let listing_type = if community_id.is_none() {
+ type_.unwrap_or(ListingType::from_str(
+ &local_site.default_post_listing_type,
+ )?)
+ } else {
+ // inside of community show everything
+ ListingType::All
+ };
+ Ok(listing_type)
+}
let sort = data.sort;
let listing_type = data.listing_type;
let search_type = data.type_.unwrap_or(SearchType::All);
- let community_id = data.community_id;
- let community_actor_id = if let Some(name) = &data.community_name {
+ let community_id = if let Some(name) = &data.community_name {
resolve_actor_identifier::<ApubCommunity, Community>(name, context, &local_user_view, false)
.await
.ok()
- .map(|c| c.actor_id.clone())
+ .map(|c| c.id)
} else {
- None
+ data.community_id
};
let creator_id = data.creator_id;
let local_user = local_user_view.map(|l| l.local_user);
.sort(sort)
.listing_type(listing_type)
.community_id(community_id)
- .community_actor_id(community_actor_id)
.creator_id(creator_id)
.local_user(local_user.as_ref())
.search_term(Some(q))
.listing_type(listing_type)
.search_term(Some(q))
.community_id(community_id)
- .community_actor_id(community_actor_id)
.creator_id(creator_id)
.local_user(local_user.as_ref())
.page(page)
// If the community or creator is included, dont search communities or users
let community_or_creator_included =
data.community_id.is_some() || data.community_name.is_some() || data.creator_id.is_some();
- let community_actor_id_2 = community_actor_id.clone();
let local_user_ = local_user.clone();
posts = PostQuery::builder()
.sort(sort)
.listing_type(listing_type)
.community_id(community_id)
- .community_actor_id(community_actor_id_2)
.creator_id(creator_id)
.local_user(local_user_.as_ref())
.search_term(Some(q))
.await?;
let q = data.q.clone();
- let community_actor_id = community_actor_id.clone();
let local_user_ = local_user.clone();
comments = CommentQuery::builder()
.listing_type(listing_type)
.search_term(Some(q))
.community_id(community_id)
- .community_actor_id(community_actor_id)
.creator_id(creator_id)
.local_user(local_user_.as_ref())
.page(page)
.sort(sort)
.listing_type(listing_type)
.community_id(community_id)
- .community_actor_id(community_actor_id)
.creator_id(creator_id)
.url_search(Some(q))
.is_mod_or_admin(is_admin)
use diesel_ltree::{nlevel, subpath, Ltree, LtreeExtensions};
use lemmy_db_schema::{
aggregates::structs::CommentAggregates,
- newtypes::{CommentId, CommunityId, DbUrl, LocalUserId, PersonId, PostId},
+ newtypes::{CommentId, CommunityId, LocalUserId, PersonId, PostId},
schema::{
comment,
comment_aggregates,
listing_type: Option<ListingType>,
sort: Option<CommentSortType>,
community_id: Option<CommunityId>,
- community_actor_id: Option<DbUrl>,
post_id: Option<PostId>,
parent_path: Option<Ltree>,
creator_id: Option<PersonId>,
query = query.filter(post::community_id.eq(community_id));
}
- if let Some(community_actor_id) = self.community_actor_id {
- query = query.filter(community::actor_id.eq(community_actor_id))
- }
-
if self.saved_only.unwrap_or(false) {
query = query.filter(comment_saved::comment_id.is_not_null());
}
use diesel_async::RunQueryDsl;
use lemmy_db_schema::{
aggregates::structs::PostAggregates,
- newtypes::{CommunityId, DbUrl, LocalUserId, PersonId, PostId},
+ newtypes::{CommunityId, LocalUserId, PersonId, PostId},
schema::{
community,
community_block,
sort: Option<SortType>,
creator_id: Option<PersonId>,
community_id: Option<CommunityId>,
- community_actor_id: Option<DbUrl>,
local_user: Option<&'a LocalUser>,
search_term: Option<String>,
url_search: Option<String>,
}
}
}
- if self.community_id.is_none() && self.community_actor_id.is_none() {
+ if self.community_id.is_none() {
query = query.then_order_by(post_aggregates::featured_local.desc());
} else if let Some(community_id) = self.community_id {
query = query
.filter(post::community_id.eq(community_id))
.then_order_by(post_aggregates::featured_community.desc());
- } else if let Some(community_actor_id) = self.community_actor_id {
- query = query
- .filter(community::actor_id.eq(community_actor_id))
- .then_order_by(post_aggregates::featured_community.desc());
}
if let Some(url_search) = self.url_search {