is_admin,
site::*,
};
-use lemmy_apub::fetcher::search::search_by_apub_id;
+use lemmy_apub::{build_actor_id_from_shortname, fetcher::search::search_by_apub_id, EndpointType};
use lemmy_db_queries::{
from_opt_str_to_opt_enum,
source::site::Site_,
let listing_type: Option<ListingType> = from_opt_str_to_opt_enum(&data.listing_type);
let search_type: SearchType = from_opt_str_to_opt_enum(&data.type_).unwrap_or(SearchType::All);
let community_id = data.community_id;
- let community_name = data.community_name.to_owned();
+ let community_actor_id = data
+ .community_name
+ .as_ref()
+ .map(|t| build_actor_id_from_shortname(EndpointType::Community, t).ok())
+ .unwrap_or(None);
let creator_id = data.creator_id;
match search_type {
SearchType::Posts => {
.show_read_posts(show_read_posts)
.listing_type(listing_type)
.community_id(community_id)
- .community_name(community_name)
+ .community_actor_id(community_actor_id)
.creator_id(creator_id)
.my_person_id(person_id)
.search_term(q)
.search_term(q)
.show_bot_accounts(show_bot_accounts)
.community_id(community_id)
- .community_name(community_name)
+ .community_actor_id(community_actor_id)
.creator_id(creator_id)
.my_person_id(person_id)
.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.to_owned();
posts = blocking(context.pool(), move |conn| {
PostQueryBuilder::create(conn)
.show_read_posts(show_read_posts)
.listing_type(listing_type)
.community_id(community_id)
- .community_name(community_name)
+ .community_actor_id(community_actor_id_2)
.creator_id(creator_id)
.my_person_id(person_id)
.search_term(q)
.await??;
let q = data.q.to_owned();
- let community_name = data.community_name.to_owned();
+ let community_actor_id = community_actor_id.to_owned();
comments = blocking(context.pool(), move |conn| {
CommentQueryBuilder::create(conn)
.search_term(q)
.show_bot_accounts(show_bot_accounts)
.community_id(community_id)
- .community_name(community_name)
+ .community_actor_id(community_actor_id)
.creator_id(creator_id)
.my_person_id(person_id)
.page(page)
.listing_type(listing_type)
.my_person_id(person_id)
.community_id(community_id)
- .community_name(community_name)
+ .community_actor_id(community_actor_id)
.creator_id(creator_id)
.url_search(q)
.page(page)
#[derive(Deserialize)]
pub struct GetCommunity {
pub id: Option<CommunityId>,
+ /// Example: star_trek , or star_trek@xyz.tld
pub name: Option<String>,
pub auth: Option<String>,
}
#[derive(Deserialize)]
pub struct GetPersonDetails {
pub person_id: Option<PersonId>, // One of these two are required
+ /// Example: dessalines , or dessalines@xyz.tld
pub username: Option<String>,
pub sort: Option<String>,
pub page: Option<i64>,
use crate::PerformCrud;
use actix_web::web::Data;
use lemmy_api_common::{blocking, comment::*, get_local_user_view_from_jwt_opt};
+use lemmy_apub::{build_actor_id_from_shortname, EndpointType};
use lemmy_db_queries::{from_opt_str_to_opt_enum, ListingType, SortType};
use lemmy_db_views::comment_view::CommentQueryBuilder;
use lemmy_utils::{ApiError, ConnectionId, LemmyError};
let listing_type: Option<ListingType> = from_opt_str_to_opt_enum(&data.type_);
let community_id = data.community_id;
- let community_name = data.community_name.to_owned();
+ let community_actor_id = data
+ .community_name
+ .as_ref()
+ .map(|t| build_actor_id_from_shortname(EndpointType::Community, t).ok())
+ .unwrap_or(None);
let saved_only = data.saved_only;
let page = data.page;
let limit = data.limit;
.sort(sort)
.saved_only(saved_only)
.community_id(community_id)
- .community_name(community_name)
+ .community_actor_id(community_actor_id)
.my_person_id(person_id)
.show_bot_accounts(show_bot_accounts)
.page(page)
use crate::PerformCrud;
use actix_web::web::Data;
use lemmy_api_common::{blocking, community::*, get_local_user_view_from_jwt_opt};
-use lemmy_db_queries::{
- from_opt_str_to_opt_enum,
- source::community::Community_,
- ListingType,
- SortType,
-};
+use lemmy_apub::{build_actor_id_from_shortname, EndpointType};
+use lemmy_db_queries::{from_opt_str_to_opt_enum, ApubObject, ListingType, SortType};
use lemmy_db_schema::source::community::*;
use lemmy_db_views_actor::{
community_moderator_view::CommunityModeratorView,
Some(id) => id,
None => {
let name = data.name.to_owned().unwrap_or_else(|| "main".to_string());
+ let community_actor_id = build_actor_id_from_shortname(EndpointType::Community, &name)?;
+
blocking(context.pool(), move |conn| {
- Community::read_from_name(conn, &name)
+ Community::read_from_apub_id(conn, &community_actor_id)
})
.await?
.map_err(|_| ApiError::err("couldnt_find_community"))?
use crate::PerformCrud;
use actix_web::web::Data;
use lemmy_api_common::{blocking, get_local_user_view_from_jwt_opt, mark_post_as_read, post::*};
+use lemmy_apub::{build_actor_id_from_shortname, EndpointType};
use lemmy_db_queries::{from_opt_str_to_opt_enum, ListingType, SortType};
use lemmy_db_views::{
comment_view::CommentQueryBuilder,
let page = data.page;
let limit = data.limit;
let community_id = data.community_id;
- let community_name = data.community_name.to_owned();
+ let community_actor_id = data
+ .community_name
+ .as_ref()
+ .map(|t| build_actor_id_from_shortname(EndpointType::Community, t).ok())
+ .unwrap_or(None);
let saved_only = data.saved_only;
let posts = blocking(context.pool(), move |conn| {
.show_bot_accounts(show_bot_accounts)
.show_read_posts(show_read_posts)
.community_id(community_id)
- .community_name(community_name)
+ .community_actor_id(community_actor_id)
.saved_only(saved_only)
.my_person_id(person_id)
.page(page)
use crate::PerformCrud;
use actix_web::web::Data;
use lemmy_api_common::{blocking, get_local_user_view_from_jwt_opt, person::*};
-use lemmy_db_queries::{from_opt_str_to_opt_enum, source::person::Person_, SortType};
+use lemmy_apub::{build_actor_id_from_shortname, EndpointType};
+use lemmy_db_queries::{from_opt_str_to_opt_enum, ApubObject, SortType};
use lemmy_db_schema::source::person::*;
use lemmy_db_views::{comment_view::CommentQueryBuilder, post_view::PostQueryBuilder};
use lemmy_db_views_actor::{
let sort: Option<SortType> = from_opt_str_to_opt_enum(&data.sort);
- let username = data
- .username
- .to_owned()
- .unwrap_or_else(|| "admin".to_string());
let person_details_id = match data.person_id {
Some(id) => id,
None => {
+ let name = data
+ .username
+ .to_owned()
+ .unwrap_or_else(|| "admin".to_string());
+ let actor_id = build_actor_id_from_shortname(EndpointType::Person, &name)?;
+
let person = blocking(context.pool(), move |conn| {
- Person::find_by_name(conn, &username)
+ Person::read_from_apub_id(conn, &actor_id)
})
.await?;
person
PrivateMessage,
}
-/// Generates the ActivityPub ID for a given object type and ID.
-pub fn generate_apub_endpoint(
+/// Generates an apub endpoint for a given domain, IE xyz.tld
+pub fn generate_apub_endpoint_for_domain(
endpoint_type: EndpointType,
name: &str,
+ domain: &str,
) -> Result<DbUrl, ParseError> {
let point = match endpoint_type {
EndpointType::Community => "c",
EndpointType::PrivateMessage => "private_message",
};
- Ok(
- Url::parse(&format!(
- "{}/{}/{}",
- Settings::get().get_protocol_and_hostname(),
- point,
- name
- ))?
- .into(),
+ Ok(Url::parse(&format!("{}/{}/{}", domain, point, name))?.into())
+}
+
+/// Generates the ActivityPub ID for a given object type and ID.
+pub fn generate_apub_endpoint(
+ endpoint_type: EndpointType,
+ name: &str,
+) -> Result<DbUrl, ParseError> {
+ generate_apub_endpoint_for_domain(
+ endpoint_type,
+ name,
+ &Settings::get().get_protocol_and_hostname(),
)
}
Ok(Url::parse(&format!("{}/moderators", community_id))?.into())
}
+/// Takes in a shortname of the type dessalines@xyz.tld or dessalines (assumed to be local), and outputs the actor id.
+/// Used in the API for communities and users.
+pub fn build_actor_id_from_shortname(
+ endpoint_type: EndpointType,
+ short_name: &str,
+) -> Result<DbUrl, ParseError> {
+ let split = short_name.split('@').collect::<Vec<&str>>();
+
+ let name = split[0];
+
+ // If there's no @, its local
+ let domain = if split.len() == 1 {
+ Settings::get().get_protocol_and_hostname()
+ } else {
+ format!("https://{}", split[1])
+ };
+
+ generate_apub_endpoint_for_domain(endpoint_type, name, &domain)
+}
+
/// Store a sent or received activity in the database, for logging purposes. These records are not
/// persistent.
pub async fn insert_activity<T>(
},
CommentId,
CommunityId,
+ DbUrl,
PersonId,
PostId,
};
listing_type: Option<ListingType>,
sort: Option<SortType>,
community_id: Option<CommunityId>,
- community_name: Option<String>,
+ community_actor_id: Option<DbUrl>,
post_id: Option<PostId>,
creator_id: Option<PersonId>,
recipient_id: Option<PersonId>,
listing_type: None,
sort: None,
community_id: None,
- community_name: None,
+ community_actor_id: None,
post_id: None,
creator_id: None,
recipient_id: None,
self
}
- pub fn community_name<T: MaybeOptional<String>>(mut self, community_name: T) -> Self {
- self.community_name = community_name.get_optional();
+ pub fn community_actor_id<T: MaybeOptional<DbUrl>>(mut self, community_actor_id: T) -> Self {
+ self.community_actor_id = community_actor_id.get_optional();
self
}
query = query.filter(post::community_id.eq(community_id));
}
- if let Some(community_name) = self.community_name {
- query = query
- .filter(community::name.eq(community_name))
- .filter(comment::local.eq(true));
+ if let Some(community_actor_id) = self.community_actor_id {
+ query = query.filter(community::actor_id.eq(community_actor_id))
}
if let Some(post_id) = self.post_id {
post::{Post, PostRead, PostSaved},
},
CommunityId,
+ DbUrl,
PersonId,
PostId,
};
sort: Option<SortType>,
creator_id: Option<PersonId>,
community_id: Option<CommunityId>,
- community_name: Option<String>,
+ community_actor_id: Option<DbUrl>,
my_person_id: Option<PersonId>,
search_term: Option<String>,
url_search: Option<String>,
sort: None,
creator_id: None,
community_id: None,
- community_name: None,
+ community_actor_id: None,
my_person_id: None,
search_term: None,
url_search: None,
self
}
- pub fn community_name<T: MaybeOptional<String>>(mut self, community_name: T) -> Self {
- self.community_name = community_name.get_optional();
+ pub fn community_actor_id<T: MaybeOptional<DbUrl>>(mut self, community_actor_id: T) -> Self {
+ self.community_actor_id = community_actor_id.get_optional();
self
}
.then_order_by(post_aggregates::stickied.desc());
}
- if let Some(community_name) = self.community_name {
+ if let Some(community_actor_id) = self.community_actor_id {
query = query
- .filter(community::name.eq(community_name))
- .filter(community::local.eq(true))
+ .filter(community::actor_id.eq(community_actor_id))
.then_order_by(post_aggregates::stickied.desc());
}