]> Untitled Git - lemmy.git/commitdiff
Adding shortname fetching for users and communities. Fixes #1662 (#1663)
authorDessalines <dessalines@users.noreply.github.com>
Tue, 20 Jul 2021 04:29:50 +0000 (00:29 -0400)
committerGitHub <noreply@github.com>
Tue, 20 Jul 2021 04:29:50 +0000 (04:29 +0000)
crates/api/src/site.rs
crates/api_common/src/community.rs
crates/api_common/src/person.rs
crates/api_crud/src/comment/read.rs
crates/api_crud/src/community/read.rs
crates/api_crud/src/post/read.rs
crates/api_crud/src/user/read.rs
crates/apub/src/lib.rs
crates/db_views/src/comment_view.rs
crates/db_views/src/post_view.rs

index 53f9bd30510e14837e9a589f5bc40c08568b9896..f9d7962be8d35bcef0622048bda5a4e9fe5a49be 100644 (file)
@@ -10,7 +10,7 @@ use lemmy_api_common::{
   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_,
@@ -167,7 +167,11 @@ impl Perform for Search {
     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 => {
@@ -179,7 +183,7 @@ impl Perform for Search {
             .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)
@@ -197,7 +201,7 @@ impl Perform for Search {
             .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)
@@ -234,6 +238,7 @@ impl Perform for Search {
         // 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)
@@ -243,7 +248,7 @@ impl Perform for Search {
             .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)
@@ -254,7 +259,7 @@ impl Perform for Search {
         .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)
@@ -263,7 +268,7 @@ impl Perform for Search {
             .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)
@@ -316,7 +321,7 @@ impl Perform for Search {
             .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)
index 129b149adfe17c44d2080f95e84efd3b4cf9aa5d..ab4e9d2a1ce5954ab76ff7fb8e38cf9753ffd9b2 100644 (file)
@@ -10,6 +10,7 @@ use serde::{Deserialize, Serialize};
 #[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>,
 }
index 12cc5deeb60efefd458d9564f2982bb80dbc1b77..0b43568d7ec610113e45c616aa10acd76a1cfe15 100644 (file)
@@ -82,6 +82,7 @@ pub struct LoginResponse {
 #[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>,
index 767311d2a64d7fc04efd25971b1c1f8667f2093a..47394402c35eef043690d3eaa31dae58ccce528a 100644 (file)
@@ -1,6 +1,7 @@
 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};
@@ -27,7 +28,11 @@ impl PerformCrud for GetComments {
     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;
@@ -37,7 +42,7 @@ impl PerformCrud for GetComments {
         .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)
index eb11cb39759b6b6b1f333afff14df3185393ca61..0cca08df85a24e716e1ba04c37f8468a7a35f96d 100644 (file)
@@ -1,12 +1,8 @@
 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,
@@ -32,8 +28,10 @@ impl PerformCrud for GetCommunity {
       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"))?
index 4a25b3a8d0442ef6a3973df34f8cde893264ac38..77e7a2163d648e81914b1d006c99e3167e1ac231 100644 (file)
@@ -1,6 +1,7 @@
 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,
@@ -111,7 +112,11 @@ impl PerformCrud for GetPosts {
     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| {
@@ -122,7 +127,7 @@ impl PerformCrud for GetPosts {
         .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)
index f7275ef701af5e0b4b781f00eb48660dcb181b22..ff8db0a7e01a48d0a2f2ccb16c735f46f1831fed 100644 (file)
@@ -1,7 +1,8 @@
 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::{
@@ -34,15 +35,17 @@ impl PerformCrud for GetPersonDetails {
 
     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
index bbc6d515ad68e0204a9c4f78675b15ff0f4a2986..c79d14bd7ada56462773b4620f79310fa9e80fc3 100644 (file)
@@ -279,10 +279,11 @@ pub enum EndpointType {
   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",
@@ -292,14 +293,18 @@ pub fn generate_apub_endpoint(
     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(),
   )
 }
 
@@ -330,6 +335,26 @@ pub fn generate_moderators_url(community_id: &DbUrl) -> Result<DbUrl, LemmyError
   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>(
index fbb2b7f7d8e8b79c0719de0ae9e9c8eee87bc3d8..3449141d0492443a65f54849e2ee0ecd6aaee425 100644 (file)
@@ -32,6 +32,7 @@ use lemmy_db_schema::{
   },
   CommentId,
   CommunityId,
+  DbUrl,
   PersonId,
   PostId,
 };
@@ -175,7 +176,7 @@ pub struct CommentQueryBuilder<'a> {
   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>,
@@ -195,7 +196,7 @@ impl<'a> CommentQueryBuilder<'a> {
       listing_type: None,
       sort: None,
       community_id: None,
-      community_name: None,
+      community_actor_id: None,
       post_id: None,
       creator_id: None,
       recipient_id: None,
@@ -244,8 +245,8 @@ impl<'a> CommentQueryBuilder<'a> {
     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
   }
 
@@ -362,10 +363,8 @@ impl<'a> CommentQueryBuilder<'a> {
       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 {
index d0f46dad33c97dc10065559e248c4462047ba6a5..34847dcde4d20a5cff8ab475faa189d0c3e90d88 100644 (file)
@@ -28,6 +28,7 @@ use lemmy_db_schema::{
     post::{Post, PostRead, PostSaved},
   },
   CommunityId,
+  DbUrl,
   PersonId,
   PostId,
 };
@@ -159,7 +160,7 @@ pub struct PostQueryBuilder<'a> {
   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>,
@@ -179,7 +180,7 @@ impl<'a> PostQueryBuilder<'a> {
       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,
@@ -212,8 +213,8 @@ impl<'a> PostQueryBuilder<'a> {
     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
   }
 
@@ -334,10 +335,9 @@ impl<'a> PostQueryBuilder<'a> {
         .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());
     }