]> Untitled Git - lemmy.git/blobdiff - crates/api_crud/src/site/create.rs
Implement instance actor (#1798)
[lemmy.git] / crates / api_crud / src / site / create.rs
index 7fdf4d3c836367e119546442dbe8bce19f8fe779..d714afea7d859b7db457be8e91962876b305ece7 100644 (file)
@@ -7,26 +7,31 @@ use lemmy_api_common::{
   site::*,
   site_description_length_check,
 };
-use lemmy_db_queries::{
+use lemmy_apub::generate_site_inbox_url;
+use lemmy_db_schema::{
   diesel_option_overwrite,
   diesel_option_overwrite_to_url,
-  source::site::Site_,
-  Crud,
+  naive_now,
+  newtypes::DbUrl,
+  source::site::{Site, SiteForm},
+  traits::Crud,
 };
-use lemmy_db_schema::source::site::{Site, *};
 use lemmy_db_views::site_view::SiteView;
 use lemmy_utils::{
+  apub::generate_actor_keypair,
+  settings::structs::Settings,
   utils::{check_slurs, check_slurs_opt},
-  ApiError,
   ConnectionId,
   LemmyError,
 };
 use lemmy_websocket::LemmyContext;
+use url::Url;
 
 #[async_trait::async_trait(?Send)]
 impl PerformCrud for CreateSite {
   type Response = SiteResponse;
 
+  #[tracing::instrument(skip(context, _websocket_id))]
   async fn perform(
     &self,
     context: &Data<LemmyContext>,
@@ -34,9 +39,9 @@ impl PerformCrud for CreateSite {
   ) -> Result<SiteResponse, LemmyError> {
     let data: &CreateSite = self;
 
-    let read_site = move |conn: &'_ _| Site::read_simple(conn);
+    let read_site = Site::read_local_site;
     if blocking(context.pool(), read_site).await?.is_ok() {
-      return Err(ApiError::err_plain("site_already_exists").into());
+      return Err(LemmyError::from_message("site_already_exists"));
     };
 
     let local_user_view =
@@ -57,23 +62,30 @@ impl PerformCrud for CreateSite {
       site_description_length_check(desc)?;
     }
 
+    let actor_id: DbUrl = Url::parse(&Settings::get().get_protocol_and_hostname())?.into();
+    let inbox_url = Some(generate_site_inbox_url(&actor_id)?);
+    let keypair = generate_actor_keypair()?;
     let site_form = SiteForm {
       name: data.name.to_owned(),
       sidebar,
       description,
       icon,
       banner,
-      creator_id: local_user_view.person.id,
       enable_downvotes: data.enable_downvotes,
       open_registration: data.open_registration,
       enable_nsfw: data.enable_nsfw,
-      updated: None,
       community_creation_admin_only: data.community_creation_admin_only,
+      actor_id: Some(actor_id),
+      last_refreshed_at: Some(naive_now()),
+      inbox_url,
+      private_key: Some(Some(keypair.private_key)),
+      public_key: Some(keypair.public_key),
+      ..SiteForm::default()
     };
 
     let create_site = move |conn: &'_ _| Site::create(conn, &site_form);
     if blocking(context.pool(), create_site).await?.is_err() {
-      return Err(ApiError::err_plain("site_already_exists").into());
+      return Err(LemmyError::from_message("site_already_exists"));
     }
 
     let site_view = blocking(context.pool(), SiteView::read).await??;