]> Untitled Git - lemmy.git/commitdiff
Merge pull request #2593 from LemmyNet/refactor-notifications
authorNutomic <me@nutomic.com>
Fri, 2 Dec 2022 11:17:10 +0000 (11:17 +0000)
committerGitHub <noreply@github.com>
Fri, 2 Dec 2022 11:17:10 +0000 (11:17 +0000)
Refactor crates for parallel build

188 files changed:
Cargo.lock
Cargo.toml
api_tests/src/community.spec.ts
api_tests/src/follow.spec.ts
crates/api/Cargo.toml
crates/api/src/comment/like.rs
crates/api/src/comment/save.rs
crates/api/src/comment_report/create.rs
crates/api/src/comment_report/list.rs
crates/api/src/comment_report/resolve.rs
crates/api/src/community/add_mod.rs
crates/api/src/community/ban.rs
crates/api/src/community/block.rs
crates/api/src/community/follow.rs
crates/api/src/community/hide.rs
crates/api/src/community/transfer.rs
crates/api/src/lib.rs
crates/api/src/local_user/add_admin.rs
crates/api/src/local_user/ban_person.rs
crates/api/src/local_user/block.rs
crates/api/src/local_user/change_password.rs
crates/api/src/local_user/change_password_after_reset.rs
crates/api/src/local_user/get_captcha.rs
crates/api/src/local_user/list_banned.rs
crates/api/src/local_user/login.rs
crates/api/src/local_user/notifications/list_mentions.rs
crates/api/src/local_user/notifications/list_replies.rs
crates/api/src/local_user/notifications/mark_all_read.rs
crates/api/src/local_user/notifications/mark_mention_read.rs
crates/api/src/local_user/notifications/mark_reply_read.rs
crates/api/src/local_user/notifications/unread_count.rs
crates/api/src/local_user/report_count.rs
crates/api/src/local_user/reset_password.rs
crates/api/src/local_user/save_settings.rs
crates/api/src/local_user/verify_email.rs
crates/api/src/post/get_link_metadata.rs
crates/api/src/post/like.rs
crates/api/src/post/lock.rs
crates/api/src/post/mark_read.rs
crates/api/src/post/save.rs
crates/api/src/post/sticky.rs
crates/api/src/post_report/create.rs
crates/api/src/post_report/list.rs
crates/api/src/post_report/resolve.rs
crates/api/src/private_message/mark_read.rs
crates/api/src/private_message_report/create.rs
crates/api/src/private_message_report/list.rs
crates/api/src/private_message_report/resolve.rs
crates/api/src/site/leave_admin.rs
crates/api/src/site/mod.rs
crates/api/src/site/mod_log.rs
crates/api/src/site/purge/comment.rs
crates/api/src/site/purge/community.rs
crates/api/src/site/purge/person.rs
crates/api/src/site/purge/post.rs
crates/api/src/site/registration_applications/approve.rs
crates/api/src/site/registration_applications/list.rs
crates/api/src/site/registration_applications/unread_count.rs
crates/api/src/websocket.rs
crates/api_common/Cargo.toml
crates/api_common/src/context.rs [new file with mode: 0644]
crates/api_common/src/lib.rs
crates/api_common/src/person.rs
crates/api_common/src/utils.rs
crates/api_common/src/websocket/chat_server.rs [moved from crates/websocket/src/chat_server.rs with 90% similarity]
crates/api_common/src/websocket/handlers.rs [moved from crates/websocket/src/handlers.rs with 99% similarity]
crates/api_common/src/websocket/messages.rs [moved from crates/websocket/src/messages.rs with 97% similarity]
crates/api_common/src/websocket/mod.rs [moved from crates/websocket/src/lib.rs with 58% similarity]
crates/api_common/src/websocket/routes.rs [moved from crates/websocket/src/routes.rs with 97% similarity]
crates/api_common/src/websocket/send.rs [moved from crates/websocket/src/send.rs with 98% similarity]
crates/api_common/src/websocket/structs.rs [moved from crates/api_common/src/websocket.rs with 100% similarity]
crates/api_crud/Cargo.toml
crates/api_crud/src/comment/create.rs
crates/api_crud/src/comment/delete.rs
crates/api_crud/src/comment/mod.rs
crates/api_crud/src/comment/read.rs
crates/api_crud/src/comment/remove.rs
crates/api_crud/src/comment/update.rs
crates/api_crud/src/community/create.rs
crates/api_crud/src/community/delete.rs
crates/api_crud/src/community/list.rs
crates/api_crud/src/community/mod.rs
crates/api_crud/src/community/remove.rs
crates/api_crud/src/community/update.rs
crates/api_crud/src/lib.rs
crates/api_crud/src/post/create.rs
crates/api_crud/src/post/delete.rs
crates/api_crud/src/post/mod.rs
crates/api_crud/src/post/read.rs
crates/api_crud/src/post/remove.rs
crates/api_crud/src/post/update.rs
crates/api_crud/src/private_message/create.rs
crates/api_crud/src/private_message/delete.rs
crates/api_crud/src/private_message/read.rs
crates/api_crud/src/private_message/update.rs
crates/api_crud/src/site/create.rs
crates/api_crud/src/site/read.rs
crates/api_crud/src/site/update.rs
crates/api_crud/src/user/create.rs
crates/api_crud/src/user/delete.rs
crates/api_crud/src/user/mod.rs
crates/apub/Cargo.toml
crates/apub/src/activities/block/block_user.rs
crates/apub/src/activities/block/mod.rs
crates/apub/src/activities/block/undo_block_user.rs
crates/apub/src/activities/community/add_mod.rs
crates/apub/src/activities/community/announce.rs
crates/apub/src/activities/community/mod.rs
crates/apub/src/activities/community/remove_mod.rs
crates/apub/src/activities/community/report.rs
crates/apub/src/activities/community/update.rs
crates/apub/src/activities/create_or_update/comment.rs
crates/apub/src/activities/create_or_update/mod.rs
crates/apub/src/activities/create_or_update/post.rs
crates/apub/src/activities/create_or_update/private_message.rs
crates/apub/src/activities/deletion/delete.rs
crates/apub/src/activities/deletion/delete_user.rs
crates/apub/src/activities/deletion/mod.rs
crates/apub/src/activities/deletion/undo_delete.rs
crates/apub/src/activities/following/accept.rs
crates/apub/src/activities/following/follow.rs
crates/apub/src/activities/following/mod.rs
crates/apub/src/activities/following/undo_follow.rs
crates/apub/src/activities/mod.rs
crates/apub/src/activities/unfederated.rs [new file with mode: 0644]
crates/apub/src/activities/voting/mod.rs
crates/apub/src/activities/voting/undo_vote.rs
crates/apub/src/activities/voting/vote.rs
crates/apub/src/activity_lists.rs
crates/apub/src/api/list_comments.rs [moved from crates/api_crud/src/comment/list.rs with 93% similarity]
crates/apub/src/api/list_posts.rs [moved from crates/api_crud/src/post/list.rs with 93% similarity]
crates/apub/src/api/mod.rs [new file with mode: 0644]
crates/apub/src/api/read_community.rs [moved from crates/api_crud/src/community/read.rs with 91% similarity]
crates/apub/src/api/read_person.rs [moved from crates/api_crud/src/user/read.rs with 95% similarity]
crates/apub/src/api/resolve_object.rs [moved from crates/api/src/site/resolve_object.rs with 93% similarity]
crates/apub/src/api/search.rs [moved from crates/api/src/site/search.rs with 97% similarity]
crates/apub/src/collections/community_moderators.rs
crates/apub/src/collections/community_outbox.rs
crates/apub/src/collections/mod.rs
crates/apub/src/fetcher/deletable_apub_object.rs
crates/apub/src/fetcher/mod.rs
crates/apub/src/fetcher/post_or_comment.rs
crates/apub/src/fetcher/search.rs
crates/apub/src/fetcher/user_or_community.rs
crates/apub/src/fetcher/webfinger.rs
crates/apub/src/http/comment.rs
crates/apub/src/http/community.rs
crates/apub/src/http/mod.rs
crates/apub/src/http/person.rs
crates/apub/src/http/post.rs
crates/apub/src/http/site.rs
crates/apub/src/lib.rs
crates/apub/src/mentions.rs
crates/apub/src/objects/comment.rs
crates/apub/src/objects/community.rs
crates/apub/src/objects/instance.rs
crates/apub/src/objects/mod.rs
crates/apub/src/objects/person.rs
crates/apub/src/objects/post.rs
crates/apub/src/objects/private_message.rs
crates/apub/src/protocol/activities/block/block_user.rs
crates/apub/src/protocol/activities/block/undo_block_user.rs
crates/apub/src/protocol/activities/community/add_mod.rs
crates/apub/src/protocol/activities/community/remove_mod.rs
crates/apub/src/protocol/activities/community/report.rs
crates/apub/src/protocol/activities/community/update.rs
crates/apub/src/protocol/activities/create_or_update/note.rs
crates/apub/src/protocol/activities/create_or_update/page.rs
crates/apub/src/protocol/activities/deletion/delete.rs
crates/apub/src/protocol/activities/deletion/undo_delete.rs
crates/apub/src/protocol/activities/voting/undo_vote.rs
crates/apub/src/protocol/activities/voting/vote.rs
crates/apub/src/protocol/collections/group_followers.rs
crates/apub/src/protocol/mod.rs
crates/apub/src/protocol/objects/group.rs
crates/apub/src/protocol/objects/note.rs
crates/apub/src/protocol/objects/page.rs
crates/db_schema/src/impls/site.rs
crates/routes/Cargo.toml
crates/routes/src/feeds.rs
crates/routes/src/images.rs
crates/routes/src/nodeinfo.rs
crates/routes/src/webfinger.rs
crates/utils/src/lib.rs
crates/websocket/Cargo.toml [deleted file]
src/api_routes.rs
src/code_migrations.rs
src/main.rs

index c083fba9d5bfefcfda08f2d78ee02adb2b934398..5f68a511e5a032b09f7595b332f09c11dc5d46c8 100644 (file)
@@ -2034,7 +2034,6 @@ checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646"
 name = "lemmy_api"
 version = "0.16.5"
 dependencies = [
- "activitypub_federation",
  "actix-web",
  "anyhow",
  "async-trait",
@@ -2044,13 +2043,11 @@ dependencies = [
  "chrono",
  "diesel",
  "lemmy_api_common",
- "lemmy_apub",
  "lemmy_db_schema",
  "lemmy_db_views",
  "lemmy_db_views_actor",
  "lemmy_db_views_moderator",
  "lemmy_utils",
- "lemmy_websocket",
  "serde",
  "serde_json",
  "serial_test",
@@ -2063,8 +2060,12 @@ dependencies = [
 name = "lemmy_api_common"
 version = "0.16.5"
 dependencies = [
+ "actix",
  "actix-rt",
  "actix-web",
+ "actix-web-actors",
+ "anyhow",
+ "background-jobs",
  "chrono",
  "diesel",
  "encoding",
@@ -2073,13 +2074,20 @@ dependencies = [
  "lemmy_db_views_actor",
  "lemmy_db_views_moderator",
  "lemmy_utils",
+ "opentelemetry 0.17.0",
  "percent-encoding",
+ "rand 0.8.5",
  "regex",
  "reqwest",
  "reqwest-middleware",
  "rosetta-i18n",
  "serde",
+ "serde_json",
+ "strum",
+ "strum_macros",
+ "tokio",
  "tracing",
+ "tracing-opentelemetry 0.17.4",
  "url",
  "webpage",
 ]
@@ -2093,12 +2101,10 @@ dependencies = [
  "async-trait",
  "bcrypt",
  "lemmy_api_common",
- "lemmy_apub",
  "lemmy_db_schema",
  "lemmy_db_views",
  "lemmy_db_views_actor",
  "lemmy_utils",
- "lemmy_websocket",
  "serde",
  "serde_json",
  "tracing",
@@ -2131,7 +2137,6 @@ dependencies = [
  "lemmy_db_views",
  "lemmy_db_views_actor",
  "lemmy_utils",
- "lemmy_websocket",
  "once_cell",
  "reqwest",
  "reqwest-middleware",
@@ -2223,12 +2228,10 @@ dependencies = [
  "diesel",
  "futures",
  "lemmy_api_common",
- "lemmy_apub",
  "lemmy_db_schema",
  "lemmy_db_views",
  "lemmy_db_views_actor",
  "lemmy_utils",
- "lemmy_websocket",
  "once_cell",
  "reqwest",
  "reqwest-middleware",
@@ -2260,7 +2263,6 @@ dependencies = [
  "lemmy_db_schema",
  "lemmy_routes",
  "lemmy_utils",
- "lemmy_websocket",
  "opentelemetry 0.17.0",
  "opentelemetry-otlp",
  "parking_lot",
@@ -2269,6 +2271,7 @@ dependencies = [
  "reqwest-retry",
  "reqwest-tracing",
  "serde",
+ "serde_json",
  "tracing",
  "tracing-actix-web",
  "tracing-error",
@@ -2317,34 +2320,6 @@ dependencies = [
  "uuid",
 ]
 
-[[package]]
-name = "lemmy_websocket"
-version = "0.16.5"
-dependencies = [
- "actix",
- "actix-web",
- "actix-web-actors",
- "anyhow",
- "background-jobs",
- "chrono",
- "diesel",
- "lemmy_api_common",
- "lemmy_db_schema",
- "lemmy_db_views",
- "lemmy_db_views_actor",
- "lemmy_utils",
- "opentelemetry 0.17.0",
- "rand 0.8.5",
- "reqwest-middleware",
- "serde",
- "serde_json",
- "strum",
- "strum_macros",
- "tokio",
- "tracing",
- "tracing-opentelemetry 0.17.4",
-]
-
 [[package]]
 name = "lettre"
 version = "0.10.1"
index 67e85b27b36e068e6aa8c6dded291b8ba5e190e7..e83f0c837cabca1ef52b59d760a555c1b6ee9d90 100644 (file)
@@ -45,7 +45,6 @@ members = [
     "crates/db_views",
     "crates/db_views_actor",
     "crates/db_views_actor",
-    "crates/websocket",
     "crates/routes"
 ]
 
@@ -56,7 +55,6 @@ lemmy_apub = { version = "=0.16.5", path = "./crates/apub" }
 lemmy_utils = { version = "=0.16.5", path = "./crates/utils" }
 lemmy_db_schema = { version = "=0.16.5", path = "./crates/db_schema" }
 lemmy_api_common = { version = "=0.16.5", path = "./crates/api_common" }
-lemmy_websocket = { version = "=0.16.5", path = "./crates/websocket" }
 lemmy_routes = { version = "=0.16.5", path = "./crates/routes" }
 lemmy_db_views = { version = "=0.16.5", path = "./crates/db_views" }
 lemmy_db_views_actor = { version = "=0.16.5", path = "./crates/db_views_actor" }
@@ -116,7 +114,6 @@ lemmy_apub = { workspace = true }
 lemmy_utils = { workspace = true }
 lemmy_db_schema = { workspace = true }
 lemmy_api_common = { workspace = true }
-lemmy_websocket = { workspace = true }
 lemmy_routes = { workspace = true }
 activitypub_federation = { workspace = true }
 diesel = { workspace = true }
@@ -138,6 +135,7 @@ clokwerk = { workspace = true }
 doku = { workspace = true }
 parking_lot = { workspace = true }
 reqwest-retry = { workspace = true }
+serde_json = { workspace = true }
 tracing-opentelemetry = { workspace = true, optional = true }
 opentelemetry = { workspace = true, optional = true }
 console-subscriber = { version = "0.1.8", optional = true }
index 0ed50ec484672becec82ff5257c0ac288eaf4965..453ea5660b7a95a0ec73f5a03f052789d7411812 100644 (file)
@@ -187,12 +187,15 @@ test("Admin actions in remote community are not federated to origin", async () =
   let gammaCommunity = (
     await resolveCommunity(gamma, communityRes.community.actor_id)
   ).community.unwrap();
-  let gammaFollow = await followCommunity(
+  await followCommunity(
     gamma,
     true,
     gammaCommunity.community.id
   );
-  expect(gammaFollow.community_view.subscribed).toBe("Subscribed");
+  gammaCommunity = (
+    await resolveCommunity(gamma, communityRes.community.actor_id)
+  ).community.unwrap();
+  expect(gammaCommunity.subscribed).toBe("Subscribed");
   let gammaPost = (await createPost(gamma, gammaCommunity.community.id))
     .post_view;
   expect(gammaPost.post.id).toBeDefined();
index f80b40de858d5e7b7427d68b48984aa3b4f3f648..630e25f2210978f40ab7417f991c393bdb728152 100644 (file)
@@ -20,12 +20,13 @@ afterAll(async () => {
 
 test("Follow federated community", async () => {
   let betaCommunity = (await resolveBetaCommunity(alpha)).community.unwrap();
-  let follow = await followCommunity(alpha, true, betaCommunity.community.id);
+  await followCommunity(alpha, true, betaCommunity.community.id);
+  betaCommunity = (await resolveBetaCommunity(alpha)).community.unwrap();
 
   // Make sure the follow response went through
-  expect(follow.community_view.community.local).toBe(false);
-  expect(follow.community_view.community.name).toBe("main");
-  expect(follow.community_view.subscribed).toBe(SubscribedType.Subscribed);
+  expect(betaCommunity.community.local).toBe(false);
+  expect(betaCommunity.community.name).toBe("main");
+  expect(betaCommunity.subscribed).toBe(SubscribedType.Subscribed);
 
   // Check it from local
   let site = await getSite(alpha);
index b707545b69e739fd0f58e138493bbe4642025a52..f7f1b0bf3a02e70391ddc9c88f0d823123091965 100644 (file)
@@ -14,15 +14,12 @@ path = "src/lib.rs"
 doctest = false
 
 [dependencies]
-lemmy_apub = { workspace = true }
 lemmy_utils = { workspace = true }
 lemmy_db_schema = { workspace = true, features = ["full"] }
 lemmy_db_views = { workspace = true, features = ["full"] }
 lemmy_db_views_moderator = { workspace = true, features = ["full"] }
 lemmy_db_views_actor = { workspace = true, features = ["full"] }
 lemmy_api_common = { workspace = true, features = ["full"] }
-lemmy_websocket = { workspace = true }
-activitypub_federation = { workspace = true }
 diesel = { workspace = true }
 bcrypt = { workspace = true }
 chrono = { workspace = true }
index 6ca87f3cf933c2d94215dc718536f943bd12d391..fba61ed13ee83169b8b679e5c0c5dfc7d6087201 100644 (file)
@@ -2,14 +2,9 @@ use crate::Perform;
 use actix_web::web::Data;
 use lemmy_api_common::{
   comment::{CommentResponse, CreateCommentLike},
+  context::LemmyContext,
   utils::{check_community_ban, check_downvotes_enabled, get_local_user_view_from_jwt},
-};
-use lemmy_apub::{
-  fetcher::post_or_comment::PostOrComment,
-  protocol::activities::voting::{
-    undo_vote::UndoVote,
-    vote::{Vote, VoteType},
-  },
+  websocket::{send::send_comment_ws_message, UserOperation},
 };
 use lemmy_db_schema::{
   newtypes::LocalUserId,
@@ -22,8 +17,6 @@ use lemmy_db_schema::{
 };
 use lemmy_db_views::structs::{CommentView, LocalUserView};
 use lemmy_utils::{error::LemmyError, ConnectionId};
-use lemmy_websocket::{send::send_comment_ws_message, LemmyContext, UserOperation};
-use std::convert::TryInto;
 
 #[async_trait::async_trait(?Send)]
 impl Perform for CreateCommentLike {
@@ -77,33 +70,12 @@ impl Perform for CreateCommentLike {
     CommentLike::remove(context.pool(), person_id, comment_id).await?;
 
     // Only add the like if the score isnt 0
-    let comment = orig_comment.comment;
-    let object = PostOrComment::Comment(Box::new(comment.into()));
     let do_add = like_form.score != 0 && (like_form.score == 1 || like_form.score == -1);
     if do_add {
       let like_form2 = like_form.clone();
       CommentLike::like(context.pool(), &like_form2)
         .await
         .map_err(|e| LemmyError::from_error_message(e, "couldnt_like_comment"))?;
-
-      Vote::send(
-        &object,
-        &local_user_view.person.clone().into(),
-        orig_comment.community.id,
-        like_form.score.try_into()?,
-        context,
-      )
-      .await?;
-    } else {
-      // API doesn't distinguish between Undo/Like and Undo/Dislike
-      UndoVote::send(
-        &object,
-        &local_user_view.person.clone().into(),
-        orig_comment.community.id,
-        VoteType::Like,
-        context,
-      )
-      .await?;
     }
 
     send_comment_ws_message(
index 647f0ed531e4c18bb87be9b0c4bf7c024f332ae2..03051f6cc8afcc068f4e4a7cde13f0df589fdcd2 100644 (file)
@@ -2,6 +2,7 @@ use crate::Perform;
 use actix_web::web::Data;
 use lemmy_api_common::{
   comment::{CommentResponse, SaveComment},
+  context::LemmyContext,
   utils::get_local_user_view_from_jwt,
 };
 use lemmy_db_schema::{
@@ -10,7 +11,6 @@ use lemmy_db_schema::{
 };
 use lemmy_db_views::structs::CommentView;
 use lemmy_utils::{error::LemmyError, ConnectionId};
-use lemmy_websocket::LemmyContext;
 
 #[async_trait::async_trait(?Send)]
 impl Perform for SaveComment {
index 2533aba1c56a106aa08fffcb8afa46509164bbab..bf3fec0a144869df1043afff5f714e3e7f007cab 100644 (file)
@@ -1,11 +1,11 @@
 use crate::{check_report_reason, Perform};
-use activitypub_federation::core::object_id::ObjectId;
 use actix_web::web::Data;
 use lemmy_api_common::{
   comment::{CommentReportResponse, CreateCommentReport},
+  context::LemmyContext,
   utils::{check_community_ban, get_local_user_view_from_jwt},
+  websocket::{messages::SendModRoomMessage, UserOperation},
 };
-use lemmy_apub::protocol::activities::community::report::Report;
 use lemmy_db_schema::{
   source::{
     comment_report::{CommentReport, CommentReportForm},
@@ -15,7 +15,6 @@ use lemmy_db_schema::{
 };
 use lemmy_db_views::structs::{CommentReportView, CommentView};
 use lemmy_utils::{error::LemmyError, ConnectionId};
-use lemmy_websocket::{messages::SendModRoomMessage, LemmyContext, UserOperation};
 
 /// Creates a comment report and notifies the moderators of the community
 #[async_trait::async_trait(?Send)]
@@ -66,15 +65,6 @@ impl Perform for CreateCommentReport {
       websocket_id,
     });
 
-    Report::send(
-      ObjectId::new(comment_view.comment.ap_id),
-      &local_user_view.person.into(),
-      ObjectId::new(comment_view.community.actor_id),
-      reason.to_string(),
-      context,
-    )
-    .await?;
-
     Ok(res)
   }
 }
index 4a9041e99d9e3ccc9d3462fcfe44d813c07e058d..8aa3fcbcd87a02c9013c518b24301d2736be70a1 100644 (file)
@@ -2,11 +2,11 @@ use crate::Perform;
 use actix_web::web::Data;
 use lemmy_api_common::{
   comment::{ListCommentReports, ListCommentReportsResponse},
+  context::LemmyContext,
   utils::get_local_user_view_from_jwt,
 };
 use lemmy_db_views::comment_report_view::CommentReportQuery;
 use lemmy_utils::{error::LemmyError, ConnectionId};
-use lemmy_websocket::LemmyContext;
 
 /// Lists comment reports for a community if an id is supplied
 /// or returns all comment reports for communities a user moderates
index 8055e94843edaffb885a99ca551482acfe7ae6cf..9df11fc23876f2bcc0d2c1cd93c40b76826adfdf 100644 (file)
@@ -2,12 +2,13 @@ use crate::Perform;
 use actix_web::web::Data;
 use lemmy_api_common::{
   comment::{CommentReportResponse, ResolveCommentReport},
+  context::LemmyContext,
   utils::{get_local_user_view_from_jwt, is_mod_or_admin},
+  websocket::{messages::SendModRoomMessage, UserOperation},
 };
 use lemmy_db_schema::{source::comment_report::CommentReport, traits::Reportable};
 use lemmy_db_views::structs::CommentReportView;
 use lemmy_utils::{error::LemmyError, ConnectionId};
-use lemmy_websocket::{messages::SendModRoomMessage, LemmyContext, UserOperation};
 
 /// Resolves or unresolves a comment report and notifies the moderators of the community
 #[async_trait::async_trait(?Send)]
index ff54edda7a10ebf3e507509e4a57b7f5282b43ed..ce3082f7144e796f6d2b7db907e88b70d3d8c742 100644 (file)
@@ -2,23 +2,19 @@ use crate::Perform;
 use actix_web::web::Data;
 use lemmy_api_common::{
   community::{AddModToCommunity, AddModToCommunityResponse},
+  context::LemmyContext,
   utils::{get_local_user_view_from_jwt, is_mod_or_admin},
-};
-use lemmy_apub::{
-  objects::{community::ApubCommunity, person::ApubPerson},
-  protocol::activities::community::{add_mod::AddMod, remove_mod::RemoveMod},
+  websocket::{messages::SendCommunityRoomMessage, UserOperation},
 };
 use lemmy_db_schema::{
   source::{
     community::{Community, CommunityModerator, CommunityModeratorForm},
     moderator::{ModAddCommunity, ModAddCommunityForm},
-    person::Person,
   },
   traits::{Crud, Joinable},
 };
 use lemmy_db_views_actor::structs::CommunityModeratorView;
 use lemmy_utils::{error::LemmyError, ConnectionId};
-use lemmy_websocket::{messages::SendCommunityRoomMessage, LemmyContext, UserOperation};
 
 #[async_trait::async_trait(?Send)]
 impl Perform for AddModToCommunity {
@@ -68,28 +64,6 @@ impl Perform for AddModToCommunity {
 
     ModAddCommunity::create(context.pool(), &form).await?;
 
-    // Send to federated instances
-    let updated_mod_id = data.person_id;
-    let updated_mod: ApubPerson = Person::read(context.pool(), updated_mod_id).await?.into();
-    let community: ApubCommunity = community.into();
-    if data.added {
-      AddMod::send(
-        &community,
-        &updated_mod,
-        &local_user_view.person.into(),
-        context,
-      )
-      .await?;
-    } else {
-      RemoveMod::send(
-        &community,
-        &updated_mod,
-        &local_user_view.person.into(),
-        context,
-      )
-      .await?;
-    }
-
     // Note: in case a remote mod is added, this returns the old moderators list, it will only get
     //       updated once we receive an activity from the community (like `Announce/Add/Moderator`)
     let community_id = data.community_id;
index 7b0897ad8bc66e36cc00d754ffa44cf024610202..fb5e7fcfefce7c5c54bccb78875ddfc6edec316d 100644 (file)
@@ -2,30 +2,24 @@ use crate::Perform;
 use actix_web::web::Data;
 use lemmy_api_common::{
   community::{BanFromCommunity, BanFromCommunityResponse},
+  context::LemmyContext,
   utils::{get_local_user_view_from_jwt, is_mod_or_admin, remove_user_data_in_community},
-};
-use lemmy_apub::{
-  activities::block::SiteOrCommunity,
-  objects::{community::ApubCommunity, person::ApubPerson},
-  protocol::activities::block::{block_user::BlockUser, undo_block_user::UndoBlockUser},
+  websocket::{messages::SendCommunityRoomMessage, UserOperation},
 };
 use lemmy_db_schema::{
   source::{
     community::{
-      Community,
       CommunityFollower,
       CommunityFollowerForm,
       CommunityPersonBan,
       CommunityPersonBanForm,
     },
     moderator::{ModBanFromCommunity, ModBanFromCommunityForm},
-    person::Person,
   },
   traits::{Bannable, Crud, Followable},
 };
 use lemmy_db_views_actor::structs::PersonViewSafe;
 use lemmy_utils::{error::LemmyError, utils::naive_from_unix, ConnectionId};
-use lemmy_websocket::{messages::SendCommunityRoomMessage, LemmyContext, UserOperation};
 
 #[async_trait::async_trait(?Send)]
 impl Perform for BanFromCommunity {
@@ -55,9 +49,6 @@ impl Perform for BanFromCommunity {
       expires: Some(expires),
     };
 
-    let community: ApubCommunity = Community::read(context.pool(), community_id).await?.into();
-    let banned_person: ApubPerson = Person::read(context.pool(), banned_person_id).await?.into();
-
     if data.ban {
       CommunityPersonBan::ban(context.pool(), &community_user_ban_form)
         .await
@@ -73,29 +64,10 @@ impl Perform for BanFromCommunity {
       CommunityFollower::unfollow(context.pool(), &community_follower_form)
         .await
         .ok();
-
-      BlockUser::send(
-        &SiteOrCommunity::Community(community),
-        &banned_person,
-        &local_user_view.person.clone().into(),
-        remove_data,
-        data.reason.clone(),
-        expires,
-        context,
-      )
-      .await?;
     } else {
       CommunityPersonBan::unban(context.pool(), &community_user_ban_form)
         .await
         .map_err(|e| LemmyError::from_error_message(e, "community_user_already_banned"))?;
-      UndoBlockUser::send(
-        &SiteOrCommunity::Community(community),
-        &banned_person,
-        &local_user_view.person.clone().into(),
-        data.reason.clone(),
-        context,
-      )
-      .await?;
     }
 
     // Remove/Restore their data if that's desired
index 840d1766578c7db39f87f8bae78265243930a43b..914b5238e5c1bdb769c32ba4c33583c529c78133 100644 (file)
@@ -2,19 +2,18 @@ use crate::Perform;
 use actix_web::web::Data;
 use lemmy_api_common::{
   community::{BlockCommunity, BlockCommunityResponse},
+  context::LemmyContext,
   utils::get_local_user_view_from_jwt,
 };
-use lemmy_apub::protocol::activities::following::undo_follow::UndoFollow;
 use lemmy_db_schema::{
   source::{
-    community::{Community, CommunityFollower, CommunityFollowerForm},
+    community::{CommunityFollower, CommunityFollowerForm},
     community_block::{CommunityBlock, CommunityBlockForm},
   },
-  traits::{Blockable, Crud, Followable},
+  traits::{Blockable, Followable},
 };
 use lemmy_db_views_actor::structs::CommunityView;
 use lemmy_utils::{error::LemmyError, ConnectionId};
-use lemmy_websocket::LemmyContext;
 
 #[async_trait::async_trait(?Send)]
 impl Perform for BlockCommunity {
@@ -52,8 +51,6 @@ impl Perform for BlockCommunity {
       CommunityFollower::unfollow(context.pool(), &community_follower_form)
         .await
         .ok();
-      let community = Community::read(context.pool(), community_id).await?;
-      UndoFollow::send(&local_user_view.person.into(), &community.into(), context).await?;
     } else {
       CommunityBlock::unblock(context.pool(), &community_block_form)
         .await
index fbabebc2ca3468b4bc6efe8dcaf043954d32e6b9..dedfc97129f8570677702fcd64a0ce1e34edb698 100644 (file)
@@ -2,22 +2,15 @@ use crate::Perform;
 use actix_web::web::Data;
 use lemmy_api_common::{
   community::{CommunityResponse, FollowCommunity},
+  context::LemmyContext,
   utils::{check_community_ban, check_community_deleted_or_removed, get_local_user_view_from_jwt},
 };
-use lemmy_apub::{
-  objects::community::ApubCommunity,
-  protocol::activities::following::{
-    follow::Follow as FollowCommunityApub,
-    undo_follow::UndoFollow,
-  },
-};
 use lemmy_db_schema::{
   source::community::{Community, CommunityFollower, CommunityFollowerForm},
   traits::{Crud, Followable},
 };
 use lemmy_db_views_actor::structs::CommunityView;
 use lemmy_utils::{error::LemmyError, ConnectionId};
-use lemmy_websocket::LemmyContext;
 
 #[async_trait::async_trait(?Send)]
 impl Perform for FollowCommunity {
@@ -34,33 +27,22 @@ impl Perform for FollowCommunity {
       get_local_user_view_from_jwt(&data.auth, context.pool(), context.secret()).await?;
 
     let community_id = data.community_id;
-    let community: ApubCommunity = Community::read(context.pool(), community_id).await?.into();
+    let community = Community::read(context.pool(), community_id).await?;
     let community_follower_form = CommunityFollowerForm {
       community_id: data.community_id,
       person_id: local_user_view.person.id,
       pending: false,
     };
 
-    if community.local {
-      if data.follow {
-        check_community_ban(local_user_view.person.id, community_id, context.pool()).await?;
-        check_community_deleted_or_removed(community_id, context.pool()).await?;
+    if community.local && data.follow {
+      check_community_ban(local_user_view.person.id, community_id, context.pool()).await?;
+      check_community_deleted_or_removed(community_id, context.pool()).await?;
 
-        CommunityFollower::follow(context.pool(), &community_follower_form)
-          .await
-          .map_err(|e| LemmyError::from_error_message(e, "community_follower_already_exists"))?;
-      } else {
-        CommunityFollower::unfollow(context.pool(), &community_follower_form)
-          .await
-          .map_err(|e| LemmyError::from_error_message(e, "community_follower_already_exists"))?;
-      }
-    } else if data.follow {
-      // Dont actually add to the community followers here, because you need
-      // to wait for the accept
-      FollowCommunityApub::send(&local_user_view.person.clone().into(), &community, context)
-        .await?;
-    } else {
-      UndoFollow::send(&local_user_view.person.clone().into(), &community, context).await?;
+      CommunityFollower::follow(context.pool(), &community_follower_form)
+        .await
+        .map_err(|e| LemmyError::from_error_message(e, "community_follower_already_exists"))?;
+    }
+    if !data.follow {
       CommunityFollower::unfollow(context.pool(), &community_follower_form)
         .await
         .map_err(|e| LemmyError::from_error_message(e, "community_follower_already_exists"))?;
index 111a89d010da94591486c59e71e64a7248bd8bcc..94ce7d745134dddd9645aa8907334f4b9c5b444b 100644 (file)
@@ -2,9 +2,10 @@ use crate::Perform;
 use actix_web::web::Data;
 use lemmy_api_common::{
   community::{CommunityResponse, HideCommunity},
+  context::LemmyContext,
   utils::{get_local_user_view_from_jwt, is_admin},
+  websocket::{send::send_community_ws_message, UserOperationCrud},
 };
-use lemmy_apub::protocol::activities::community::update::UpdateCommunity;
 use lemmy_db_schema::{
   source::{
     community::{Community, CommunityUpdateForm},
@@ -13,7 +14,6 @@ use lemmy_db_schema::{
   traits::Crud,
 };
 use lemmy_utils::{error::LemmyError, ConnectionId};
-use lemmy_websocket::{send::send_community_ws_message, LemmyContext, UserOperationCrud};
 
 #[async_trait::async_trait(?Send)]
 impl Perform for HideCommunity {
@@ -44,19 +44,12 @@ impl Perform for HideCommunity {
     };
 
     let community_id = data.community_id;
-    let updated_community = Community::update(context.pool(), community_id, &community_form)
+    Community::update(context.pool(), community_id, &community_form)
       .await
       .map_err(|e| LemmyError::from_error_message(e, "couldnt_update_community_hidden_status"))?;
 
     ModHideCommunity::create(context.pool(), &mod_hide_community_form).await?;
 
-    UpdateCommunity::send(
-      updated_community.into(),
-      &local_user_view.person.into(),
-      context,
-    )
-    .await?;
-
     let op = UserOperationCrud::EditCommunity;
     send_community_ws_message(data.community_id, op, websocket_id, None, context).await
   }
index 5da0d8e3e0e5797a5073fdb221f5c4711a10cbe8..7ca174e4ccdc802e7ed71c76446c2c221a89fe51 100644 (file)
@@ -3,6 +3,7 @@ use actix_web::web::Data;
 use anyhow::Context;
 use lemmy_api_common::{
   community::{GetCommunityResponse, TransferCommunity},
+  context::LemmyContext,
   utils::get_local_user_view_from_jwt,
 };
 use lemmy_db_schema::{
@@ -14,7 +15,6 @@ use lemmy_db_schema::{
 };
 use lemmy_db_views_actor::structs::{CommunityModeratorView, CommunityView, PersonViewSafe};
 use lemmy_utils::{error::LemmyError, location_info, ConnectionId};
-use lemmy_websocket::LemmyContext;
 
 // TODO: we dont do anything for federation here, it should be updated the next time the community
 //       gets fetched. i hope we can get rid of the community creator role soon.
index dbff533eabdd56051e7f237a6210e3b299302c31..5904a9b9b1df48f2a8ea695f3c36ff2dbb0f0dcf 100644 (file)
@@ -1,77 +1,8 @@
-use actix_web::{web, web::Data};
+use actix_web::web::Data;
 use captcha::Captcha;
-use lemmy_api_common::{
-  comment::{
-    CreateCommentLike,
-    CreateCommentReport,
-    ListCommentReports,
-    ResolveCommentReport,
-    SaveComment,
-  },
-  community::{
-    AddModToCommunity,
-    BanFromCommunity,
-    BlockCommunity,
-    FollowCommunity,
-    TransferCommunity,
-  },
-  person::{
-    AddAdmin,
-    BanPerson,
-    BlockPerson,
-    ChangePassword,
-    GetBannedPersons,
-    GetCaptcha,
-    GetPersonMentions,
-    GetReplies,
-    GetReportCount,
-    GetUnreadCount,
-    Login,
-    MarkAllAsRead,
-    MarkCommentReplyAsRead,
-    MarkPersonMentionAsRead,
-    PasswordChangeAfterReset,
-    PasswordReset,
-    SaveUserSettings,
-    VerifyEmail,
-  },
-  post::{
-    CreatePostLike,
-    CreatePostReport,
-    GetSiteMetadata,
-    ListPostReports,
-    LockPost,
-    MarkPostAsRead,
-    ResolvePostReport,
-    SavePost,
-    StickyPost,
-  },
-  private_message::{
-    CreatePrivateMessageReport,
-    ListPrivateMessageReports,
-    MarkPrivateMessageAsRead,
-    ResolvePrivateMessageReport,
-  },
-  site::{
-    ApproveRegistrationApplication,
-    GetModlog,
-    GetUnreadRegistrationApplicationCount,
-    LeaveAdmin,
-    ListRegistrationApplications,
-    PurgeComment,
-    PurgeCommunity,
-    PurgePerson,
-    PurgePost,
-    ResolveObject,
-    Search,
-  },
-  utils::local_site_to_slur_regex,
-  websocket::{CommunityJoin, ModJoin, PostJoin, UserJoin},
-};
+use lemmy_api_common::{context::LemmyContext, utils::local_site_to_slur_regex};
 use lemmy_db_schema::source::local_site::LocalSite;
 use lemmy_utils::{error::LemmyError, utils::check_slurs, ConnectionId};
-use lemmy_websocket::{serialize_websocket_message, LemmyContext, UserOperation};
-use serde::Deserialize;
 
 mod comment;
 mod comment_report;
@@ -95,182 +26,6 @@ pub trait Perform {
   ) -> Result<Self::Response, LemmyError>;
 }
 
-pub async fn match_websocket_operation(
-  context: LemmyContext,
-  id: ConnectionId,
-  op: UserOperation,
-  data: &str,
-) -> Result<String, LemmyError> {
-  match op {
-    // User ops
-    UserOperation::Login => do_websocket_operation::<Login>(context, id, op, data).await,
-    UserOperation::GetCaptcha => do_websocket_operation::<GetCaptcha>(context, id, op, data).await,
-    UserOperation::GetReplies => do_websocket_operation::<GetReplies>(context, id, op, data).await,
-    UserOperation::AddAdmin => do_websocket_operation::<AddAdmin>(context, id, op, data).await,
-    UserOperation::GetUnreadRegistrationApplicationCount => {
-      do_websocket_operation::<GetUnreadRegistrationApplicationCount>(context, id, op, data).await
-    }
-    UserOperation::ListRegistrationApplications => {
-      do_websocket_operation::<ListRegistrationApplications>(context, id, op, data).await
-    }
-    UserOperation::ApproveRegistrationApplication => {
-      do_websocket_operation::<ApproveRegistrationApplication>(context, id, op, data).await
-    }
-    UserOperation::BanPerson => do_websocket_operation::<BanPerson>(context, id, op, data).await,
-    UserOperation::GetBannedPersons => {
-      do_websocket_operation::<GetBannedPersons>(context, id, op, data).await
-    }
-    UserOperation::BlockPerson => {
-      do_websocket_operation::<BlockPerson>(context, id, op, data).await
-    }
-    UserOperation::GetPersonMentions => {
-      do_websocket_operation::<GetPersonMentions>(context, id, op, data).await
-    }
-    UserOperation::MarkPersonMentionAsRead => {
-      do_websocket_operation::<MarkPersonMentionAsRead>(context, id, op, data).await
-    }
-    UserOperation::MarkCommentReplyAsRead => {
-      do_websocket_operation::<MarkCommentReplyAsRead>(context, id, op, data).await
-    }
-    UserOperation::MarkAllAsRead => {
-      do_websocket_operation::<MarkAllAsRead>(context, id, op, data).await
-    }
-    UserOperation::PasswordReset => {
-      do_websocket_operation::<PasswordReset>(context, id, op, data).await
-    }
-    UserOperation::PasswordChange => {
-      do_websocket_operation::<PasswordChangeAfterReset>(context, id, op, data).await
-    }
-    UserOperation::UserJoin => do_websocket_operation::<UserJoin>(context, id, op, data).await,
-    UserOperation::PostJoin => do_websocket_operation::<PostJoin>(context, id, op, data).await,
-    UserOperation::CommunityJoin => {
-      do_websocket_operation::<CommunityJoin>(context, id, op, data).await
-    }
-    UserOperation::ModJoin => do_websocket_operation::<ModJoin>(context, id, op, data).await,
-    UserOperation::SaveUserSettings => {
-      do_websocket_operation::<SaveUserSettings>(context, id, op, data).await
-    }
-    UserOperation::ChangePassword => {
-      do_websocket_operation::<ChangePassword>(context, id, op, data).await
-    }
-    UserOperation::GetReportCount => {
-      do_websocket_operation::<GetReportCount>(context, id, op, data).await
-    }
-    UserOperation::GetUnreadCount => {
-      do_websocket_operation::<GetUnreadCount>(context, id, op, data).await
-    }
-    UserOperation::VerifyEmail => {
-      do_websocket_operation::<VerifyEmail>(context, id, op, data).await
-    }
-
-    // Private Message ops
-    UserOperation::MarkPrivateMessageAsRead => {
-      do_websocket_operation::<MarkPrivateMessageAsRead>(context, id, op, data).await
-    }
-    UserOperation::CreatePrivateMessageReport => {
-      do_websocket_operation::<CreatePrivateMessageReport>(context, id, op, data).await
-    }
-    UserOperation::ResolvePrivateMessageReport => {
-      do_websocket_operation::<ResolvePrivateMessageReport>(context, id, op, data).await
-    }
-    UserOperation::ListPrivateMessageReports => {
-      do_websocket_operation::<ListPrivateMessageReports>(context, id, op, data).await
-    }
-
-    // Site ops
-    UserOperation::GetModlog => do_websocket_operation::<GetModlog>(context, id, op, data).await,
-    UserOperation::PurgePerson => {
-      do_websocket_operation::<PurgePerson>(context, id, op, data).await
-    }
-    UserOperation::PurgeCommunity => {
-      do_websocket_operation::<PurgeCommunity>(context, id, op, data).await
-    }
-    UserOperation::PurgePost => do_websocket_operation::<PurgePost>(context, id, op, data).await,
-    UserOperation::PurgeComment => {
-      do_websocket_operation::<PurgeComment>(context, id, op, data).await
-    }
-    UserOperation::Search => do_websocket_operation::<Search>(context, id, op, data).await,
-    UserOperation::ResolveObject => {
-      do_websocket_operation::<ResolveObject>(context, id, op, data).await
-    }
-    UserOperation::TransferCommunity => {
-      do_websocket_operation::<TransferCommunity>(context, id, op, data).await
-    }
-    UserOperation::LeaveAdmin => do_websocket_operation::<LeaveAdmin>(context, id, op, data).await,
-
-    // Community ops
-    UserOperation::FollowCommunity => {
-      do_websocket_operation::<FollowCommunity>(context, id, op, data).await
-    }
-    UserOperation::BlockCommunity => {
-      do_websocket_operation::<BlockCommunity>(context, id, op, data).await
-    }
-    UserOperation::BanFromCommunity => {
-      do_websocket_operation::<BanFromCommunity>(context, id, op, data).await
-    }
-    UserOperation::AddModToCommunity => {
-      do_websocket_operation::<AddModToCommunity>(context, id, op, data).await
-    }
-
-    // Post ops
-    UserOperation::LockPost => do_websocket_operation::<LockPost>(context, id, op, data).await,
-    UserOperation::StickyPost => do_websocket_operation::<StickyPost>(context, id, op, data).await,
-    UserOperation::CreatePostLike => {
-      do_websocket_operation::<CreatePostLike>(context, id, op, data).await
-    }
-    UserOperation::MarkPostAsRead => {
-      do_websocket_operation::<MarkPostAsRead>(context, id, op, data).await
-    }
-    UserOperation::SavePost => do_websocket_operation::<SavePost>(context, id, op, data).await,
-    UserOperation::CreatePostReport => {
-      do_websocket_operation::<CreatePostReport>(context, id, op, data).await
-    }
-    UserOperation::ListPostReports => {
-      do_websocket_operation::<ListPostReports>(context, id, op, data).await
-    }
-    UserOperation::ResolvePostReport => {
-      do_websocket_operation::<ResolvePostReport>(context, id, op, data).await
-    }
-    UserOperation::GetSiteMetadata => {
-      do_websocket_operation::<GetSiteMetadata>(context, id, op, data).await
-    }
-
-    // Comment ops
-    UserOperation::SaveComment => {
-      do_websocket_operation::<SaveComment>(context, id, op, data).await
-    }
-    UserOperation::CreateCommentLike => {
-      do_websocket_operation::<CreateCommentLike>(context, id, op, data).await
-    }
-    UserOperation::CreateCommentReport => {
-      do_websocket_operation::<CreateCommentReport>(context, id, op, data).await
-    }
-    UserOperation::ListCommentReports => {
-      do_websocket_operation::<ListCommentReports>(context, id, op, data).await
-    }
-    UserOperation::ResolveCommentReport => {
-      do_websocket_operation::<ResolveCommentReport>(context, id, op, data).await
-    }
-  }
-}
-
-async fn do_websocket_operation<'a, 'b, Data>(
-  context: LemmyContext,
-  id: ConnectionId,
-  op: UserOperation,
-  data: &str,
-) -> Result<String, LemmyError>
-where
-  for<'de> Data: Deserialize<'de> + 'a,
-  Data: Perform,
-{
-  let parsed_data: Data = serde_json::from_str(data)?;
-  let res = parsed_data
-    .perform(&web::Data::new(context), Some(id))
-    .await?;
-  serialize_websocket_message(&op, &res)
-}
-
 /// Converts the captcha to a base64 encoded wav audio file
 pub(crate) fn captcha_as_wav_base64(captcha: &Captcha) -> String {
   let letters = captcha.as_wav();
index ceca80f90ee2def7520f40a5df29726e9f9388cc..78357f0c58792d65386dc998d1869aee695b5d8b 100644 (file)
@@ -1,8 +1,10 @@
 use crate::Perform;
 use actix_web::web::Data;
 use lemmy_api_common::{
+  context::LemmyContext,
   person::{AddAdmin, AddAdminResponse},
   utils::{get_local_user_view_from_jwt, is_admin},
+  websocket::{messages::SendAllMessage, UserOperation},
 };
 use lemmy_db_schema::{
   source::{
@@ -13,7 +15,6 @@ use lemmy_db_schema::{
 };
 use lemmy_db_views_actor::structs::PersonViewSafe;
 use lemmy_utils::{error::LemmyError, ConnectionId};
-use lemmy_websocket::{messages::SendAllMessage, LemmyContext, UserOperation};
 
 #[async_trait::async_trait(?Send)]
 impl Perform for AddAdmin {
index 2482e408ed8740e720c8f4f3d3481d3ccee075ad..0bb2523497b4cb70a28dc5c4e124b2d5dbff67b1 100644 (file)
@@ -1,12 +1,10 @@
 use crate::Perform;
 use actix_web::web::Data;
 use lemmy_api_common::{
+  context::LemmyContext,
   person::{BanPerson, BanPersonResponse},
   utils::{get_local_user_view_from_jwt, is_admin, remove_user_data},
-};
-use lemmy_apub::{
-  activities::block::SiteOrCommunity,
-  protocol::activities::block::{block_user::BlockUser, undo_block_user::UndoBlockUser},
+  websocket::{messages::SendAllMessage, UserOperation},
 };
 use lemmy_db_schema::{
   source::{
@@ -15,10 +13,8 @@ use lemmy_db_schema::{
   },
   traits::Crud,
 };
-use lemmy_db_views::structs::SiteView;
 use lemmy_db_views_actor::structs::PersonViewSafe;
 use lemmy_utils::{error::LemmyError, utils::naive_from_unix, ConnectionId};
-use lemmy_websocket::{messages::SendAllMessage, LemmyContext, UserOperation};
 
 #[async_trait::async_trait(?Send)]
 impl Perform for BanPerson {
@@ -78,32 +74,6 @@ impl Perform for BanPerson {
     let person_id = data.person_id;
     let person_view = PersonViewSafe::read(context.pool(), person_id).await?;
 
-    let site = SiteOrCommunity::Site(SiteView::read_local(context.pool()).await?.site.into());
-    // if the action affects a local user, federate to other instances
-    if person.local {
-      if ban {
-        BlockUser::send(
-          &site,
-          &person.into(),
-          &local_user_view.person.into(),
-          remove_data,
-          data.reason.clone(),
-          expires,
-          context,
-        )
-        .await?;
-      } else {
-        UndoBlockUser::send(
-          &site,
-          &person.into(),
-          &local_user_view.person.into(),
-          data.reason.clone(),
-          context,
-        )
-        .await?;
-      }
-    }
-
     let res = BanPersonResponse {
       person_view,
       banned: data.ban,
index 44bd668f73cea1463b0b00d094bdcdb882717d4c..b57ecd551eb3f5f3a0b68850510cef87f783b786 100644 (file)
@@ -1,6 +1,7 @@
 use crate::Perform;
 use actix_web::web::Data;
 use lemmy_api_common::{
+  context::LemmyContext,
   person::{BlockPerson, BlockPersonResponse},
   utils::get_local_user_view_from_jwt,
 };
@@ -10,7 +11,6 @@ use lemmy_db_schema::{
 };
 use lemmy_db_views_actor::structs::PersonViewSafe;
 use lemmy_utils::{error::LemmyError, ConnectionId};
-use lemmy_websocket::LemmyContext;
 
 #[async_trait::async_trait(?Send)]
 impl Perform for BlockPerson {
index 38fac32b53b5586a1ad0b42424af7dffa132757a..2d0fd30e53763ae18f9303bfa263e0620f0b8ee7 100644 (file)
@@ -2,12 +2,12 @@ use crate::Perform;
 use actix_web::web::Data;
 use bcrypt::verify;
 use lemmy_api_common::{
+  context::LemmyContext,
   person::{ChangePassword, LoginResponse},
   utils::{get_local_user_view_from_jwt, password_length_check},
 };
 use lemmy_db_schema::source::local_user::LocalUser;
 use lemmy_utils::{claims::Claims, error::LemmyError, ConnectionId};
-use lemmy_websocket::LemmyContext;
 
 #[async_trait::async_trait(?Send)]
 impl Perform for ChangePassword {
index 3ac48252edc095ef1d4ea41fb427b1b9bf47f024..c6de10d7ac5569afbc15335123e15ad157eeca48 100644 (file)
@@ -1,6 +1,7 @@
 use crate::Perform;
 use actix_web::web::Data;
 use lemmy_api_common::{
+  context::LemmyContext,
   person::{LoginResponse, PasswordChangeAfterReset},
   utils::password_length_check,
 };
@@ -10,7 +11,6 @@ use lemmy_db_schema::source::{
 };
 use lemmy_db_views::structs::SiteView;
 use lemmy_utils::{claims::Claims, error::LemmyError, ConnectionId};
-use lemmy_websocket::LemmyContext;
 
 #[async_trait::async_trait(?Send)]
 impl Perform for PasswordChangeAfterReset {
index 3d1b88845429679b5d13fc3c99ad36ef3272a91e..50a2bdba2d8f79cb06f94fa734c3689fe930c618 100644 (file)
@@ -2,10 +2,13 @@ use crate::{captcha_as_wav_base64, Perform};
 use actix_web::web::Data;
 use captcha::{gen, Difficulty};
 use chrono::Duration;
-use lemmy_api_common::person::{CaptchaResponse, GetCaptcha, GetCaptchaResponse};
+use lemmy_api_common::{
+  context::LemmyContext,
+  person::{CaptchaResponse, GetCaptcha, GetCaptchaResponse},
+  websocket::messages::CaptchaItem,
+};
 use lemmy_db_schema::{source::local_site::LocalSite, utils::naive_now};
 use lemmy_utils::{error::LemmyError, ConnectionId};
-use lemmy_websocket::{messages::CaptchaItem, LemmyContext};
 
 #[async_trait::async_trait(?Send)]
 impl Perform for GetCaptcha {
index 16df72ccc8308c22035f43f6c5d6ef2b1f928a93..60eb32b35ec4251126a8886684fbf3cb00449b51 100644 (file)
@@ -1,12 +1,12 @@
 use crate::Perform;
 use actix_web::web::Data;
 use lemmy_api_common::{
+  context::LemmyContext,
   person::{BannedPersonsResponse, GetBannedPersons},
   utils::{get_local_user_view_from_jwt, is_admin},
 };
 use lemmy_db_views_actor::structs::PersonViewSafe;
 use lemmy_utils::{error::LemmyError, ConnectionId};
-use lemmy_websocket::LemmyContext;
 
 #[async_trait::async_trait(?Send)]
 impl Perform for GetBannedPersons {
index 6135438778916646cedd107501d270863183cadd..c60c0dcdf44a53a526315e2a4478a99bc782ad68 100644 (file)
@@ -2,13 +2,13 @@ use crate::Perform;
 use actix_web::web::Data;
 use bcrypt::verify;
 use lemmy_api_common::{
+  context::LemmyContext,
   person::{Login, LoginResponse},
   utils::{check_registration_application, check_user_valid},
 };
 use lemmy_db_schema::source::local_site::LocalSite;
 use lemmy_db_views::structs::LocalUserView;
 use lemmy_utils::{claims::Claims, error::LemmyError, ConnectionId};
-use lemmy_websocket::LemmyContext;
 
 #[async_trait::async_trait(?Send)]
 impl Perform for Login {
index d231f7184bfc5090b97be630f5a7e1aa95962186..c03e9d1679d6fa6b19633fb0969aa5d54e64c455 100644 (file)
@@ -1,12 +1,12 @@
 use crate::Perform;
 use actix_web::web::Data;
 use lemmy_api_common::{
+  context::LemmyContext,
   person::{GetPersonMentions, GetPersonMentionsResponse},
   utils::get_local_user_view_from_jwt,
 };
 use lemmy_db_views_actor::person_mention_view::PersonMentionQuery;
 use lemmy_utils::{error::LemmyError, ConnectionId};
-use lemmy_websocket::LemmyContext;
 
 #[async_trait::async_trait(?Send)]
 impl Perform for GetPersonMentions {
index 102229985f00a2486fcbada947fee5110c787677..585db5e95d0a304e6bdce8bbe92855d0f3e4f611 100644 (file)
@@ -1,12 +1,12 @@
 use crate::Perform;
 use actix_web::web::Data;
 use lemmy_api_common::{
+  context::LemmyContext,
   person::{GetReplies, GetRepliesResponse},
   utils::get_local_user_view_from_jwt,
 };
 use lemmy_db_views_actor::comment_reply_view::CommentReplyQuery;
 use lemmy_utils::{error::LemmyError, ConnectionId};
-use lemmy_websocket::LemmyContext;
 
 #[async_trait::async_trait(?Send)]
 impl Perform for GetReplies {
index 3b8ad0f4414ff681aea32c49c2bbd1fe9ff5e15a..2515715bdcc356e7db93a87cf9f75f7bd2e3996c 100644 (file)
@@ -1,6 +1,7 @@
 use crate::Perform;
 use actix_web::web::Data;
 use lemmy_api_common::{
+  context::LemmyContext,
   person::{GetRepliesResponse, MarkAllAsRead},
   utils::get_local_user_view_from_jwt,
 };
@@ -10,7 +11,6 @@ use lemmy_db_schema::source::{
   private_message::PrivateMessage,
 };
 use lemmy_utils::{error::LemmyError, ConnectionId};
-use lemmy_websocket::LemmyContext;
 
 #[async_trait::async_trait(?Send)]
 impl Perform for MarkAllAsRead {
index c42e294a8dd9e2c6b078c58d616d7697ecac9287..a3a75d929d84d5f3616ccf0edd3095ab4f645a02 100644 (file)
@@ -1,6 +1,7 @@
 use crate::Perform;
 use actix_web::web::Data;
 use lemmy_api_common::{
+  context::LemmyContext,
   person::{MarkPersonMentionAsRead, PersonMentionResponse},
   utils::get_local_user_view_from_jwt,
 };
@@ -10,7 +11,6 @@ use lemmy_db_schema::{
 };
 use lemmy_db_views_actor::structs::PersonMentionView;
 use lemmy_utils::{error::LemmyError, ConnectionId};
-use lemmy_websocket::LemmyContext;
 
 #[async_trait::async_trait(?Send)]
 impl Perform for MarkPersonMentionAsRead {
index 2ec5fd806230e5e765be3d2de5c4c63602061076..3921e769df50f995352e5abbb9a717dd1a491316 100644 (file)
@@ -1,6 +1,7 @@
 use crate::Perform;
 use actix_web::web::Data;
 use lemmy_api_common::{
+  context::LemmyContext,
   person::{CommentReplyResponse, MarkCommentReplyAsRead},
   utils::get_local_user_view_from_jwt,
 };
@@ -10,7 +11,6 @@ use lemmy_db_schema::{
 };
 use lemmy_db_views_actor::structs::CommentReplyView;
 use lemmy_utils::{error::LemmyError, ConnectionId};
-use lemmy_websocket::LemmyContext;
 
 #[async_trait::async_trait(?Send)]
 impl Perform for MarkCommentReplyAsRead {
index 47d826fddb7d59c68ecaa4c9716ec3bd9e3ac2d4..715ccd286ec3c18c62fe34b60880c73f25e4cf4b 100644 (file)
@@ -1,13 +1,13 @@
 use crate::Perform;
 use actix_web::web::Data;
 use lemmy_api_common::{
+  context::LemmyContext,
   person::{GetUnreadCount, GetUnreadCountResponse},
   utils::get_local_user_view_from_jwt,
 };
 use lemmy_db_views::structs::PrivateMessageView;
 use lemmy_db_views_actor::structs::{CommentReplyView, PersonMentionView};
 use lemmy_utils::{error::LemmyError, ConnectionId};
-use lemmy_websocket::LemmyContext;
 
 #[async_trait::async_trait(?Send)]
 impl Perform for GetUnreadCount {
index 1372e4caa9fd29077122640f6dbae59b08674771..b59a06490d12de616671f156d33cdd4bfec7d25e 100644 (file)
@@ -1,12 +1,12 @@
 use crate::Perform;
 use actix_web::web::Data;
 use lemmy_api_common::{
+  context::LemmyContext,
   person::{GetReportCount, GetReportCountResponse},
   utils::get_local_user_view_from_jwt,
 };
 use lemmy_db_views::structs::{CommentReportView, PostReportView, PrivateMessageReportView};
 use lemmy_utils::{error::LemmyError, ConnectionId};
-use lemmy_websocket::LemmyContext;
 
 #[async_trait::async_trait(?Send)]
 impl Perform for GetReportCount {
index 078d55ec35dc638e8c1501064566387be56a16ff..5d0e9d88bb3840209602b8d639f60c5efa1b48c7 100644 (file)
@@ -1,12 +1,12 @@
 use crate::Perform;
 use actix_web::web::Data;
 use lemmy_api_common::{
+  context::LemmyContext,
   person::{PasswordReset, PasswordResetResponse},
   utils::send_password_reset_email,
 };
 use lemmy_db_views::structs::LocalUserView;
 use lemmy_utils::{error::LemmyError, ConnectionId};
-use lemmy_websocket::LemmyContext;
 
 #[async_trait::async_trait(?Send)]
 impl Perform for PasswordReset {
index 4aa3a7437d8b09444ef5b59e77876cfbaecd482d..6672a67b038067775a64ac3c95e19c68a4ff7d35 100644 (file)
@@ -1,6 +1,7 @@
 use crate::Perform;
 use actix_web::web::Data;
 use lemmy_api_common::{
+  context::LemmyContext,
   person::{LoginResponse, SaveUserSettings},
   utils::{get_local_user_view_from_jwt, send_verification_email},
 };
@@ -20,7 +21,6 @@ use lemmy_utils::{
   utils::{is_valid_display_name, is_valid_matrix_id},
   ConnectionId,
 };
-use lemmy_websocket::LemmyContext;
 
 #[async_trait::async_trait(?Send)]
 impl Perform for SaveUserSettings {
index 73db4bea5b60a19327ff964860b686de54ad7c8d..fb82b716bb543c0d2d5c2a8130e60667f96b9ae0 100644 (file)
@@ -1,6 +1,7 @@
 use crate::Perform;
 use actix_web::web::Data;
 use lemmy_api_common::{
+  context::LemmyContext,
   person::{VerifyEmail, VerifyEmailResponse},
   utils::send_email_verification_success,
 };
@@ -13,7 +14,6 @@ use lemmy_db_schema::{
 };
 use lemmy_db_views::structs::LocalUserView;
 use lemmy_utils::error::LemmyError;
-use lemmy_websocket::LemmyContext;
 
 #[async_trait::async_trait(?Send)]
 impl Perform for VerifyEmail {
index 54e2cfe7ca4d2301359ef66b985093c1aabbecf0..eaf111eba7beb1f5629bbebeeea853ca605b4e51 100644 (file)
@@ -1,11 +1,11 @@
 use crate::Perform;
 use actix_web::web::Data;
 use lemmy_api_common::{
+  context::LemmyContext,
   post::{GetSiteMetadata, GetSiteMetadataResponse},
   request::fetch_site_metadata,
 };
 use lemmy_utils::{error::LemmyError, ConnectionId};
-use lemmy_websocket::LemmyContext;
 
 #[async_trait::async_trait(?Send)]
 impl Perform for GetSiteMetadata {
index ec2edc33eecc6f7530a03b65b3dc9d4c8f47aa08..59135ff216f89db3f75a9d0ba4dc32068a5a662d 100644 (file)
@@ -1,6 +1,7 @@
 use crate::Perform;
 use actix_web::web::Data;
 use lemmy_api_common::{
+  context::LemmyContext,
   post::{CreatePostLike, PostResponse},
   utils::{
     check_community_ban,
@@ -9,14 +10,7 @@ use lemmy_api_common::{
     get_local_user_view_from_jwt,
     mark_post_as_read,
   },
-};
-use lemmy_apub::{
-  fetcher::post_or_comment::PostOrComment,
-  objects::post::ApubPost,
-  protocol::activities::voting::{
-    undo_vote::UndoVote,
-    vote::{Vote, VoteType},
-  },
+  websocket::{send::send_post_ws_message, UserOperation},
 };
 use lemmy_db_schema::{
   source::{
@@ -26,7 +20,6 @@ use lemmy_db_schema::{
   traits::{Crud, Likeable},
 };
 use lemmy_utils::{error::LemmyError, ConnectionId};
-use lemmy_websocket::{send::send_post_ws_message, LemmyContext, UserOperation};
 
 #[async_trait::async_trait(?Send)]
 impl Perform for CreatePostLike {
@@ -48,7 +41,7 @@ impl Perform for CreatePostLike {
 
     // Check for a community ban
     let post_id = data.post_id;
-    let post: ApubPost = Post::read(context.pool(), post_id).await?.into();
+    let post = Post::read(context.pool(), post_id).await?;
 
     check_community_ban(local_user_view.person.id, post.community_id, context.pool()).await?;
     check_community_deleted_or_removed(post.community_id, context.pool()).await?;
@@ -64,9 +57,6 @@ impl Perform for CreatePostLike {
 
     PostLike::remove(context.pool(), person_id, post_id).await?;
 
-    let community_id = post.community_id;
-    let object = PostOrComment::Post(Box::new(post));
-
     // Only add the like if the score isnt 0
     let do_add = like_form.score != 0 && (like_form.score == 1 || like_form.score == -1);
     if do_add {
@@ -74,25 +64,6 @@ impl Perform for CreatePostLike {
       PostLike::like(context.pool(), &like_form2)
         .await
         .map_err(|e| LemmyError::from_error_message(e, "couldnt_like_post"))?;
-
-      Vote::send(
-        &object,
-        &local_user_view.person.clone().into(),
-        community_id,
-        like_form.score.try_into()?,
-        context,
-      )
-      .await?;
-    } else {
-      // API doesn't distinguish between Undo/Like and Undo/Dislike
-      UndoVote::send(
-        &object,
-        &local_user_view.person.clone().into(),
-        community_id,
-        VoteType::Like,
-        context,
-      )
-      .await?;
     }
 
     // Mark the post as read
index ae726ee926968f0c59ee2dd8fad38918c6a7c72c..c5fa2a0f55183a56508dd3695741609c8ad6d95b 100644 (file)
@@ -1,6 +1,7 @@
 use crate::Perform;
 use actix_web::web::Data;
 use lemmy_api_common::{
+  context::LemmyContext,
   post::{LockPost, PostResponse},
   utils::{
     check_community_ban,
@@ -8,10 +9,7 @@ use lemmy_api_common::{
     get_local_user_view_from_jwt,
     is_mod_or_admin,
   },
-};
-use lemmy_apub::{
-  objects::post::ApubPost,
-  protocol::activities::{create_or_update::page::CreateOrUpdatePage, CreateOrUpdateType},
+  websocket::{send::send_post_ws_message, UserOperation},
 };
 use lemmy_db_schema::{
   source::{
@@ -21,7 +19,6 @@ use lemmy_db_schema::{
   traits::Crud,
 };
 use lemmy_utils::{error::LemmyError, ConnectionId};
-use lemmy_websocket::{send::send_post_ws_message, LemmyContext, UserOperation};
 
 #[async_trait::async_trait(?Send)]
 impl Perform for LockPost {
@@ -59,13 +56,12 @@ impl Perform for LockPost {
     // Update the post
     let post_id = data.post_id;
     let locked = data.locked;
-    let updated_post: ApubPost = Post::update(
+    Post::update(
       context.pool(),
       post_id,
       &PostUpdateForm::builder().locked(Some(locked)).build(),
     )
-    .await?
-    .into();
+    .await?;
 
     // Mod tables
     let form = ModLockPostForm {
@@ -75,15 +71,6 @@ impl Perform for LockPost {
     };
     ModLockPost::create(context.pool(), &form).await?;
 
-    // apub updates
-    CreateOrUpdatePage::send(
-      updated_post,
-      &local_user_view.person.clone().into(),
-      CreateOrUpdateType::Update,
-      context,
-    )
-    .await?;
-
     send_post_ws_message(
       data.post_id,
       UserOperation::LockPost,
index 18f86521cd4a8ab9a5cf7d3ac8bae2d729e57bf9..9fdf01b1281a4a44c15100a144594ffa3781e8ed 100644 (file)
@@ -1,12 +1,12 @@
 use crate::Perform;
 use actix_web::web::Data;
 use lemmy_api_common::{
+  context::LemmyContext,
   post::{MarkPostAsRead, PostResponse},
   utils::{get_local_user_view_from_jwt, mark_post_as_read, mark_post_as_unread},
 };
 use lemmy_db_views::structs::PostView;
 use lemmy_utils::{error::LemmyError, ConnectionId};
-use lemmy_websocket::LemmyContext;
 
 #[async_trait::async_trait(?Send)]
 impl Perform for MarkPostAsRead {
index 0a240f9eb78fcb09ebf3a011b2bd5f36c27afd29..b36f844b63793af05dd4361794e52940ac1684d3 100644 (file)
@@ -1,6 +1,7 @@
 use crate::Perform;
 use actix_web::web::Data;
 use lemmy_api_common::{
+  context::LemmyContext,
   post::{PostResponse, SavePost},
   utils::{get_local_user_view_from_jwt, mark_post_as_read},
 };
@@ -10,7 +11,6 @@ use lemmy_db_schema::{
 };
 use lemmy_db_views::structs::PostView;
 use lemmy_utils::{error::LemmyError, ConnectionId};
-use lemmy_websocket::LemmyContext;
 
 #[async_trait::async_trait(?Send)]
 impl Perform for SavePost {
index 384ba52d6605b71de04f158843e2d279c6097c62..3a8aee7ab99c464edb1df958ae5212719d10a351 100644 (file)
@@ -1,6 +1,7 @@
 use crate::Perform;
 use actix_web::web::Data;
 use lemmy_api_common::{
+  context::LemmyContext,
   post::{PostResponse, StickyPost},
   utils::{
     check_community_ban,
@@ -8,10 +9,7 @@ use lemmy_api_common::{
     get_local_user_view_from_jwt,
     is_mod_or_admin,
   },
-};
-use lemmy_apub::{
-  objects::post::ApubPost,
-  protocol::activities::{create_or_update::page::CreateOrUpdatePage, CreateOrUpdateType},
+  websocket::{send::send_post_ws_message, UserOperation},
 };
 use lemmy_db_schema::{
   source::{
@@ -21,7 +19,6 @@ use lemmy_db_schema::{
   traits::Crud,
 };
 use lemmy_utils::{error::LemmyError, ConnectionId};
-use lemmy_websocket::{send::send_post_ws_message, LemmyContext, UserOperation};
 
 #[async_trait::async_trait(?Send)]
 impl Perform for StickyPost {
@@ -59,13 +56,12 @@ impl Perform for StickyPost {
     // Update the post
     let post_id = data.post_id;
     let stickied = data.stickied;
-    let updated_post: ApubPost = Post::update(
+    Post::update(
       context.pool(),
       post_id,
       &PostUpdateForm::builder().stickied(Some(stickied)).build(),
     )
-    .await?
-    .into();
+    .await?;
 
     // Mod tables
     let form = ModStickyPostForm {
@@ -76,16 +72,6 @@ impl Perform for StickyPost {
 
     ModStickyPost::create(context.pool(), &form).await?;
 
-    // Apub updates
-    // TODO stickied should pry work like locked for ease of use
-    CreateOrUpdatePage::send(
-      updated_post,
-      &local_user_view.person.clone().into(),
-      CreateOrUpdateType::Update,
-      context,
-    )
-    .await?;
-
     send_post_ws_message(
       data.post_id,
       UserOperation::StickyPost,
index ca4113a3b5ea5ecdb94a3c8628170e1df13e5ef9..71be43623ab7912b757f92c165991e177b3d628d 100644 (file)
@@ -1,11 +1,11 @@
 use crate::{check_report_reason, Perform};
-use activitypub_federation::core::object_id::ObjectId;
 use actix_web::web::Data;
 use lemmy_api_common::{
+  context::LemmyContext,
   post::{CreatePostReport, PostReportResponse},
   utils::{check_community_ban, get_local_user_view_from_jwt},
+  websocket::{messages::SendModRoomMessage, UserOperation},
 };
-use lemmy_apub::protocol::activities::community::report::Report;
 use lemmy_db_schema::{
   source::{
     local_site::LocalSite,
@@ -15,7 +15,6 @@ use lemmy_db_schema::{
 };
 use lemmy_db_views::structs::{PostReportView, PostView};
 use lemmy_utils::{error::LemmyError, ConnectionId};
-use lemmy_websocket::{messages::SendModRoomMessage, LemmyContext, UserOperation};
 
 /// Creates a post report and notifies the moderators of the community
 #[async_trait::async_trait(?Send)]
@@ -66,15 +65,6 @@ impl Perform for CreatePostReport {
       websocket_id,
     });
 
-    Report::send(
-      ObjectId::new(post_view.post.ap_id),
-      &local_user_view.person.into(),
-      ObjectId::new(post_view.community.actor_id),
-      reason.to_string(),
-      context,
-    )
-    .await?;
-
     Ok(res)
   }
 }
index 7a79f04b731f397a6f99e7c163a5a78601218f99..2feed7ed2ea90c62f04f974e120c3459fea980fa 100644 (file)
@@ -1,12 +1,12 @@
 use crate::Perform;
 use actix_web::web::Data;
 use lemmy_api_common::{
+  context::LemmyContext,
   post::{ListPostReports, ListPostReportsResponse},
   utils::get_local_user_view_from_jwt,
 };
 use lemmy_db_views::post_report_view::PostReportQuery;
 use lemmy_utils::{error::LemmyError, ConnectionId};
-use lemmy_websocket::LemmyContext;
 
 /// Lists post reports for a community if an id is supplied
 /// or returns all post reports for communities a user moderates
index 687bdcce16008ae4440b606700248c00bf0ccfea..0e2b9e16a0b857d2b56f817276d625f4926eb7bd 100644 (file)
@@ -1,13 +1,14 @@
 use crate::Perform;
 use actix_web::web::Data;
 use lemmy_api_common::{
+  context::LemmyContext,
   post::{PostReportResponse, ResolvePostReport},
   utils::{get_local_user_view_from_jwt, is_mod_or_admin},
+  websocket::{messages::SendModRoomMessage, UserOperation},
 };
 use lemmy_db_schema::{source::post_report::PostReport, traits::Reportable};
 use lemmy_db_views::structs::PostReportView;
 use lemmy_utils::{error::LemmyError, ConnectionId};
-use lemmy_websocket::{messages::SendModRoomMessage, LemmyContext, UserOperation};
 
 /// Resolves or unresolves a post report and notifies the moderators of the community
 #[async_trait::async_trait(?Send)]
index 0b7bb676a8837f3e7f00aedb8bcab3dccde9d242..9c3c3d8ae06763a8210a67fa60684e227cb80503 100644 (file)
@@ -1,15 +1,16 @@
 use crate::Perform;
 use actix_web::web::Data;
 use lemmy_api_common::{
+  context::LemmyContext,
   private_message::{MarkPrivateMessageAsRead, PrivateMessageResponse},
   utils::get_local_user_view_from_jwt,
+  websocket::{send::send_pm_ws_message, UserOperation},
 };
 use lemmy_db_schema::{
   source::private_message::{PrivateMessage, PrivateMessageUpdateForm},
   traits::Crud,
 };
 use lemmy_utils::{error::LemmyError, ConnectionId};
-use lemmy_websocket::{send::send_pm_ws_message, LemmyContext, UserOperation};
 
 #[async_trait::async_trait(?Send)]
 impl Perform for MarkPrivateMessageAsRead {
index 490fd55bf0571779bc5eb394a3c16a63132fdd7e..66875c614c97febbdc32eacb7d5e545c24f291d5 100644 (file)
@@ -1,8 +1,10 @@
 use crate::{check_report_reason, Perform};
 use actix_web::web::Data;
 use lemmy_api_common::{
+  context::LemmyContext,
   private_message::{CreatePrivateMessageReport, PrivateMessageReportResponse},
   utils::get_local_user_view_from_jwt,
+  websocket::{messages::SendModRoomMessage, UserOperation},
 };
 use lemmy_db_schema::{
   newtypes::CommunityId,
@@ -15,7 +17,6 @@ use lemmy_db_schema::{
 };
 use lemmy_db_views::structs::PrivateMessageReportView;
 use lemmy_utils::{error::LemmyError, ConnectionId};
-use lemmy_websocket::{messages::SendModRoomMessage, LemmyContext, UserOperation};
 
 #[async_trait::async_trait(?Send)]
 impl Perform for CreatePrivateMessageReport {
index 0279cb83b4dbfe63d8c1df850ccdf62bca566bb6..98c2d92698c1790533a45c6048e5b4fef8657bdb 100644 (file)
@@ -1,12 +1,12 @@
 use crate::Perform;
 use actix_web::web::Data;
 use lemmy_api_common::{
+  context::LemmyContext,
   private_message::{ListPrivateMessageReports, ListPrivateMessageReportsResponse},
   utils::{get_local_user_view_from_jwt, is_admin},
 };
 use lemmy_db_views::private_message_report_view::PrivateMessageReportQuery;
 use lemmy_utils::{error::LemmyError, ConnectionId};
-use lemmy_websocket::LemmyContext;
 
 #[async_trait::async_trait(?Send)]
 impl Perform for ListPrivateMessageReports {
index a7af798ad179f35b30e095dabbba1a4765e08572..2a3f677ad8eb48dea53d66de0e290cce1607ca40 100644 (file)
@@ -1,8 +1,10 @@
 use crate::Perform;
 use actix_web::web::Data;
 use lemmy_api_common::{
+  context::LemmyContext,
   private_message::{PrivateMessageReportResponse, ResolvePrivateMessageReport},
   utils::{get_local_user_view_from_jwt, is_admin},
+  websocket::{messages::SendModRoomMessage, UserOperation},
 };
 use lemmy_db_schema::{
   newtypes::CommunityId,
@@ -11,7 +13,6 @@ use lemmy_db_schema::{
 };
 use lemmy_db_views::structs::PrivateMessageReportView;
 use lemmy_utils::{error::LemmyError, ConnectionId};
-use lemmy_websocket::{messages::SendModRoomMessage, LemmyContext, UserOperation};
 
 #[async_trait::async_trait(?Send)]
 impl Perform for ResolvePrivateMessageReport {
index 4a6687b3289d176d5ba8819ba4b636bd654c603c..7a75db51dc239464cf0b3a7dff8ede8fdbf99727 100644 (file)
@@ -1,6 +1,7 @@
 use crate::Perform;
 use actix_web::web::Data;
 use lemmy_api_common::{
+  context::LemmyContext,
   site::{GetSiteResponse, LeaveAdmin},
   utils::{get_local_user_view_from_jwt, is_admin},
 };
@@ -17,7 +18,6 @@ use lemmy_db_schema::{
 use lemmy_db_views::structs::SiteView;
 use lemmy_db_views_actor::structs::PersonViewSafe;
 use lemmy_utils::{error::LemmyError, version, ConnectionId};
-use lemmy_websocket::LemmyContext;
 
 #[async_trait::async_trait(?Send)]
 impl Perform for LeaveAdmin {
index 531c0508590d4f3ca7c20c1a374c4b82dda527a1..4e3694ce4640172d7a1b3d6e01021bc52d9e23b8 100644 (file)
@@ -2,5 +2,3 @@ mod leave_admin;
 mod mod_log;
 mod purge;
 mod registration_applications;
-mod resolve_object;
-mod search;
index f1ab9f45c408b16e13eb706d3239fb0f9721ef7c..5e1c71a701e2d4969b75aedfb4eb57d8a4aa5b57 100644 (file)
@@ -1,6 +1,7 @@
 use crate::Perform;
 use actix_web::web::Data;
 use lemmy_api_common::{
+  context::LemmyContext,
   site::{GetModlog, GetModlogResponse},
   utils::{check_private_instance, get_local_user_view_from_jwt_opt, is_admin, is_mod_or_admin},
 };
@@ -28,7 +29,6 @@ use lemmy_db_views_moderator::structs::{
   ModlogListParams,
 };
 use lemmy_utils::{error::LemmyError, ConnectionId};
-use lemmy_websocket::LemmyContext;
 use ModlogActionType::*;
 
 #[async_trait::async_trait(?Send)]
index d5a11216f4d6fd2e95e294e3b9734e69fb4acfd3..71d2c7889979422b76204f4a7f1f1b2919b12ab4 100644 (file)
@@ -1,6 +1,7 @@
 use crate::Perform;
 use actix_web::web::Data;
 use lemmy_api_common::{
+  context::LemmyContext,
   site::{PurgeComment, PurgeItemResponse},
   utils::{get_local_user_view_from_jwt, is_admin},
 };
@@ -12,7 +13,6 @@ use lemmy_db_schema::{
   traits::Crud,
 };
 use lemmy_utils::{error::LemmyError, ConnectionId};
-use lemmy_websocket::LemmyContext;
 
 #[async_trait::async_trait(?Send)]
 impl Perform for PurgeComment {
index 74373d81f8aabe2774374f79fb44455e6eabb063..e3a673b74f6d244b5cf8fdc4056fe1b846b66925 100644 (file)
@@ -1,6 +1,7 @@
 use crate::Perform;
 use actix_web::web::Data;
 use lemmy_api_common::{
+  context::LemmyContext,
   request::purge_image_from_pictrs,
   site::{PurgeCommunity, PurgeItemResponse},
   utils::{get_local_user_view_from_jwt, is_admin, purge_image_posts_for_community},
@@ -13,7 +14,6 @@ use lemmy_db_schema::{
   traits::Crud,
 };
 use lemmy_utils::{error::LemmyError, ConnectionId};
-use lemmy_websocket::LemmyContext;
 
 #[async_trait::async_trait(?Send)]
 impl Perform for PurgeCommunity {
index f5aad6e1d1ee1be1c6f52ebd51d12d7606f2b84c..658e50b6dc32fbfa3b040d486207972e28c820d0 100644 (file)
@@ -1,6 +1,7 @@
 use crate::Perform;
 use actix_web::web::Data;
 use lemmy_api_common::{
+  context::LemmyContext,
   request::purge_image_from_pictrs,
   site::{PurgeItemResponse, PurgePerson},
   utils::{get_local_user_view_from_jwt, is_admin, purge_image_posts_for_person},
@@ -13,7 +14,6 @@ use lemmy_db_schema::{
   traits::Crud,
 };
 use lemmy_utils::{error::LemmyError, ConnectionId};
-use lemmy_websocket::LemmyContext;
 
 #[async_trait::async_trait(?Send)]
 impl Perform for PurgePerson {
index ee5adf723cebbd095ae061fb23430b0ae655c7c5..aa2e74839cbaa4d230c961948185105ff10d67da 100644 (file)
@@ -1,6 +1,7 @@
 use crate::Perform;
 use actix_web::web::Data;
 use lemmy_api_common::{
+  context::LemmyContext,
   request::purge_image_from_pictrs,
   site::{PurgeItemResponse, PurgePost},
   utils::{get_local_user_view_from_jwt, is_admin},
@@ -13,7 +14,6 @@ use lemmy_db_schema::{
   traits::Crud,
 };
 use lemmy_utils::{error::LemmyError, ConnectionId};
-use lemmy_websocket::LemmyContext;
 
 #[async_trait::async_trait(?Send)]
 impl Perform for PurgePost {
index bb1252598dddf1b84c43b8a2d4b83f77d7f129ad..61a6868995079374a72742cfa11cce2143b455a7 100644 (file)
@@ -1,6 +1,7 @@
 use crate::Perform;
 use actix_web::web::Data;
 use lemmy_api_common::{
+  context::LemmyContext,
   site::{ApproveRegistrationApplication, RegistrationApplicationResponse},
   utils::{get_local_user_view_from_jwt, is_admin, send_application_approved_email},
 };
@@ -14,7 +15,6 @@ use lemmy_db_schema::{
 };
 use lemmy_db_views::structs::{LocalUserView, RegistrationApplicationView};
 use lemmy_utils::{error::LemmyError, ConnectionId};
-use lemmy_websocket::LemmyContext;
 
 #[async_trait::async_trait(?Send)]
 impl Perform for ApproveRegistrationApplication {
index 3d9ed326e635b09c5798b67dce5c96bdcdde8279..7be2e2e8e5580fb71a5ece2297e24622e940356f 100644 (file)
@@ -1,13 +1,13 @@
 use crate::Perform;
 use actix_web::web::Data;
 use lemmy_api_common::{
+  context::LemmyContext,
   site::{ListRegistrationApplications, ListRegistrationApplicationsResponse},
   utils::{get_local_user_view_from_jwt, is_admin},
 };
 use lemmy_db_schema::source::local_site::LocalSite;
 use lemmy_db_views::registration_application_view::RegistrationApplicationQuery;
 use lemmy_utils::{error::LemmyError, ConnectionId};
-use lemmy_websocket::LemmyContext;
 
 /// Lists registration applications, filterable by undenied only.
 #[async_trait::async_trait(?Send)]
index 7fb8906aff1e786c990220a8f166532cbb18b09f..fe33d17c8f19677e80ee4cbdbff3bfb877c00156 100644 (file)
@@ -1,13 +1,13 @@
 use crate::Perform;
 use actix_web::web::Data;
 use lemmy_api_common::{
+  context::LemmyContext,
   site::{GetUnreadRegistrationApplicationCount, GetUnreadRegistrationApplicationCountResponse},
   utils::{get_local_user_view_from_jwt, is_admin},
 };
 use lemmy_db_schema::source::local_site::LocalSite;
 use lemmy_db_views::structs::RegistrationApplicationView;
 use lemmy_utils::{error::LemmyError, ConnectionId};
-use lemmy_websocket::LemmyContext;
 
 #[async_trait::async_trait(?Send)]
 impl Perform for GetUnreadRegistrationApplicationCount {
index 391b84e0d21f4eb7cbde5d765e7a6c23f7017cdb..ca755bde939efd9409a8a272acf4681564e264fd 100644 (file)
@@ -1,23 +1,23 @@
 use crate::Perform;
 use actix_web::web::Data;
 use lemmy_api_common::{
+  context::LemmyContext,
   utils::get_local_user_view_from_jwt,
   websocket::{
-    CommunityJoin,
-    CommunityJoinResponse,
-    ModJoin,
-    ModJoinResponse,
-    PostJoin,
-    PostJoinResponse,
-    UserJoin,
-    UserJoinResponse,
+    messages::{JoinCommunityRoom, JoinModRoom, JoinPostRoom, JoinUserRoom},
+    structs::{
+      CommunityJoin,
+      CommunityJoinResponse,
+      ModJoin,
+      ModJoinResponse,
+      PostJoin,
+      PostJoinResponse,
+      UserJoin,
+      UserJoinResponse,
+    },
   },
 };
 use lemmy_utils::{error::LemmyError, ConnectionId};
-use lemmy_websocket::{
-  messages::{JoinCommunityRoom, JoinModRoom, JoinPostRoom, JoinUserRoom},
-  LemmyContext,
-};
 
 #[async_trait::async_trait(?Send)]
 impl Perform for UserJoin {
index bfbaa8e2577987e5acf56952e2622365b2b1089b..a4c80da523bd2bf55f59965d27cb7054eb976ed3 100644 (file)
@@ -36,6 +36,17 @@ rosetta-i18n = { workspace = true, optional = true }
 percent-encoding = { workspace = true, optional = true }
 webpage = { version = "1.4.0", default-features = false, features = ["serde"], optional = true }
 encoding = { version = "0.2.33", optional = true }
+rand = { workspace = true }
+serde_json = { workspace = true }
+actix = { workspace = true }
+anyhow = { workspace = true }
+tokio = { workspace = true }
+strum = { workspace = true }
+strum_macros = { workspace = true }
+opentelemetry = { workspace = true }
+tracing-opentelemetry = { workspace = true }
+actix-web-actors = { version = "4.1.0", default-features = false }
+background-jobs = "0.13.0"
 
 [dev-dependencies]
 actix-rt = { workspace = true }
diff --git a/crates/api_common/src/context.rs b/crates/api_common/src/context.rs
new file mode 100644 (file)
index 0000000..e552af5
--- /dev/null
@@ -0,0 +1,68 @@
+use crate::websocket::chat_server::ChatServer;
+use actix::Addr;
+use lemmy_db_schema::{source::secret::Secret, utils::DbPool};
+use lemmy_utils::{
+  rate_limit::RateLimitCell,
+  settings::{structs::Settings, SETTINGS},
+};
+use reqwest_middleware::ClientWithMiddleware;
+
+pub struct LemmyContext {
+  pool: DbPool,
+  chat_server: Addr<ChatServer>,
+  client: ClientWithMiddleware,
+  settings: Settings,
+  secret: Secret,
+  rate_limit_cell: RateLimitCell,
+}
+
+impl LemmyContext {
+  pub fn create(
+    pool: DbPool,
+    chat_server: Addr<ChatServer>,
+    client: ClientWithMiddleware,
+    settings: Settings,
+    secret: Secret,
+    rate_limit_cell: RateLimitCell,
+  ) -> LemmyContext {
+    LemmyContext {
+      pool,
+      chat_server,
+      client,
+      settings,
+      secret,
+      rate_limit_cell,
+    }
+  }
+  pub fn pool(&self) -> &DbPool {
+    &self.pool
+  }
+  pub fn chat_server(&self) -> &Addr<ChatServer> {
+    &self.chat_server
+  }
+  pub fn client(&self) -> &ClientWithMiddleware {
+    &self.client
+  }
+  pub fn settings(&self) -> &'static Settings {
+    &SETTINGS
+  }
+  pub fn secret(&self) -> &Secret {
+    &self.secret
+  }
+  pub fn settings_updated_channel(&self) -> &RateLimitCell {
+    &self.rate_limit_cell
+  }
+}
+
+impl Clone for LemmyContext {
+  fn clone(&self) -> Self {
+    LemmyContext {
+      pool: self.pool.clone(),
+      chat_server: self.chat_server.clone(),
+      client: self.client.clone(),
+      settings: self.settings.clone(),
+      secret: self.secret.clone(),
+      rate_limit_cell: self.rate_limit_cell.clone(),
+    }
+  }
+}
index ef907f88a1565f1900fd978eb51660dcf6923e9b..29686aba6d6bfb521d912166c274f0038e271e34 100644 (file)
@@ -1,5 +1,7 @@
 pub mod comment;
 pub mod community;
+#[cfg(feature = "full")]
+pub mod context;
 pub mod person;
 pub mod post;
 pub mod private_message;
@@ -9,8 +11,11 @@ pub mod sensitive;
 pub mod site;
 #[cfg(feature = "full")]
 pub mod utils;
+#[cfg(feature = "full")]
 pub mod websocket;
 
+#[macro_use]
+extern crate strum_macros;
 pub extern crate lemmy_db_schema;
 pub extern crate lemmy_db_views;
 pub extern crate lemmy_db_views_actor;
index 8c4131dd64fcfd085c2d10afaaa70203135c5823..897dd998ec7d8f98927e748e3fa02ba802900a10 100644 (file)
@@ -268,7 +268,7 @@ pub struct GetUnreadCountResponse {
   pub private_messages: i64,
 }
 
-#[derive(Serialize, Deserialize, Clone, Default)]
+#[derive(Serialize, Deserialize, Clone, Default, Debug)]
 pub struct VerifyEmail {
   pub token: String,
 }
index 1e863e855c4ec266ddae4865df5ef640ea7ed545..c85344992075cc5742d2612feea7d29ef2b61042 100644 (file)
@@ -1,8 +1,9 @@
 use crate::{request::purge_image_from_pictrs, sensitive::Sensitive, site::FederatedInstances};
+use anyhow::Context;
 use chrono::NaiveDateTime;
 use lemmy_db_schema::{
   impls::person::is_banned,
-  newtypes::{CommunityId, LocalUserId, PersonId, PostId},
+  newtypes::{CommunityId, DbUrl, LocalUserId, PersonId, PostId},
   source::{
     comment::{Comment, CommentUpdateForm},
     community::{Community, CommunityUpdateForm},
@@ -34,6 +35,7 @@ use lemmy_utils::{
   claims::Claims,
   email::{send_email, translations::Lang},
   error::LemmyError,
+  location_info,
   rate_limit::RateLimitConfig,
   settings::structs::Settings,
   utils::{build_slur_regex, generate_random_string},
@@ -43,6 +45,7 @@ use reqwest_middleware::ClientWithMiddleware;
 use rosetta_i18n::{Language, LanguageId};
 use std::str::FromStr;
 use tracing::warn;
+use url::{ParseError, Url};
 
 #[tracing::instrument(skip_all)]
 pub async fn is_mod_or_admin(
@@ -743,3 +746,65 @@ mod tests {
     assert!(honeypot_check(&Some("message".to_string())).is_err());
   }
 }
+
+pub enum EndpointType {
+  Community,
+  Person,
+  Post,
+  Comment,
+  PrivateMessage,
+}
+
+/// Generates an apub endpoint for a given domain, IE xyz.tld
+pub fn generate_local_apub_endpoint(
+  endpoint_type: EndpointType,
+  name: &str,
+  domain: &str,
+) -> Result<DbUrl, ParseError> {
+  let point = match endpoint_type {
+    EndpointType::Community => "c",
+    EndpointType::Person => "u",
+    EndpointType::Post => "post",
+    EndpointType::Comment => "comment",
+    EndpointType::PrivateMessage => "private_message",
+  };
+
+  Ok(Url::parse(&format!("{}/{}/{}", domain, point, name))?.into())
+}
+
+pub fn generate_followers_url(actor_id: &DbUrl) -> Result<DbUrl, ParseError> {
+  Ok(Url::parse(&format!("{}/followers", actor_id))?.into())
+}
+
+pub fn generate_inbox_url(actor_id: &DbUrl) -> Result<DbUrl, ParseError> {
+  Ok(Url::parse(&format!("{}/inbox", actor_id))?.into())
+}
+
+pub fn generate_site_inbox_url(actor_id: &DbUrl) -> Result<DbUrl, ParseError> {
+  let mut actor_id: Url = actor_id.clone().into();
+  actor_id.set_path("site_inbox");
+  Ok(actor_id.into())
+}
+
+pub fn generate_shared_inbox_url(actor_id: &DbUrl) -> Result<DbUrl, LemmyError> {
+  let actor_id: Url = actor_id.clone().into();
+  let url = format!(
+    "{}://{}{}/inbox",
+    &actor_id.scheme(),
+    &actor_id.host_str().context(location_info!())?,
+    if let Some(port) = actor_id.port() {
+      format!(":{}", port)
+    } else {
+      String::new()
+    },
+  );
+  Ok(Url::parse(&url)?.into())
+}
+
+pub fn generate_outbox_url(actor_id: &DbUrl) -> Result<DbUrl, ParseError> {
+  Ok(Url::parse(&format!("{}/outbox", actor_id))?.into())
+}
+
+pub fn generate_moderators_url(community_id: &DbUrl) -> Result<DbUrl, LemmyError> {
+  Ok(Url::parse(&format!("{}/moderators", community_id))?.into())
+}
similarity index 90%
rename from crates/websocket/src/chat_server.rs
rename to crates/api_common/src/websocket/chat_server.rs
index 8577e04291770fe3a587b11d30a79f355f5a0752..b669a4fd30fd7bfe21326362df9c91b54b7abf73 100644 (file)
@@ -1,14 +1,18 @@
 use crate::{
-  messages::{CaptchaItem, StandardMessage, WsMessage},
-  serialize_websocket_message,
-  LemmyContext,
-  OperationType,
-  UserOperation,
-  UserOperationCrud,
+  comment::CommentResponse,
+  context::LemmyContext,
+  post::PostResponse,
+  websocket::{
+    messages::{CaptchaItem, StandardMessage, WsMessage},
+    serialize_websocket_message,
+    OperationType,
+    UserOperation,
+    UserOperationApub,
+    UserOperationCrud,
+  },
 };
 use actix::prelude::*;
 use anyhow::Context as acontext;
-use lemmy_api_common::{comment::CommentResponse, post::PostResponse};
 use lemmy_db_schema::{
   newtypes::{CommunityId, LocalUserId, PostId},
   source::secret::Secret,
@@ -47,6 +51,13 @@ type MessageHandlerCrudType = fn(
   data: &str,
 ) -> Pin<Box<dyn Future<Output = Result<String, LemmyError>> + '_>>;
 
+type MessageHandlerApubType = fn(
+  context: LemmyContext,
+  id: ConnectionId,
+  op: UserOperationApub,
+  data: &str,
+) -> Pin<Box<dyn Future<Output = Result<String, LemmyError>> + '_>>;
+
 /// `ChatServer` manages chat rooms and responsible for coordinating chat
 /// session.
 pub struct ChatServer {
@@ -81,6 +92,7 @@ pub struct ChatServer {
 
   message_handler: MessageHandlerType,
   message_handler_crud: MessageHandlerCrudType,
+  message_handler_apub: MessageHandlerApubType,
 
   /// An HTTP Client
   client: ClientWithMiddleware,
@@ -102,6 +114,7 @@ impl ChatServer {
     pool: DbPool,
     message_handler: MessageHandlerType,
     message_handler_crud: MessageHandlerCrudType,
+    message_handler_apub: MessageHandlerApubType,
     client: ClientWithMiddleware,
     settings: Settings,
     secret: Secret,
@@ -118,6 +131,7 @@ impl ChatServer {
       captchas: Vec::new(),
       message_handler,
       message_handler_crud,
+      message_handler_apub,
       client,
       settings,
       secret,
@@ -450,16 +464,17 @@ impl ChatServer {
       None => IpAddr("blank_ip".to_string()),
     };
 
-    let context = LemmyContext {
-      pool: self.pool.clone(),
-      chat_server: ctx.address(),
-      client: self.client.clone(),
-      settings: self.settings.clone(),
-      secret: self.secret.clone(),
-      rate_limit_cell: self.rate_limit_cell.clone(),
-    };
+    let context = LemmyContext::create(
+      self.pool.clone(),
+      ctx.address(),
+      self.client.clone(),
+      self.settings.clone(),
+      self.secret.clone(),
+      self.rate_limit_cell.clone(),
+    );
     let message_handler_crud = self.message_handler_crud;
     let message_handler = self.message_handler;
+    let message_handler_apub = self.message_handler_apub;
     let rate_limiter = self.rate_limit_cell.clone();
     async move {
       let json: Value = serde_json::from_str(&msg.msg)?;
@@ -479,15 +494,21 @@ impl ChatServer {
         };
         let fut = (message_handler_crud)(context, msg.id, user_operation_crud, data);
         (passed, fut)
-      } else {
-        let user_operation = UserOperation::from_str(op)?;
+      } else if let Ok(user_operation) = UserOperation::from_str(op) {
         let passed = match user_operation {
           UserOperation::GetCaptcha => rate_limiter.post().check(ip),
-          UserOperation::Search => rate_limiter.search().check(ip),
           _ => rate_limiter.message().check(ip),
         };
         let fut = (message_handler)(context, msg.id, user_operation, data);
         (passed, fut)
+      } else {
+        let user_operation = UserOperationApub::from_str(op)?;
+        let passed = match user_operation {
+          UserOperationApub::Search => rate_limiter.search().check(ip),
+          _ => rate_limiter.message().check(ip),
+        };
+        let fut = (message_handler_apub)(context, msg.id, user_operation, data);
+        (passed, fut)
       };
 
       // if rate limit passed, execute api call future
similarity index 99%
rename from crates/websocket/src/handlers.rs
rename to crates/api_common/src/websocket/handlers.rs
index 90ef01a4b91ae47f365a4d01dd5c801c45e32f59..6f3d164c920d80381ce6b1619c277ab287741279 100644 (file)
@@ -1,4 +1,4 @@
-use crate::{
+use crate::websocket::{
   chat_server::{ChatServer, SessionInfo},
   messages::{
     CaptchaItem,
similarity index 97%
rename from crates/websocket/src/messages.rs
rename to crates/api_common/src/websocket/messages.rs
index 21b6ac4b7e256494ca15b94b9762aedfc9fbad52..f81124161b2880736d69cb767df6021fa7f81d24 100644 (file)
@@ -1,6 +1,5 @@
-use crate::UserOperation;
+use crate::{comment::CommentResponse, post::PostResponse, websocket::UserOperation};
 use actix::{prelude::*, Recipient};
-use lemmy_api_common::{comment::CommentResponse, post::PostResponse};
 use lemmy_db_schema::newtypes::{CommunityId, LocalUserId, PostId};
 use lemmy_utils::{ConnectionId, IpAddr};
 use serde::{Deserialize, Serialize};
similarity index 58%
rename from crates/websocket/src/lib.rs
rename to crates/api_common/src/websocket/mod.rs
index e73e784e2b56cf13954f1bef7bee838fc01650de..430027cfaebabf15055b4f9ed31953a3c2e09aa5 100644 (file)
@@ -1,15 +1,4 @@
-#[macro_use]
-extern crate strum_macros;
-
-use crate::chat_server::ChatServer;
-use actix::Addr;
-use lemmy_db_schema::{source::secret::Secret, utils::DbPool};
-use lemmy_utils::{
-  error::LemmyError,
-  rate_limit::RateLimitCell,
-  settings::{structs::Settings, SETTINGS},
-};
-use reqwest_middleware::ClientWithMiddleware;
+use lemmy_utils::error::LemmyError;
 use serde::Serialize;
 
 pub mod chat_server;
@@ -17,66 +6,7 @@ pub mod handlers;
 pub mod messages;
 pub mod routes;
 pub mod send;
-
-pub struct LemmyContext {
-  pool: DbPool,
-  chat_server: Addr<ChatServer>,
-  client: ClientWithMiddleware,
-  settings: Settings,
-  secret: Secret,
-  rate_limit_cell: RateLimitCell,
-}
-
-impl LemmyContext {
-  pub fn create(
-    pool: DbPool,
-    chat_server: Addr<ChatServer>,
-    client: ClientWithMiddleware,
-    settings: Settings,
-    secret: Secret,
-    settings_updated_channel: RateLimitCell,
-  ) -> LemmyContext {
-    LemmyContext {
-      pool,
-      chat_server,
-      client,
-      settings,
-      secret,
-      rate_limit_cell: settings_updated_channel,
-    }
-  }
-  pub fn pool(&self) -> &DbPool {
-    &self.pool
-  }
-  pub fn chat_server(&self) -> &Addr<ChatServer> {
-    &self.chat_server
-  }
-  pub fn client(&self) -> &ClientWithMiddleware {
-    &self.client
-  }
-  pub fn settings(&self) -> &'static Settings {
-    &SETTINGS
-  }
-  pub fn secret(&self) -> &Secret {
-    &self.secret
-  }
-  pub fn settings_updated_channel(&self) -> &RateLimitCell {
-    &self.rate_limit_cell
-  }
-}
-
-impl Clone for LemmyContext {
-  fn clone(&self) -> Self {
-    LemmyContext {
-      pool: self.pool.clone(),
-      chat_server: self.chat_server.clone(),
-      client: self.client.clone(),
-      settings: self.settings.clone(),
-      secret: self.secret.clone(),
-      rate_limit_cell: self.rate_limit_cell.clone(),
-    }
-  }
-}
+pub mod structs;
 
 #[derive(Serialize)]
 struct WebsocketResponse<T> {
@@ -133,8 +63,6 @@ pub enum UserOperation {
   ApproveRegistrationApplication,
   BanPerson,
   GetBannedPersons,
-  Search,
-  ResolveObject,
   MarkAllAsRead,
   SaveUserSettings,
   TransferCommunity,
@@ -168,27 +96,23 @@ pub enum UserOperationCrud {
   // Community
   CreateCommunity,
   ListCommunities,
-  GetCommunity,
   EditCommunity,
   DeleteCommunity,
   RemoveCommunity,
   // Post
   CreatePost,
   GetPost,
-  GetPosts,
   EditPost,
   DeletePost,
   RemovePost,
   // Comment
   CreateComment,
   GetComment,
-  GetComments,
   EditComment,
   DeleteComment,
   RemoveComment,
   // User
   Register,
-  GetPersonDetails,
   DeleteAccount,
   // Private Message
   CreatePrivateMessage,
@@ -197,8 +121,20 @@ pub enum UserOperationCrud {
   DeletePrivateMessage,
 }
 
+#[derive(EnumString, Display, Debug, Clone)]
+pub enum UserOperationApub {
+  GetPosts,
+  GetCommunity,
+  GetComments,
+  GetPersonDetails,
+  Search,
+  ResolveObject,
+}
+
 pub trait OperationType {}
 
 impl OperationType for UserOperationCrud {}
 
 impl OperationType for UserOperation {}
+
+impl OperationType for UserOperationApub {}
similarity index 97%
rename from crates/websocket/src/routes.rs
rename to crates/api_common/src/websocket/routes.rs
index a3b1b0460168a6cb1d118f505448616a1cd56816..936dc9998c2b495caa14f9782d48001b0de27e83 100644 (file)
@@ -1,7 +1,9 @@
 use crate::{
-  chat_server::ChatServer,
-  messages::{Connect, Disconnect, StandardMessage, WsMessage},
-  LemmyContext,
+  context::LemmyContext,
+  websocket::{
+    chat_server::ChatServer,
+    messages::{Connect, Disconnect, StandardMessage, WsMessage},
+  },
 };
 use actix::prelude::*;
 use actix_web::{web, Error, HttpRequest, HttpResponse};
similarity index 98%
rename from crates/websocket/src/send.rs
rename to crates/api_common/src/websocket/send.rs
index 2793534f44e2654bafbfae933685be232f6174cc..cd53955f9f42791d602668e871c2883f0135cd79 100644 (file)
@@ -1,14 +1,14 @@
 use crate::{
-  messages::{SendComment, SendCommunityRoomMessage, SendPost, SendUserRoomMessage},
-  LemmyContext,
-  OperationType,
-};
-use lemmy_api_common::{
   comment::CommentResponse,
   community::CommunityResponse,
+  context::LemmyContext,
   post::PostResponse,
   private_message::PrivateMessageResponse,
   utils::{check_person_block, get_interface_language, send_email_to_user},
+  websocket::{
+    messages::{SendComment, SendCommunityRoomMessage, SendPost, SendUserRoomMessage},
+    OperationType,
+  },
 };
 use lemmy_db_schema::{
   newtypes::{CommentId, CommunityId, LocalUserId, PersonId, PostId, PrivateMessageId},
index b4f68a8df789c89f27975105506401a7cd1a4982..2d1774463c1a1515fc5d32a1941856d064b91db5 100644 (file)
@@ -9,13 +9,11 @@ documentation.workspace = true
 repository.workspace = true
 
 [dependencies]
-lemmy_apub = { workspace = true }
 lemmy_utils = { workspace = true }
 lemmy_db_schema = { workspace = true, features = ["full"] }
 lemmy_db_views = { workspace = true, features = ["full"] }
 lemmy_db_views_actor = { workspace = true, features = ["full"] }
 lemmy_api_common = { workspace = true, features = ["full"] }
-lemmy_websocket = { workspace = true }
 activitypub_federation = { workspace = true }
 bcrypt = { workspace = true }
 serde_json = { workspace = true }
index f027b0fe2b6c12317581b77e612d1f6049b9c066..8c61a0444cfb23cf3422b9eda7f3b07134fb3a36 100644 (file)
@@ -2,20 +2,21 @@ use crate::PerformCrud;
 use actix_web::web::Data;
 use lemmy_api_common::{
   comment::{CommentResponse, CreateComment},
+  context::LemmyContext,
   utils::{
     check_community_ban,
     check_community_deleted_or_removed,
     check_post_deleted_or_removed,
+    generate_local_apub_endpoint,
     get_local_user_view_from_jwt,
     get_post,
     local_site_to_slur_regex,
+    EndpointType,
+  },
+  websocket::{
+    send::{send_comment_ws_message, send_local_notifs},
+    UserOperationCrud,
   },
-};
-use lemmy_apub::{
-  generate_local_apub_endpoint,
-  objects::comment::ApubComment,
-  protocol::activities::{create_or_update::note::CreateOrUpdateNote, CreateOrUpdateType},
-  EndpointType,
 };
 use lemmy_db_schema::{
   source::{
@@ -32,11 +33,6 @@ use lemmy_utils::{
   utils::{remove_slurs, scrape_text_for_mentions},
   ConnectionId,
 };
-use lemmy_websocket::{
-  send::{send_comment_ws_message, send_local_notifs},
-  LemmyContext,
-  UserOperationCrud,
-};
 
 #[async_trait::async_trait(?Send)]
 impl PerformCrud for CreateComment {
@@ -157,16 +153,6 @@ impl PerformCrud for CreateComment {
       .await
       .map_err(|e| LemmyError::from_error_message(e, "couldnt_like_comment"))?;
 
-    let apub_comment: ApubComment = updated_comment.into();
-    CreateOrUpdateNote::send(
-      apub_comment.clone(),
-      &local_user_view.person.clone().into(),
-      CreateOrUpdateType::Create,
-      context,
-      &mut 0,
-    )
-    .await?;
-
     // If its a reply, mark the parent as read
     if let Some(parent) = parent_opt {
       let parent_id = parent.id;
index 549d2f36697c7d134857bf93fe6e01e6465ebdef..211d04776747bdf06b8090f61d2260560686bee8 100644 (file)
@@ -2,24 +2,22 @@ use crate::PerformCrud;
 use actix_web::web::Data;
 use lemmy_api_common::{
   comment::{CommentResponse, DeleteComment},
+  context::LemmyContext,
   utils::{check_community_ban, get_local_user_view_from_jwt},
+  websocket::{
+    send::{send_comment_ws_message, send_local_notifs},
+    UserOperationCrud,
+  },
 };
-use lemmy_apub::activities::deletion::{send_apub_delete_in_community, DeletableObjects};
 use lemmy_db_schema::{
   source::{
     comment::{Comment, CommentUpdateForm},
-    community::Community,
     post::Post,
   },
   traits::Crud,
 };
 use lemmy_db_views::structs::CommentView;
 use lemmy_utils::{error::LemmyError, ConnectionId};
-use lemmy_websocket::{
-  send::{send_comment_ws_message, send_local_notifs},
-  LemmyContext,
-  UserOperationCrud,
-};
 
 #[async_trait::async_trait(?Send)]
 impl PerformCrud for DeleteComment {
@@ -88,19 +86,6 @@ impl PerformCrud for DeleteComment {
     )
     .await?;
 
-    // Send the apub message
-    let community = Community::read(context.pool(), orig_comment.post.community_id).await?;
-    let deletable = DeletableObjects::Comment(Box::new(updated_comment.clone().into()));
-    send_apub_delete_in_community(
-      local_user_view.person,
-      community,
-      deletable,
-      None,
-      deleted,
-      context,
-    )
-    .await?;
-
     Ok(res)
   }
 }
index 1e8328034d89d61d25e563985ddb8618a153f58b..d3d789a02ab30217a8be7e11ee3dee5b707360cf 100644 (file)
@@ -1,6 +1,5 @@
 mod create;
 mod delete;
-mod list;
 mod read;
 mod remove;
 mod update;
index 7d5779ffef54ba098c7cff52a5ef87f292f95234..c0136f06cb28b8e24cbb9449bd9151eb96936bc3 100644 (file)
@@ -2,12 +2,12 @@ use crate::PerformCrud;
 use actix_web::web::Data;
 use lemmy_api_common::{
   comment::{CommentResponse, GetComment},
+  context::LemmyContext,
   utils::{check_private_instance, get_local_user_view_from_jwt_opt},
 };
 use lemmy_db_schema::source::local_site::LocalSite;
 use lemmy_db_views::structs::CommentView;
 use lemmy_utils::{error::LemmyError, ConnectionId};
-use lemmy_websocket::LemmyContext;
 
 #[async_trait::async_trait(?Send)]
 impl PerformCrud for GetComment {
index c1e581e0c39295559baa94a7182d9ac3c0f73e67..1032f54c9f985614bd8961ff82184e6219a4ba7b 100644 (file)
@@ -2,13 +2,16 @@ use crate::PerformCrud;
 use actix_web::web::Data;
 use lemmy_api_common::{
   comment::{CommentResponse, RemoveComment},
+  context::LemmyContext,
   utils::{check_community_ban, get_local_user_view_from_jwt, is_mod_or_admin},
+  websocket::{
+    send::{send_comment_ws_message, send_local_notifs},
+    UserOperationCrud,
+  },
 };
-use lemmy_apub::activities::deletion::{send_apub_delete_in_community, DeletableObjects};
 use lemmy_db_schema::{
   source::{
     comment::{Comment, CommentUpdateForm},
-    community::Community,
     moderator::{ModRemoveComment, ModRemoveCommentForm},
     post::Post,
   },
@@ -16,11 +19,6 @@ use lemmy_db_schema::{
 };
 use lemmy_db_views::structs::CommentView;
 use lemmy_utils::{error::LemmyError, ConnectionId};
-use lemmy_websocket::{
-  send::{send_comment_ws_message, send_local_notifs},
-  LemmyContext,
-  UserOperationCrud,
-};
 
 #[async_trait::async_trait(?Send)]
 impl PerformCrud for RemoveComment {
@@ -96,19 +94,6 @@ impl PerformCrud for RemoveComment {
     )
     .await?;
 
-    // Send the apub message
-    let community = Community::read(context.pool(), orig_comment.post.community_id).await?;
-    let deletable = DeletableObjects::Comment(Box::new(updated_comment.clone().into()));
-    send_apub_delete_in_community(
-      local_user_view.person,
-      community,
-      deletable,
-      data.reason.clone().or_else(|| Some(String::new())),
-      removed,
-      context,
-    )
-    .await?;
-
     Ok(res)
   }
 }
index 0d89acc2924c6657cf6b1fdb64ad5ab915e7d300..88de41158ea44863992c69172f69421938cdb715 100644 (file)
@@ -2,6 +2,7 @@ use crate::PerformCrud;
 use actix_web::web::Data;
 use lemmy_api_common::{
   comment::{CommentResponse, EditComment},
+  context::LemmyContext,
   utils::{
     check_community_ban,
     check_community_deleted_or_removed,
@@ -10,10 +11,10 @@ use lemmy_api_common::{
     is_mod_or_admin,
     local_site_to_slur_regex,
   },
-};
-use lemmy_apub::protocol::activities::{
-  create_or_update::note::CreateOrUpdateNote,
-  CreateOrUpdateType,
+  websocket::{
+    send::{send_comment_ws_message, send_local_notifs},
+    UserOperationCrud,
+  },
 };
 use lemmy_db_schema::{
   source::{
@@ -29,11 +30,6 @@ use lemmy_utils::{
   utils::{remove_slurs, scrape_text_for_mentions},
   ConnectionId,
 };
-use lemmy_websocket::{
-  send::{send_comment_ws_message, send_local_notifs},
-  LemmyContext,
-  UserOperationCrud,
-};
 
 #[async_trait::async_trait(?Send)]
 impl PerformCrud for EditComment {
@@ -114,16 +110,6 @@ impl PerformCrud for EditComment {
     )
     .await?;
 
-    // Send the apub update
-    CreateOrUpdateNote::send(
-      updated_comment.into(),
-      &local_user_view.person.into(),
-      CreateOrUpdateType::Update,
-      context,
-      &mut 0,
-    )
-    .await?;
-
     send_comment_ws_message(
       data.comment_id,
       UserOperationCrud::EditComment,
index 437671eef4d0ad83bd594029a7a2ca9a1062e968..cf894edbd62abd0d00d8623f6ab4a809e9127b33 100644 (file)
@@ -1,17 +1,19 @@
 use crate::PerformCrud;
-use activitypub_federation::core::{object_id::ObjectId, signatures::generate_actor_keypair};
+use activitypub_federation::core::signatures::generate_actor_keypair;
 use actix_web::web::Data;
 use lemmy_api_common::{
   community::{CommunityResponse, CreateCommunity},
-  utils::{get_local_user_view_from_jwt, is_admin, local_site_to_slur_regex},
-};
-use lemmy_apub::{
-  generate_followers_url,
-  generate_inbox_url,
-  generate_local_apub_endpoint,
-  generate_shared_inbox_url,
-  objects::community::ApubCommunity,
-  EndpointType,
+  context::LemmyContext,
+  utils::{
+    generate_followers_url,
+    generate_inbox_url,
+    generate_local_apub_endpoint,
+    generate_shared_inbox_url,
+    get_local_user_view_from_jwt,
+    is_admin,
+    local_site_to_slur_regex,
+    EndpointType,
+  },
 };
 use lemmy_db_schema::{
   source::community::{
@@ -22,7 +24,7 @@ use lemmy_db_schema::{
     CommunityModerator,
     CommunityModeratorForm,
   },
-  traits::{Crud, Followable, Joinable},
+  traits::{ApubActor, Crud, Followable, Joinable},
   utils::diesel_option_overwrite_to_url_create,
 };
 use lemmy_db_views::structs::SiteView;
@@ -32,7 +34,6 @@ use lemmy_utils::{
   utils::{check_slurs, check_slurs_opt, is_valid_actor_name},
   ConnectionId,
 };
-use lemmy_websocket::LemmyContext;
 
 #[async_trait::async_trait(?Send)]
 impl PerformCrud for CreateCommunity {
@@ -75,9 +76,8 @@ impl PerformCrud for CreateCommunity {
       &data.name,
       &context.settings().get_protocol_and_hostname(),
     )?;
-    let community_actor_id_wrapped = ObjectId::<ApubCommunity>::new(community_actor_id.clone());
-    let community_dupe = community_actor_id_wrapped.dereference_local(context).await;
-    if community_dupe.is_ok() {
+    let community_dupe = Community::read_from_apub_id(context.pool(), &community_actor_id).await?;
+    if community_dupe.is_some() {
       return Err(LemmyError::from_message("community_already_exists"));
     }
 
index 41f14b527216499f8ee9a3d9f267f775e764aaac..84de55477eac0da1db91b9927046e0fc06bd80a1 100644 (file)
@@ -2,16 +2,16 @@ use crate::PerformCrud;
 use actix_web::web::Data;
 use lemmy_api_common::{
   community::{CommunityResponse, DeleteCommunity},
+  context::LemmyContext,
   utils::get_local_user_view_from_jwt,
+  websocket::{send::send_community_ws_message, UserOperationCrud},
 };
-use lemmy_apub::activities::deletion::{send_apub_delete_in_community, DeletableObjects};
 use lemmy_db_schema::{
   source::community::{Community, CommunityUpdateForm},
   traits::Crud,
 };
 use lemmy_db_views_actor::structs::CommunityModeratorView;
 use lemmy_utils::{error::LemmyError, ConnectionId};
-use lemmy_websocket::{send::send_community_ws_message, LemmyContext, UserOperationCrud};
 
 #[async_trait::async_trait(?Send)]
 impl PerformCrud for DeleteCommunity {
@@ -40,7 +40,7 @@ impl PerformCrud for DeleteCommunity {
     // Do the delete
     let community_id = data.community_id;
     let deleted = data.deleted;
-    let updated_community = Community::update(
+    Community::update(
       context.pool(),
       community_id,
       &CommunityUpdateForm::builder()
@@ -59,18 +59,6 @@ impl PerformCrud for DeleteCommunity {
     )
     .await?;
 
-    // Send apub messages
-    let deletable = DeletableObjects::Community(Box::new(updated_community.clone().into()));
-    send_apub_delete_in_community(
-      local_user_view.person,
-      updated_community,
-      deletable,
-      None,
-      deleted,
-      context,
-    )
-    .await?;
-
     Ok(res)
   }
 }
index 37a9d88a4cefbba6b19bde59a93ea943fd8178ef..4d2e7046fe42a02f0b29524272f2cef773e41d3f 100644 (file)
@@ -2,12 +2,12 @@ use crate::PerformCrud;
 use actix_web::web::Data;
 use lemmy_api_common::{
   community::{ListCommunities, ListCommunitiesResponse},
+  context::LemmyContext,
   utils::{check_private_instance, get_local_user_view_from_jwt_opt},
 };
 use lemmy_db_schema::{source::local_site::LocalSite, traits::DeleteableOrRemoveable};
 use lemmy_db_views_actor::community_view::CommunityQuery;
 use lemmy_utils::{error::LemmyError, ConnectionId};
-use lemmy_websocket::LemmyContext;
 
 #[async_trait::async_trait(?Send)]
 impl PerformCrud for ListCommunities {
index 1e8328034d89d61d25e563985ddb8618a153f58b..3fc7416525e0f98aa34411b85c7be239be89b998 100644 (file)
@@ -1,6 +1,5 @@
 mod create;
 mod delete;
 mod list;
-mod read;
 mod remove;
 mod update;
index 1977f5cd1c087080900a8f9403496b978eac54d8..215b39cf4a19e974023e90efb0a3ee2857554353 100644 (file)
@@ -2,9 +2,10 @@ use crate::PerformCrud;
 use actix_web::web::Data;
 use lemmy_api_common::{
   community::{CommunityResponse, RemoveCommunity},
+  context::LemmyContext,
   utils::{get_local_user_view_from_jwt, is_admin},
+  websocket::{send::send_community_ws_message, UserOperationCrud},
 };
-use lemmy_apub::activities::deletion::{send_apub_delete_in_community, DeletableObjects};
 use lemmy_db_schema::{
   source::{
     community::{Community, CommunityUpdateForm},
@@ -13,7 +14,6 @@ use lemmy_db_schema::{
   traits::Crud,
 };
 use lemmy_utils::{error::LemmyError, utils::naive_from_unix, ConnectionId};
-use lemmy_websocket::{send::send_community_ws_message, LemmyContext, UserOperationCrud};
 
 #[async_trait::async_trait(?Send)]
 impl PerformCrud for RemoveCommunity {
@@ -35,7 +35,7 @@ impl PerformCrud for RemoveCommunity {
     // Do the remove
     let community_id = data.community_id;
     let removed = data.removed;
-    let updated_community = Community::update(
+    Community::update(
       context.pool(),
       community_id,
       &CommunityUpdateForm::builder()
@@ -65,17 +65,6 @@ impl PerformCrud for RemoveCommunity {
     )
     .await?;
 
-    // Apub messages
-    let deletable = DeletableObjects::Community(Box::new(updated_community.clone().into()));
-    send_apub_delete_in_community(
-      local_user_view.person,
-      updated_community,
-      deletable,
-      data.reason.clone().or_else(|| Some(String::new())),
-      removed,
-      context,
-    )
-    .await?;
     Ok(res)
   }
 }
index 8e60b3f8805623aee51d3a32cf11c24f621eee49..9059a4a6f636ac5e490ca8d0e1e72e145e11d1d0 100644 (file)
@@ -2,9 +2,10 @@ use crate::PerformCrud;
 use actix_web::web::Data;
 use lemmy_api_common::{
   community::{CommunityResponse, EditCommunity},
+  context::LemmyContext,
   utils::{get_local_user_view_from_jwt, local_site_to_slur_regex},
+  websocket::{send::send_community_ws_message, UserOperationCrud},
 };
-use lemmy_apub::protocol::activities::community::update::UpdateCommunity;
 use lemmy_db_schema::{
   newtypes::PersonId,
   source::{
@@ -17,7 +18,6 @@ use lemmy_db_schema::{
 };
 use lemmy_db_views_actor::structs::CommunityModeratorView;
 use lemmy_utils::{error::LemmyError, utils::check_slurs_opt, ConnectionId};
-use lemmy_websocket::{send::send_community_ws_message, LemmyContext, UserOperationCrud};
 
 #[async_trait::async_trait(?Send)]
 impl PerformCrud for EditCommunity {
@@ -73,17 +73,10 @@ impl PerformCrud for EditCommunity {
       .build();
 
     let community_id = data.community_id;
-    let updated_community = Community::update(context.pool(), community_id, &community_form)
+    Community::update(context.pool(), community_id, &community_form)
       .await
       .map_err(|e| LemmyError::from_error_message(e, "couldnt_update_community"))?;
 
-    UpdateCommunity::send(
-      updated_community.into(),
-      &local_user_view.person.into(),
-      context,
-    )
-    .await?;
-
     let op = UserOperationCrud::EditCommunity;
     send_community_ws_message(data.community_id, op, websocket_id, None, context).await
   }
index b50d3cd27ae28f1ee80575b2a4ba3e37e4f94a68..d37dfbee243133ec56a8650f5d6487efb62f8e12 100644 (file)
@@ -1,27 +1,6 @@
-use actix_web::{web, web::Data};
-use lemmy_api_common::{
-  comment::{CreateComment, DeleteComment, EditComment, GetComment, GetComments, RemoveComment},
-  community::{
-    CreateCommunity,
-    DeleteCommunity,
-    EditCommunity,
-    GetCommunity,
-    ListCommunities,
-    RemoveCommunity,
-  },
-  person::{DeleteAccount, GetPersonDetails, Register},
-  post::{CreatePost, DeletePost, EditPost, GetPost, GetPosts, RemovePost},
-  private_message::{
-    CreatePrivateMessage,
-    DeletePrivateMessage,
-    EditPrivateMessage,
-    GetPrivateMessages,
-  },
-  site::{CreateSite, EditSite, GetSite},
-};
+use actix_web::web::Data;
+use lemmy_api_common::context::LemmyContext;
 use lemmy_utils::{error::LemmyError, ConnectionId};
-use lemmy_websocket::{serialize_websocket_message, LemmyContext, UserOperationCrud};
-use serde::Deserialize;
 
 mod comment;
 mod community;
@@ -40,115 +19,3 @@ pub trait PerformCrud {
     websocket_id: Option<ConnectionId>,
   ) -> Result<Self::Response, LemmyError>;
 }
-
-pub async fn match_websocket_operation_crud(
-  context: LemmyContext,
-  id: ConnectionId,
-  op: UserOperationCrud,
-  data: &str,
-) -> Result<String, LemmyError> {
-  //TODO: handle commented out actions in crud crate
-
-  match op {
-    // User ops
-    UserOperationCrud::Register => do_websocket_operation::<Register>(context, id, op, data).await,
-    UserOperationCrud::GetPersonDetails => {
-      do_websocket_operation::<GetPersonDetails>(context, id, op, data).await
-    }
-    UserOperationCrud::DeleteAccount => {
-      do_websocket_operation::<DeleteAccount>(context, id, op, data).await
-    }
-
-    // Private Message ops
-    UserOperationCrud::CreatePrivateMessage => {
-      do_websocket_operation::<CreatePrivateMessage>(context, id, op, data).await
-    }
-    UserOperationCrud::EditPrivateMessage => {
-      do_websocket_operation::<EditPrivateMessage>(context, id, op, data).await
-    }
-    UserOperationCrud::DeletePrivateMessage => {
-      do_websocket_operation::<DeletePrivateMessage>(context, id, op, data).await
-    }
-    UserOperationCrud::GetPrivateMessages => {
-      do_websocket_operation::<GetPrivateMessages>(context, id, op, data).await
-    }
-
-    // Site ops
-    UserOperationCrud::CreateSite => {
-      do_websocket_operation::<CreateSite>(context, id, op, data).await
-    }
-    UserOperationCrud::EditSite => do_websocket_operation::<EditSite>(context, id, op, data).await,
-    UserOperationCrud::GetSite => do_websocket_operation::<GetSite>(context, id, op, data).await,
-
-    // Community ops
-    UserOperationCrud::GetCommunity => {
-      do_websocket_operation::<GetCommunity>(context, id, op, data).await
-    }
-    UserOperationCrud::ListCommunities => {
-      do_websocket_operation::<ListCommunities>(context, id, op, data).await
-    }
-    UserOperationCrud::CreateCommunity => {
-      do_websocket_operation::<CreateCommunity>(context, id, op, data).await
-    }
-    UserOperationCrud::EditCommunity => {
-      do_websocket_operation::<EditCommunity>(context, id, op, data).await
-    }
-    UserOperationCrud::DeleteCommunity => {
-      do_websocket_operation::<DeleteCommunity>(context, id, op, data).await
-    }
-    UserOperationCrud::RemoveCommunity => {
-      do_websocket_operation::<RemoveCommunity>(context, id, op, data).await
-    }
-
-    // Post ops
-    UserOperationCrud::CreatePost => {
-      do_websocket_operation::<CreatePost>(context, id, op, data).await
-    }
-    UserOperationCrud::GetPost => do_websocket_operation::<GetPost>(context, id, op, data).await,
-    UserOperationCrud::GetPosts => do_websocket_operation::<GetPosts>(context, id, op, data).await,
-    UserOperationCrud::EditPost => do_websocket_operation::<EditPost>(context, id, op, data).await,
-    UserOperationCrud::DeletePost => {
-      do_websocket_operation::<DeletePost>(context, id, op, data).await
-    }
-    UserOperationCrud::RemovePost => {
-      do_websocket_operation::<RemovePost>(context, id, op, data).await
-    }
-
-    // Comment ops
-    UserOperationCrud::CreateComment => {
-      do_websocket_operation::<CreateComment>(context, id, op, data).await
-    }
-    UserOperationCrud::EditComment => {
-      do_websocket_operation::<EditComment>(context, id, op, data).await
-    }
-    UserOperationCrud::DeleteComment => {
-      do_websocket_operation::<DeleteComment>(context, id, op, data).await
-    }
-    UserOperationCrud::RemoveComment => {
-      do_websocket_operation::<RemoveComment>(context, id, op, data).await
-    }
-    UserOperationCrud::GetComment => {
-      do_websocket_operation::<GetComment>(context, id, op, data).await
-    }
-    UserOperationCrud::GetComments => {
-      do_websocket_operation::<GetComments>(context, id, op, data).await
-    }
-  }
-}
-
-async fn do_websocket_operation<'a, 'b, Data>(
-  context: LemmyContext,
-  id: ConnectionId,
-  op: UserOperationCrud,
-  data: &str,
-) -> Result<String, LemmyError>
-where
-  for<'de> Data: Deserialize<'de> + 'a,
-  Data: PerformCrud,
-{
-  let parsed_data: Data = serde_json::from_str(data)?;
-  let res = parsed_data
-    .perform(&web::Data::new(context), Some(id))
-    .await?;
-  serialize_websocket_message(&op, &res)
-}
index cad8b28e227f7ad50bed13f2678c953f04e58c06..af62135e2a89807443563f3f203c6b4ac0a6b454 100644 (file)
@@ -1,22 +1,20 @@
 use crate::PerformCrud;
 use actix_web::web::Data;
 use lemmy_api_common::{
+  context::LemmyContext,
   post::{CreatePost, PostResponse},
   request::fetch_site_data,
   utils::{
     check_community_ban,
     check_community_deleted_or_removed,
+    generate_local_apub_endpoint,
     get_local_user_view_from_jwt,
     honeypot_check,
     local_site_to_slur_regex,
     mark_post_as_read,
+    EndpointType,
   },
-};
-use lemmy_apub::{
-  generate_local_apub_endpoint,
-  objects::post::ApubPost,
-  protocol::activities::{create_or_update::page::CreateOrUpdatePage, CreateOrUpdateType},
-  EndpointType,
+  websocket::{send::send_post_ws_message, UserOperationCrud},
 };
 use lemmy_db_schema::{
   impls::actor_language::default_post_language,
@@ -34,7 +32,6 @@ use lemmy_utils::{
   utils::{check_slurs, check_slurs_opt, clean_url_params, is_valid_post_title},
   ConnectionId,
 };
-use lemmy_websocket::{send::send_post_ws_message, LemmyContext, UserOperationCrud};
 use tracing::{warn, Instrument};
 use url::Url;
 use webmention::{Webmention, WebmentionError};
@@ -173,15 +170,6 @@ impl PerformCrud for CreatePost {
       }
     }
 
-    let apub_post: ApubPost = updated_post.into();
-    CreateOrUpdatePage::send(
-      apub_post.clone(),
-      &local_user_view.person.clone().into(),
-      CreateOrUpdateType::Create,
-      context,
-    )
-    .await?;
-
     send_post_ws_message(
       inserted_post.id,
       UserOperationCrud::CreatePost,
index a0b930084c26005cc6f37b05c29b3f802b1d332a..57e5adb15f81b6b054231b7275f70114b688bf86 100644 (file)
@@ -1,19 +1,16 @@
 use crate::PerformCrud;
 use actix_web::web::Data;
 use lemmy_api_common::{
+  context::LemmyContext,
   post::{DeletePost, PostResponse},
   utils::{check_community_ban, check_community_deleted_or_removed, get_local_user_view_from_jwt},
+  websocket::{send::send_post_ws_message, UserOperationCrud},
 };
-use lemmy_apub::activities::deletion::{send_apub_delete_in_community, DeletableObjects};
 use lemmy_db_schema::{
-  source::{
-    community::Community,
-    post::{Post, PostUpdateForm},
-  },
+  source::post::{Post, PostUpdateForm},
   traits::Crud,
 };
 use lemmy_utils::{error::LemmyError, ConnectionId};
-use lemmy_websocket::{send::send_post_ws_message, LemmyContext, UserOperationCrud};
 
 #[async_trait::async_trait(?Send)]
 impl PerformCrud for DeletePost {
@@ -53,7 +50,7 @@ impl PerformCrud for DeletePost {
     // Update the post
     let post_id = data.post_id;
     let deleted = data.deleted;
-    let updated_post = Post::update(
+    Post::update(
       context.pool(),
       post_id,
       &PostUpdateForm::builder().deleted(Some(deleted)).build(),
@@ -69,18 +66,6 @@ impl PerformCrud for DeletePost {
     )
     .await?;
 
-    // apub updates
-    let community = Community::read(context.pool(), orig_post.community_id).await?;
-    let deletable = DeletableObjects::Post(Box::new(updated_post.into()));
-    send_apub_delete_in_community(
-      local_user_view.person,
-      community,
-      deletable,
-      None,
-      deleted,
-      context,
-    )
-    .await?;
     Ok(res)
   }
 }
index 1e8328034d89d61d25e563985ddb8618a153f58b..d3d789a02ab30217a8be7e11ee3dee5b707360cf 100644 (file)
@@ -1,6 +1,5 @@
 mod create;
 mod delete;
-mod list;
 mod read;
 mod remove;
 mod update;
index 5e2582a07c360f25cb778f7aa9fecc7cdd3929bb..c6747c5e8361b5512c23b89220152c883ed377b7 100644 (file)
@@ -1,8 +1,10 @@
 use crate::PerformCrud;
 use actix_web::web::Data;
 use lemmy_api_common::{
+  context::LemmyContext,
   post::{GetPost, GetPostResponse},
   utils::{check_private_instance, get_local_user_view_from_jwt_opt, mark_post_as_read},
+  websocket::messages::GetPostUsersOnline,
 };
 use lemmy_db_schema::{
   aggregates::structs::{PersonPostAggregates, PersonPostAggregatesForm},
@@ -12,7 +14,6 @@ use lemmy_db_schema::{
 use lemmy_db_views::structs::PostView;
 use lemmy_db_views_actor::structs::{CommunityModeratorView, CommunityView};
 use lemmy_utils::{error::LemmyError, ConnectionId};
-use lemmy_websocket::{messages::GetPostUsersOnline, LemmyContext};
 
 #[async_trait::async_trait(?Send)]
 impl PerformCrud for GetPost {
index b062bc6537d1b5a44da21312f81f6e6545aa04c0..66af2ca959f25474d0ab0707edb1720d3b712ffa 100644 (file)
@@ -1,20 +1,19 @@
 use crate::PerformCrud;
 use actix_web::web::Data;
 use lemmy_api_common::{
+  context::LemmyContext,
   post::{PostResponse, RemovePost},
   utils::{check_community_ban, get_local_user_view_from_jwt, is_mod_or_admin},
+  websocket::{send::send_post_ws_message, UserOperationCrud},
 };
-use lemmy_apub::activities::deletion::{send_apub_delete_in_community, DeletableObjects};
 use lemmy_db_schema::{
   source::{
-    community::Community,
     moderator::{ModRemovePost, ModRemovePostForm},
     post::{Post, PostUpdateForm},
   },
   traits::Crud,
 };
 use lemmy_utils::{error::LemmyError, ConnectionId};
-use lemmy_websocket::{send::send_post_ws_message, LemmyContext, UserOperationCrud};
 
 #[async_trait::async_trait(?Send)]
 impl PerformCrud for RemovePost {
@@ -51,7 +50,7 @@ impl PerformCrud for RemovePost {
     // Update the post
     let post_id = data.post_id;
     let removed = data.removed;
-    let updated_post = Post::update(
+    Post::update(
       context.pool(),
       post_id,
       &PostUpdateForm::builder().removed(Some(removed)).build(),
@@ -76,18 +75,6 @@ impl PerformCrud for RemovePost {
     )
     .await?;
 
-    // apub updates
-    let community = Community::read(context.pool(), orig_post.community_id).await?;
-    let deletable = DeletableObjects::Post(Box::new(updated_post.into()));
-    send_apub_delete_in_community(
-      local_user_view.person,
-      community,
-      deletable,
-      data.reason.clone().or_else(|| Some(String::new())),
-      removed,
-      context,
-    )
-    .await?;
     Ok(res)
   }
 }
index 11b566bc92bcb1e9a4206ce7a0aff279e38f6bd8..9337c595271c90e32ce8c0afd840270bdff70acf 100644 (file)
@@ -1,6 +1,7 @@
 use crate::PerformCrud;
 use actix_web::web::Data;
 use lemmy_api_common::{
+  context::LemmyContext,
   post::{EditPost, PostResponse},
   request::fetch_site_data,
   utils::{
@@ -9,10 +10,7 @@ use lemmy_api_common::{
     get_local_user_view_from_jwt,
     local_site_to_slur_regex,
   },
-};
-use lemmy_apub::protocol::activities::{
-  create_or_update::page::CreateOrUpdatePage,
-  CreateOrUpdateType,
+  websocket::{send::send_post_ws_message, UserOperationCrud},
 };
 use lemmy_db_schema::{
   source::{
@@ -28,7 +26,6 @@ use lemmy_utils::{
   utils::{check_slurs_opt, clean_url_params, is_valid_post_title},
   ConnectionId,
 };
-use lemmy_websocket::{send::send_post_ws_message, LemmyContext, UserOperationCrud};
 
 #[async_trait::async_trait(?Send)]
 impl PerformCrud for EditPost {
@@ -108,27 +105,15 @@ impl PerformCrud for EditPost {
 
     let post_id = data.post_id;
     let res = Post::update(context.pool(), post_id, &post_form).await;
-    let updated_post: Post = match res {
-      Ok(post) => post,
-      Err(e) => {
-        let err_type = if e.to_string() == "value too long for type character varying(200)" {
-          "post_title_too_long"
-        } else {
-          "couldnt_update_post"
-        };
-
-        return Err(LemmyError::from_error_message(e, err_type));
-      }
-    };
-
-    // Send apub update
-    CreateOrUpdatePage::send(
-      updated_post.into(),
-      &local_user_view.person.clone().into(),
-      CreateOrUpdateType::Update,
-      context,
-    )
-    .await?;
+    if let Err(e) = res {
+      let err_type = if e.to_string() == "value too long for type character varying(200)" {
+        "post_title_too_long"
+      } else {
+        "couldnt_update_post"
+      };
+
+      return Err(LemmyError::from_error_message(e, err_type));
+    }
 
     send_post_ws_message(
       data.post_id,
index 35bc09e2291245f7b4c65ffd42f5f369c164edd6..25c7be467d063dce24ab4cce2502276472a73713 100644 (file)
@@ -1,22 +1,18 @@
 use crate::PerformCrud;
 use actix_web::web::Data;
 use lemmy_api_common::{
+  context::LemmyContext,
   private_message::{CreatePrivateMessage, PrivateMessageResponse},
   utils::{
     check_person_block,
+    generate_local_apub_endpoint,
     get_interface_language,
     get_local_user_view_from_jwt,
     local_site_to_slur_regex,
     send_email_to_user,
+    EndpointType,
   },
-};
-use lemmy_apub::{
-  generate_local_apub_endpoint,
-  protocol::activities::{
-    create_or_update::chat_message::CreateOrUpdateChatMessage,
-    CreateOrUpdateType,
-  },
-  EndpointType,
+  websocket::{send::send_pm_ws_message, UserOperationCrud},
 };
 use lemmy_db_schema::{
   source::{
@@ -27,7 +23,6 @@ use lemmy_db_schema::{
 };
 use lemmy_db_views::structs::LocalUserView;
 use lemmy_utils::{error::LemmyError, utils::remove_slurs, ConnectionId};
-use lemmy_websocket::{send::send_pm_ws_message, LemmyContext, UserOperationCrud};
 
 #[async_trait::async_trait(?Send)]
 impl PerformCrud for CreatePrivateMessage {
@@ -75,7 +70,7 @@ impl PerformCrud for CreatePrivateMessage {
       &inserted_private_message_id.to_string(),
       &protocol_and_hostname,
     )?;
-    let updated_private_message = PrivateMessage::update(
+    PrivateMessage::update(
       context.pool(),
       inserted_private_message.id,
       &PrivateMessageUpdateForm::builder()
@@ -85,14 +80,6 @@ impl PerformCrud for CreatePrivateMessage {
     .await
     .map_err(|e| LemmyError::from_error_message(e, "couldnt_create_private_message"))?;
 
-    CreateOrUpdateChatMessage::send(
-      updated_private_message.into(),
-      &local_user_view.person.into(),
-      CreateOrUpdateType::Create,
-      context,
-    )
-    .await?;
-
     let res = send_pm_ws_message(
       inserted_private_message.id,
       UserOperationCrud::CreatePrivateMessage,
index 51cded6d1da105f48573e5df837041bbc80fe2d6..4f58065a3eda550dbac04b67715867d0def4d31b 100644 (file)
@@ -1,16 +1,16 @@
 use crate::PerformCrud;
 use actix_web::web::Data;
 use lemmy_api_common::{
+  context::LemmyContext,
   private_message::{DeletePrivateMessage, PrivateMessageResponse},
   utils::get_local_user_view_from_jwt,
+  websocket::{send::send_pm_ws_message, UserOperationCrud},
 };
-use lemmy_apub::activities::deletion::send_apub_delete_private_message;
 use lemmy_db_schema::{
   source::private_message::{PrivateMessage, PrivateMessageUpdateForm},
   traits::Crud,
 };
 use lemmy_utils::{error::LemmyError, ConnectionId};
-use lemmy_websocket::{send::send_pm_ws_message, LemmyContext, UserOperationCrud};
 
 #[async_trait::async_trait(?Send)]
 impl PerformCrud for DeletePrivateMessage {
@@ -36,7 +36,7 @@ impl PerformCrud for DeletePrivateMessage {
     // Doing the update
     let private_message_id = data.private_message_id;
     let deleted = data.deleted;
-    let updated_private_message = PrivateMessage::update(
+    PrivateMessage::update(
       context.pool(),
       private_message_id,
       &PrivateMessageUpdateForm::builder()
@@ -46,15 +46,6 @@ impl PerformCrud for DeletePrivateMessage {
     .await
     .map_err(|e| LemmyError::from_error_message(e, "couldnt_update_private_message"))?;
 
-    // Send the apub update
-    send_apub_delete_private_message(
-      &local_user_view.person.into(),
-      updated_private_message,
-      data.deleted,
-      context,
-    )
-    .await?;
-
     let op = UserOperationCrud::DeletePrivateMessage;
     send_pm_ws_message(data.private_message_id, op, websocket_id, context).await
   }
index f0741398e09cca34be5b828de47b37578deb11c3..28680274524788fa15a1ee6636293fb529c105be 100644 (file)
@@ -1,13 +1,13 @@
 use crate::PerformCrud;
 use actix_web::web::Data;
 use lemmy_api_common::{
+  context::LemmyContext,
   private_message::{GetPrivateMessages, PrivateMessagesResponse},
   utils::get_local_user_view_from_jwt,
 };
 use lemmy_db_schema::traits::DeleteableOrRemoveable;
 use lemmy_db_views::private_message_view::PrivateMessageQuery;
 use lemmy_utils::{error::LemmyError, ConnectionId};
-use lemmy_websocket::LemmyContext;
 
 #[async_trait::async_trait(?Send)]
 impl PerformCrud for GetPrivateMessages {
index 5f79735e99235d8a4652bde39c076bee83b3f3c1..f6f8c8f0374f01334a77dca4f8a16a475d6429bf 100644 (file)
@@ -1,12 +1,10 @@
 use crate::PerformCrud;
 use actix_web::web::Data;
 use lemmy_api_common::{
+  context::LemmyContext,
   private_message::{EditPrivateMessage, PrivateMessageResponse},
   utils::{get_local_user_view_from_jwt, local_site_to_slur_regex},
-};
-use lemmy_apub::protocol::activities::{
-  create_or_update::chat_message::CreateOrUpdateChatMessage,
-  CreateOrUpdateType,
+  websocket::{send::send_pm_ws_message, UserOperationCrud},
 };
 use lemmy_db_schema::{
   source::{
@@ -17,7 +15,6 @@ use lemmy_db_schema::{
   utils::naive_now,
 };
 use lemmy_utils::{error::LemmyError, utils::remove_slurs, ConnectionId};
-use lemmy_websocket::{send::send_pm_ws_message, LemmyContext, UserOperationCrud};
 
 #[async_trait::async_trait(?Send)]
 impl PerformCrud for EditPrivateMessage {
@@ -44,7 +41,7 @@ impl PerformCrud for EditPrivateMessage {
     // Doing the update
     let content_slurs_removed = remove_slurs(&data.content, &local_site_to_slur_regex(&local_site));
     let private_message_id = data.private_message_id;
-    let updated_private_message = PrivateMessage::update(
+    PrivateMessage::update(
       context.pool(),
       private_message_id,
       &PrivateMessageUpdateForm::builder()
@@ -55,15 +52,6 @@ impl PerformCrud for EditPrivateMessage {
     .await
     .map_err(|e| LemmyError::from_error_message(e, "couldnt_update_private_message"))?;
 
-    // Send the apub update
-    CreateOrUpdateChatMessage::send(
-      updated_private_message.into(),
-      &local_user_view.person.into(),
-      CreateOrUpdateType::Update,
-      context,
-    )
-    .await?;
-
     let op = UserOperationCrud::EditPrivateMessage;
     send_pm_ws_message(data.private_message_id, op, websocket_id, context).await
   }
index 8b2b9c18bf7a0d2024faff469d2a11a039470d2b..d04343b0c2e145814147fa7d8c5d93c93b7028e2 100644 (file)
@@ -2,8 +2,10 @@ use crate::PerformCrud;
 use activitypub_federation::core::signatures::generate_actor_keypair;
 use actix_web::web::Data;
 use lemmy_api_common::{
+  context::LemmyContext,
   site::{CreateSite, SiteResponse},
   utils::{
+    generate_site_inbox_url,
     get_local_user_view_from_jwt,
     is_admin,
     local_site_rate_limit_to_rate_limit_config,
@@ -11,7 +13,6 @@ use lemmy_api_common::{
     site_description_length_check,
   },
 };
-use lemmy_apub::generate_site_inbox_url;
 use lemmy_db_schema::{
   newtypes::DbUrl,
   source::{
@@ -28,7 +29,6 @@ use lemmy_utils::{
   utils::{check_application_question, check_slurs, check_slurs_opt},
   ConnectionId,
 };
-use lemmy_websocket::LemmyContext;
 use url::Url;
 
 #[async_trait::async_trait(?Send)]
index dbf64c6c3afbdffdffcf9c305b61d4d550d68e38..55dcd8fb2d915d5d1cd565f110bcb725212732b5 100644 (file)
@@ -1,8 +1,10 @@
 use crate::PerformCrud;
 use actix_web::web::Data;
 use lemmy_api_common::{
+  context::LemmyContext,
   site::{GetSite, GetSiteResponse, MyUserInfo},
   utils::{build_federated_instances, get_local_user_settings_view_from_jwt_opt},
+  websocket::messages::GetUsersOnline,
 };
 use lemmy_db_schema::source::{actor_language::SiteLanguage, language::Language, tagline::Tagline};
 use lemmy_db_views::structs::{LocalUserDiscussionLanguageView, SiteView};
@@ -14,7 +16,6 @@ use lemmy_db_views_actor::structs::{
   PersonViewSafe,
 };
 use lemmy_utils::{error::LemmyError, version, ConnectionId};
-use lemmy_websocket::{messages::GetUsersOnline, LemmyContext};
 
 #[async_trait::async_trait(?Send)]
 impl PerformCrud for GetSite {
index 07e96582352085b16a2b534c301c829d86533b01..4a96925edbb8b4719302451dbc54a3304d258ac9 100644 (file)
@@ -1,6 +1,7 @@
 use crate::PerformCrud;
 use actix_web::web::Data;
 use lemmy_api_common::{
+  context::LemmyContext,
   site::{EditSite, SiteResponse},
   utils::{
     get_local_user_view_from_jwt,
@@ -9,6 +10,7 @@ use lemmy_api_common::{
     local_site_to_slur_regex,
     site_description_length_check,
   },
+  websocket::{messages::SendAllMessage, UserOperationCrud},
 };
 use lemmy_db_schema::{
   source::{
@@ -31,7 +33,6 @@ use lemmy_utils::{
   utils::{check_application_question, check_slurs_opt},
   ConnectionId,
 };
-use lemmy_websocket::{messages::SendAllMessage, LemmyContext, UserOperationCrud};
 use std::str::FromStr;
 
 #[async_trait::async_trait(?Send)]
index d1b5fbc3ee46b23fc9d6fc24e5a3778725afc2c5..34b3b69e47004d154d9018662d570314879a51d4 100644 (file)
@@ -2,20 +2,20 @@ use crate::PerformCrud;
 use activitypub_federation::core::signatures::generate_actor_keypair;
 use actix_web::web::Data;
 use lemmy_api_common::{
+  context::LemmyContext,
   person::{LoginResponse, Register},
   utils::{
+    generate_inbox_url,
+    generate_local_apub_endpoint,
+    generate_shared_inbox_url,
     honeypot_check,
     local_site_to_slur_regex,
     password_length_check,
     send_new_applicant_email_to_admins,
     send_verification_email,
+    EndpointType,
   },
-};
-use lemmy_apub::{
-  generate_inbox_url,
-  generate_local_apub_endpoint,
-  generate_shared_inbox_url,
-  EndpointType,
+  websocket::messages::CheckCaptcha,
 };
 use lemmy_db_schema::{
   aggregates::structs::PersonAggregates,
@@ -33,7 +33,6 @@ use lemmy_utils::{
   utils::{check_slurs, check_slurs_opt, is_valid_actor_name},
   ConnectionId,
 };
-use lemmy_websocket::{messages::CheckCaptcha, LemmyContext};
 
 #[async_trait::async_trait(?Send)]
 impl PerformCrud for Register {
index 5947476737f23739f0da9728c9c003c23433ba26..b49695eaca5c02265a818225417b9617a2d9df78 100644 (file)
@@ -2,12 +2,11 @@ use crate::PerformCrud;
 use actix_web::web::Data;
 use bcrypt::verify;
 use lemmy_api_common::{
+  context::LemmyContext,
   person::{DeleteAccount, DeleteAccountResponse},
-  utils::{delete_user_account, get_local_user_view_from_jwt},
+  utils::get_local_user_view_from_jwt,
 };
-use lemmy_apub::protocol::activities::deletion::delete_user::DeleteUser;
 use lemmy_utils::{error::LemmyError, ConnectionId};
-use lemmy_websocket::LemmyContext;
 
 #[async_trait::async_trait(?Send)]
 impl PerformCrud for DeleteAccount {
@@ -33,15 +32,6 @@ impl PerformCrud for DeleteAccount {
       return Err(LemmyError::from_message("password_incorrect"));
     }
 
-    delete_user_account(
-      local_user_view.person.id,
-      context.pool(),
-      context.settings(),
-      context.client(),
-    )
-    .await?;
-    DeleteUser::send(&local_user_view.person.into(), context).await?;
-
     Ok(DeleteAccountResponse {})
   }
 }
index 84307241104e745d234d78c7f4eba2bbe06a8c96..aeaae9dddf07d14eaa062ebec4aa968771e6c342 100644 (file)
@@ -1,3 +1,2 @@
 mod create;
 mod delete;
-mod read;
index c2a8827eb09f97d0ce13f45aa67c77819f572909..720fa5937ab9cbd4c753a82df17f52affb178d97 100644 (file)
@@ -19,7 +19,6 @@ lemmy_db_schema = { workspace = true, features = ["full"] }
 lemmy_db_views = { workspace = true, features = ["full"] }
 lemmy_db_views_actor = { workspace = true, features = ["full"] }
 lemmy_api_common = { workspace = true, features = ["full"] }
-lemmy_websocket = { workspace = true }
 activitypub_federation = { workspace = true }
 diesel = { workspace = true }
 chrono = { workspace = true }
index 1d726e7ce1e8feabf59684283a8acdb265f27c6d..b5f03eaf1f3ce498f85df4ffe577d003d211e225 100644 (file)
@@ -23,7 +23,10 @@ use activitypub_federation::{
 use activitystreams_kinds::{activity::BlockType, public};
 use anyhow::anyhow;
 use chrono::NaiveDateTime;
-use lemmy_api_common::utils::{remove_user_data, remove_user_data_in_community};
+use lemmy_api_common::{
+  context::LemmyContext,
+  utils::{remove_user_data, remove_user_data_in_community},
+};
 use lemmy_db_schema::{
   source::{
     community::{
@@ -38,7 +41,6 @@ use lemmy_db_schema::{
   traits::{Bannable, Crud, Followable},
 };
 use lemmy_utils::{error::LemmyError, utils::convert_datetime};
-use lemmy_websocket::LemmyContext;
 use url::Url;
 
 impl BlockUser {
index bc2ea77f0977f58d7e44bc137a60f5a8569e715d..8adc2501297ce5844dfcb7532425e4db19c5ad09 100644 (file)
@@ -1,13 +1,27 @@
 use crate::{
-  objects::{community::ApubCommunity, instance::ApubSite},
-  protocol::objects::{group::Group, instance::Instance},
+  objects::{community::ApubCommunity, instance::ApubSite, person::ApubPerson},
+  protocol::{
+    activities::block::{block_user::BlockUser, undo_block_user::UndoBlockUser},
+    objects::{group::Group, instance::Instance},
+  },
   ActorType,
+  SendActivity,
 };
 use activitypub_federation::{core::object_id::ObjectId, traits::ApubObject};
 use chrono::NaiveDateTime;
-use lemmy_db_schema::{source::site::Site, utils::DbPool};
-use lemmy_utils::error::LemmyError;
-use lemmy_websocket::LemmyContext;
+use lemmy_api_common::{
+  community::{BanFromCommunity, BanFromCommunityResponse},
+  context::LemmyContext,
+  person::{BanPerson, BanPersonResponse},
+  utils::get_local_user_view_from_jwt,
+};
+use lemmy_db_schema::{
+  source::{community::Community, person::Person, site::Site},
+  traits::Crud,
+  utils::DbPool,
+};
+use lemmy_db_views::structs::SiteView;
+use lemmy_utils::{error::LemmyError, utils::naive_from_unix};
 use serde::Deserialize;
 use url::Url;
 
@@ -123,3 +137,90 @@ async fn generate_cc(target: &SiteOrCommunity, pool: &DbPool) -> Result<Vec<Url>
     SiteOrCommunity::Community(c) => vec![c.actor_id()],
   })
 }
+
+#[async_trait::async_trait(?Send)]
+impl SendActivity for BanPerson {
+  type Response = BanPersonResponse;
+
+  async fn send_activity(
+    request: &Self,
+    _response: &Self::Response,
+    context: &LemmyContext,
+  ) -> Result<(), LemmyError> {
+    let local_user_view =
+      get_local_user_view_from_jwt(&request.auth, context.pool(), context.secret()).await?;
+    let person = Person::read(context.pool(), request.person_id).await?;
+    let site = SiteOrCommunity::Site(SiteView::read_local(context.pool()).await?.site.into());
+    let expires = request.expires.map(naive_from_unix);
+
+    // if the action affects a local user, federate to other instances
+    if person.local {
+      if request.ban {
+        BlockUser::send(
+          &site,
+          &person.into(),
+          &local_user_view.person.into(),
+          request.remove_data.unwrap_or(false),
+          request.reason.clone(),
+          expires,
+          context,
+        )
+        .await
+      } else {
+        UndoBlockUser::send(
+          &site,
+          &person.into(),
+          &local_user_view.person.into(),
+          request.reason.clone(),
+          context,
+        )
+        .await
+      }
+    } else {
+      Ok(())
+    }
+  }
+}
+
+#[async_trait::async_trait(?Send)]
+impl SendActivity for BanFromCommunity {
+  type Response = BanFromCommunityResponse;
+
+  async fn send_activity(
+    request: &Self,
+    _response: &Self::Response,
+    context: &LemmyContext,
+  ) -> Result<(), LemmyError> {
+    let local_user_view =
+      get_local_user_view_from_jwt(&request.auth, context.pool(), context.secret()).await?;
+    let community: ApubCommunity = Community::read(context.pool(), request.community_id)
+      .await?
+      .into();
+    let banned_person: ApubPerson = Person::read(context.pool(), request.person_id)
+      .await?
+      .into();
+    let expires = request.expires.map(naive_from_unix);
+
+    if request.ban {
+      BlockUser::send(
+        &SiteOrCommunity::Community(community),
+        &banned_person,
+        &local_user_view.person.clone().into(),
+        request.remove_data.unwrap_or(false),
+        request.reason.clone(),
+        expires,
+        context,
+      )
+      .await
+    } else {
+      UndoBlockUser::send(
+        &SiteOrCommunity::Community(community),
+        &banned_person,
+        &local_user_view.person.clone().into(),
+        request.reason.clone(),
+        context,
+      )
+      .await
+    }
+  }
+}
index eb54f5e48b445c9169d07294adb8936f7870bd8d..315667ac6c565738c3d254ff6996b89e738c5992 100644 (file)
@@ -19,6 +19,7 @@ use activitypub_federation::{
   utils::verify_domains_match,
 };
 use activitystreams_kinds::{activity::UndoType, public};
+use lemmy_api_common::context::LemmyContext;
 use lemmy_db_schema::{
   source::{
     community::{CommunityPersonBan, CommunityPersonBanForm},
@@ -28,7 +29,6 @@ use lemmy_db_schema::{
   traits::{Bannable, Crud},
 };
 use lemmy_utils::error::LemmyError;
-use lemmy_websocket::LemmyContext;
 use url::Url;
 
 impl UndoBlockUser {
index c212cfe148add1d4f7593f7dfa4d8b1f48a6f207..1bc31b48cbfd3bb5935e990acf93fdbe6e9de34a 100644 (file)
@@ -8,11 +8,14 @@ use crate::{
     verify_person_in_community,
   },
   activity_lists::AnnouncableActivities,
-  generate_moderators_url,
   local_instance,
   objects::{community::ApubCommunity, person::ApubPerson},
-  protocol::{activities::community::add_mod::AddMod, InCommunity},
+  protocol::{
+    activities::community::{add_mod::AddMod, remove_mod::RemoveMod},
+    InCommunity,
+  },
   ActorType,
+  SendActivity,
 };
 use activitypub_federation::{
   core::object_id::ObjectId,
@@ -20,15 +23,20 @@ use activitypub_federation::{
   traits::{ActivityHandler, Actor},
 };
 use activitystreams_kinds::{activity::AddType, public};
+use lemmy_api_common::{
+  community::{AddModToCommunity, AddModToCommunityResponse},
+  context::LemmyContext,
+  utils::{generate_moderators_url, get_local_user_view_from_jwt},
+};
 use lemmy_db_schema::{
   source::{
-    community::{CommunityModerator, CommunityModeratorForm},
+    community::{Community, CommunityModerator, CommunityModeratorForm},
     moderator::{ModAddCommunity, ModAddCommunityForm},
+    person::Person,
   },
   traits::{Crud, Joinable},
 };
 use lemmy_utils::error::LemmyError;
-use lemmy_websocket::LemmyContext;
 use url::Url;
 
 impl AddMod {
@@ -135,3 +143,40 @@ impl ActivityHandler for AddMod {
     Ok(())
   }
 }
+
+#[async_trait::async_trait(?Send)]
+impl SendActivity for AddModToCommunity {
+  type Response = AddModToCommunityResponse;
+
+  async fn send_activity(
+    request: &Self,
+    _response: &Self::Response,
+    context: &LemmyContext,
+  ) -> Result<(), LemmyError> {
+    let local_user_view =
+      get_local_user_view_from_jwt(&request.auth, context.pool(), context.secret()).await?;
+    let community: ApubCommunity = Community::read(context.pool(), request.community_id)
+      .await?
+      .into();
+    let updated_mod: ApubPerson = Person::read(context.pool(), request.person_id)
+      .await?
+      .into();
+    if request.added {
+      AddMod::send(
+        &community,
+        &updated_mod,
+        &local_user_view.person.into(),
+        context,
+      )
+      .await
+    } else {
+      RemoveMod::send(
+        &community,
+        &updated_mod,
+        &local_user_view.person.into(),
+        context,
+      )
+      .await
+    }
+  }
+}
index b6c31af5d590467989845b6f436da5b7ab0853bf..306913aa6682c0864d8263b00fea57ab598ba98a 100644 (file)
@@ -18,8 +18,8 @@ use crate::{
 };
 use activitypub_federation::{core::object_id::ObjectId, data::Data, traits::ActivityHandler};
 use activitystreams_kinds::{activity::AnnounceType, public};
+use lemmy_api_common::context::LemmyContext;
 use lemmy_utils::error::LemmyError;
-use lemmy_websocket::LemmyContext;
 use serde_json::Value;
 use tracing::debug;
 use url::Url;
index a7b35595e035d629182d212eff609ec259817d5a..4d35c9d56a29efd9f99e3df685c919ed95c7d56f 100644 (file)
@@ -6,9 +6,9 @@ use crate::{
   protocol::activities::community::announce::AnnounceActivity,
 };
 use activitypub_federation::{core::object_id::ObjectId, traits::Actor};
+use lemmy_api_common::context::LemmyContext;
 use lemmy_db_schema::source::person::PersonFollower;
 use lemmy_utils::error::LemmyError;
-use lemmy_websocket::LemmyContext;
 use url::Url;
 
 pub mod add_mod;
index 3934df3b1c4b20b8fe39220508cacfddfd36303d..9bd8c4ec2b152efc5adb07cc0472a10455df2346 100644 (file)
@@ -8,7 +8,6 @@ use crate::{
     verify_person_in_community,
   },
   activity_lists::AnnouncableActivities,
-  generate_moderators_url,
   local_instance,
   objects::{community::ApubCommunity, person::ApubPerson},
   protocol::{activities::community::remove_mod::RemoveMod, InCommunity},
@@ -20,6 +19,7 @@ use activitypub_federation::{
   traits::{ActivityHandler, Actor},
 };
 use activitystreams_kinds::{activity::RemoveType, public};
+use lemmy_api_common::{context::LemmyContext, utils::generate_moderators_url};
 use lemmy_db_schema::{
   source::{
     community::{CommunityModerator, CommunityModeratorForm},
@@ -28,7 +28,6 @@ use lemmy_db_schema::{
   traits::{Crud, Joinable},
 };
 use lemmy_utils::error::LemmyError;
-use lemmy_websocket::LemmyContext;
 use url::Url;
 
 impl RemoveMod {
index 440a8ebbba9f3e60dc004a91c342b419c07c5895..57b1244d106803500c8e46079c26bda412a2bd51 100644 (file)
@@ -5,6 +5,7 @@ use crate::{
   protocol::{activities::community::report::Report, InCommunity},
   ActorType,
   PostOrComment,
+  SendActivity,
 };
 use activitypub_federation::{
   core::object_id::ObjectId,
@@ -12,7 +13,13 @@ use activitypub_federation::{
   traits::{ActivityHandler, Actor},
 };
 use activitystreams_kinds::activity::FlagType;
-use lemmy_api_common::{comment::CommentReportResponse, post::PostReportResponse};
+use lemmy_api_common::{
+  comment::{CommentReportResponse, CreateCommentReport},
+  context::LemmyContext,
+  post::{CreatePostReport, PostReportResponse},
+  utils::get_local_user_view_from_jwt,
+  websocket::{messages::SendModRoomMessage, UserOperation},
+};
 use lemmy_db_schema::{
   source::{
     comment_report::{CommentReport, CommentReportForm},
@@ -22,12 +29,55 @@ use lemmy_db_schema::{
 };
 use lemmy_db_views::structs::{CommentReportView, PostReportView};
 use lemmy_utils::error::LemmyError;
-use lemmy_websocket::{messages::SendModRoomMessage, LemmyContext, UserOperation};
 use url::Url;
 
+#[async_trait::async_trait(?Send)]
+impl SendActivity for CreatePostReport {
+  type Response = PostReportResponse;
+
+  async fn send_activity(
+    request: &Self,
+    response: &Self::Response,
+    context: &LemmyContext,
+  ) -> Result<(), LemmyError> {
+    let local_user_view =
+      get_local_user_view_from_jwt(&request.auth, context.pool(), context.secret()).await?;
+    Report::send(
+      ObjectId::new(response.post_report_view.post.ap_id.clone()),
+      &local_user_view.person.into(),
+      ObjectId::new(response.post_report_view.community.actor_id.clone()),
+      request.reason.to_string(),
+      context,
+    )
+    .await
+  }
+}
+
+#[async_trait::async_trait(?Send)]
+impl SendActivity for CreateCommentReport {
+  type Response = CommentReportResponse;
+
+  async fn send_activity(
+    request: &Self,
+    response: &Self::Response,
+    context: &LemmyContext,
+  ) -> Result<(), LemmyError> {
+    let local_user_view =
+      get_local_user_view_from_jwt(&request.auth, context.pool(), context.secret()).await?;
+    Report::send(
+      ObjectId::new(response.comment_report_view.comment.ap_id.clone()),
+      &local_user_view.person.into(),
+      ObjectId::new(response.comment_report_view.community.actor_id.clone()),
+      request.reason.to_string(),
+      context,
+    )
+    .await
+  }
+}
+
 impl Report {
   #[tracing::instrument(skip_all)]
-  pub async fn send(
+  async fn send(
     object_id: ObjectId<PostOrComment>,
     actor: &ApubPerson,
     community_id: ObjectId<ApubCommunity>,
index f41f2d47c2bdc6d04ff6fb22d4e993c82ab27e6c..969741ef66f97f686ee88f41450296c2e923f1e6 100644 (file)
@@ -10,6 +10,7 @@ use crate::{
   objects::{community::ApubCommunity, person::ApubPerson},
   protocol::{activities::community::update::UpdateCommunity, InCommunity},
   ActorType,
+  SendActivity,
 };
 use activitypub_federation::{
   core::object_id::ObjectId,
@@ -17,11 +18,32 @@ use activitypub_federation::{
   traits::{ActivityHandler, ApubObject},
 };
 use activitystreams_kinds::{activity::UpdateType, public};
+use lemmy_api_common::{
+  community::{CommunityResponse, EditCommunity, HideCommunity},
+  context::LemmyContext,
+  utils::get_local_user_view_from_jwt,
+  websocket::{send::send_community_ws_message, UserOperationCrud},
+};
 use lemmy_db_schema::{source::community::Community, traits::Crud};
 use lemmy_utils::error::LemmyError;
-use lemmy_websocket::{send::send_community_ws_message, LemmyContext, UserOperationCrud};
 use url::Url;
 
+#[async_trait::async_trait(?Send)]
+impl SendActivity for EditCommunity {
+  type Response = CommunityResponse;
+
+  async fn send_activity(
+    request: &Self,
+    _response: &Self::Response,
+    context: &LemmyContext,
+  ) -> Result<(), LemmyError> {
+    let local_user_view =
+      get_local_user_view_from_jwt(&request.auth, context.pool(), context.secret()).await?;
+    let community = Community::read(context.pool(), request.community_id).await?;
+    UpdateCommunity::send(community.into(), &local_user_view.person.into(), context).await
+  }
+}
+
 impl UpdateCommunity {
   #[tracing::instrument(skip_all)]
   pub async fn send(
@@ -112,3 +134,19 @@ impl ActivityHandler for UpdateCommunity {
     Ok(())
   }
 }
+
+#[async_trait::async_trait(?Send)]
+impl SendActivity for HideCommunity {
+  type Response = CommunityResponse;
+
+  async fn send_activity(
+    request: &Self,
+    _response: &Self::Response,
+    context: &LemmyContext,
+  ) -> Result<(), LemmyError> {
+    let local_user_view =
+      get_local_user_view_from_jwt(&request.auth, context.pool(), context.secret()).await?;
+    let community = Community::read(context.pool(), request.community_id).await?;
+    UpdateCommunity::send(community.into(), &local_user_view.person.into(), context).await
+  }
+}
index a4b60ad4d052a8b3163c8aa623826c6728906221..54df09ce616c4d49ebe5f328138cc09e077494ab 100644 (file)
@@ -16,6 +16,7 @@ use crate::{
     InCommunity,
   },
   ActorType,
+  SendActivity,
 };
 use activitypub_federation::{
   core::object_id::ObjectId,
@@ -24,42 +25,86 @@ use activitypub_federation::{
   utils::verify_domains_match,
 };
 use activitystreams_kinds::public;
-use lemmy_api_common::utils::check_post_deleted_or_removed;
+use lemmy_api_common::{
+  comment::{CommentResponse, CreateComment, EditComment},
+  context::LemmyContext,
+  utils::check_post_deleted_or_removed,
+  websocket::{send::send_comment_ws_message, UserOperationCrud},
+};
 use lemmy_db_schema::{
+  newtypes::PersonId,
   source::{
-    comment::{CommentLike, CommentLikeForm},
+    comment::{Comment, CommentLike, CommentLikeForm},
     community::Community,
+    person::Person,
     post::Post,
   },
   traits::{Crud, Likeable},
 };
 use lemmy_utils::error::LemmyError;
-use lemmy_websocket::{send::send_comment_ws_message, LemmyContext, UserOperationCrud};
 use url::Url;
 
+#[async_trait::async_trait(?Send)]
+impl SendActivity for CreateComment {
+  type Response = CommentResponse;
+
+  async fn send_activity(
+    _request: &Self,
+    response: &Self::Response,
+    context: &LemmyContext,
+  ) -> Result<(), LemmyError> {
+    CreateOrUpdateNote::send(
+      &response.comment_view.comment,
+      response.comment_view.creator.id,
+      CreateOrUpdateType::Create,
+      context,
+    )
+    .await
+  }
+}
+
+#[async_trait::async_trait(?Send)]
+impl SendActivity for EditComment {
+  type Response = CommentResponse;
+
+  async fn send_activity(
+    _request: &Self,
+    response: &Self::Response,
+    context: &LemmyContext,
+  ) -> Result<(), LemmyError> {
+    CreateOrUpdateNote::send(
+      &response.comment_view.comment,
+      response.comment_view.creator.id,
+      CreateOrUpdateType::Update,
+      context,
+    )
+    .await
+  }
+}
+
 impl CreateOrUpdateNote {
-  #[tracing::instrument(skip(comment, actor, kind, context))]
-  pub async fn send(
-    comment: ApubComment,
-    actor: &ApubPerson,
+  #[tracing::instrument(skip(comment, person_id, kind, context))]
+  async fn send(
+    comment: &Comment,
+    person_id: PersonId,
     kind: CreateOrUpdateType,
     context: &LemmyContext,
-    request_counter: &mut i32,
   ) -> Result<(), LemmyError> {
     // TODO: might be helpful to add a comment method to retrieve community directly
     let post_id = comment.post_id;
     let post = Post::read(context.pool(), post_id).await?;
     let community_id = post.community_id;
+    let person: ApubPerson = Person::read(context.pool(), person_id).await?.into();
     let community: ApubCommunity = Community::read(context.pool(), community_id).await?.into();
 
     let id = generate_activity_id(
       kind.clone(),
       &context.settings().get_protocol_and_hostname(),
     )?;
-    let note = comment.into_apub(context).await?;
+    let note = ApubComment(comment.clone()).into_apub(context).await?;
 
     let create_or_update = CreateOrUpdateNote {
-      actor: ObjectId::new(actor.actor_id()),
+      actor: ObjectId::new(person.actor_id()),
       to: vec![public()],
       cc: note.cc.clone(),
       tag: note.tag.clone(),
@@ -85,13 +130,13 @@ impl CreateOrUpdateNote {
     let mut inboxes = vec![];
     for t in tagged_users {
       let person = t
-        .dereference(context, local_instance(context).await, request_counter)
+        .dereference(context, local_instance(context).await, &mut 0)
         .await?;
       inboxes.push(person.shared_inbox_or_inbox());
     }
 
     let activity = AnnouncableActivities::CreateOrUpdateComment(create_or_update);
-    send_activity_in_community(activity, actor, &community, inboxes, false, context).await
+    send_activity_in_community(activity, &person, &community, inboxes, false, context).await
   }
 }
 
index 2c68ad80f25274b2f7b2eed5e9a3fc07cec0f29c..60ce6ea34b05bd28bf63ae2006938134d094db0c 100644 (file)
@@ -1,12 +1,12 @@
 use crate::{local_instance, objects::person::ApubPerson};
 use activitypub_federation::core::object_id::ObjectId;
+use lemmy_api_common::{context::LemmyContext, websocket::send::send_local_notifs};
 use lemmy_db_schema::{
   newtypes::LocalUserId,
   source::{comment::Comment, post::Post},
   traits::Crud,
 };
 use lemmy_utils::{error::LemmyError, utils::scrape_text_for_mentions};
-use lemmy_websocket::{send::send_local_notifs, LemmyContext};
 
 pub mod comment;
 pub mod post;
index abe9be1a66a22593d3ee84827e8613034752a4a6..92cc708774442b536332f468c71217c7eb67bdf3 100644 (file)
@@ -14,6 +14,7 @@ use crate::{
     InCommunity,
   },
   ActorType,
+  SendActivity,
 };
 use activitypub_federation::{
   core::object_id::ObjectId,
@@ -22,17 +23,104 @@ use activitypub_federation::{
   utils::{verify_domains_match, verify_urls_match},
 };
 use activitystreams_kinds::public;
+use lemmy_api_common::{
+  context::LemmyContext,
+  post::{CreatePost, EditPost, LockPost, PostResponse, StickyPost},
+  utils::get_local_user_view_from_jwt,
+  websocket::{send::send_post_ws_message, UserOperationCrud},
+};
 use lemmy_db_schema::{
+  newtypes::PersonId,
   source::{
     community::Community,
-    post::{PostLike, PostLikeForm},
+    person::Person,
+    post::{Post, PostLike, PostLikeForm},
   },
   traits::{Crud, Likeable},
 };
 use lemmy_utils::error::LemmyError;
-use lemmy_websocket::{send::send_post_ws_message, LemmyContext, UserOperationCrud};
 use url::Url;
 
+#[async_trait::async_trait(?Send)]
+impl SendActivity for CreatePost {
+  type Response = PostResponse;
+
+  async fn send_activity(
+    _request: &Self,
+    response: &Self::Response,
+    context: &LemmyContext,
+  ) -> Result<(), LemmyError> {
+    CreateOrUpdatePage::send(
+      &response.post_view.post,
+      response.post_view.creator.id,
+      CreateOrUpdateType::Create,
+      context,
+    )
+    .await
+  }
+}
+
+#[async_trait::async_trait(?Send)]
+impl SendActivity for EditPost {
+  type Response = PostResponse;
+
+  async fn send_activity(
+    _request: &Self,
+    response: &Self::Response,
+    context: &LemmyContext,
+  ) -> Result<(), LemmyError> {
+    CreateOrUpdatePage::send(
+      &response.post_view.post,
+      response.post_view.creator.id,
+      CreateOrUpdateType::Update,
+      context,
+    )
+    .await
+  }
+}
+
+#[async_trait::async_trait(?Send)]
+impl SendActivity for LockPost {
+  type Response = PostResponse;
+
+  async fn send_activity(
+    request: &Self,
+    response: &Self::Response,
+    context: &LemmyContext,
+  ) -> Result<(), LemmyError> {
+    let local_user_view =
+      get_local_user_view_from_jwt(&request.auth, context.pool(), context.secret()).await?;
+    CreateOrUpdatePage::send(
+      &response.post_view.post,
+      local_user_view.person.id,
+      CreateOrUpdateType::Update,
+      context,
+    )
+    .await
+  }
+}
+
+#[async_trait::async_trait(?Send)]
+impl SendActivity for StickyPost {
+  type Response = PostResponse;
+
+  async fn send_activity(
+    request: &Self,
+    response: &Self::Response,
+    context: &LemmyContext,
+  ) -> Result<(), LemmyError> {
+    let local_user_view =
+      get_local_user_view_from_jwt(&request.auth, context.pool(), context.secret()).await?;
+    CreateOrUpdatePage::send(
+      &response.post_view.post,
+      local_user_view.person.id,
+      CreateOrUpdateType::Update,
+      context,
+    )
+    .await
+  }
+}
+
 impl CreateOrUpdatePage {
   pub(crate) async fn new(
     post: ApubPost,
@@ -57,19 +145,30 @@ impl CreateOrUpdatePage {
   }
 
   #[tracing::instrument(skip_all)]
-  pub async fn send(
-    post: ApubPost,
-    actor: &ApubPerson,
+  async fn send(
+    post: &Post,
+    person_id: PersonId,
     kind: CreateOrUpdateType,
     context: &LemmyContext,
   ) -> Result<(), LemmyError> {
+    let post = ApubPost(post.clone());
     let community_id = post.community_id;
+    let person: ApubPerson = Person::read(context.pool(), person_id).await?.into();
     let community: ApubCommunity = Community::read(context.pool(), community_id).await?.into();
 
-    let create_or_update = CreateOrUpdatePage::new(post, actor, &community, kind, context).await?;
+    let create_or_update =
+      CreateOrUpdatePage::new(post, &person, &community, kind, context).await?;
     let is_mod_action = create_or_update.object.is_mod_action(context).await?;
     let activity = AnnouncableActivities::CreateOrUpdatePost(create_or_update);
-    send_activity_in_community(activity, actor, &community, vec![], is_mod_action, context).await?;
+    send_activity_in_community(
+      activity,
+      &person,
+      &community,
+      vec![],
+      is_mod_action,
+      context,
+    )
+    .await?;
     Ok(())
   }
 }
index eb310ce9cf26feda214ff9a6bf466a39b7868a89..071209c349bf1d5235ed6457590d3893fcb7b5f5 100644 (file)
@@ -6,6 +6,7 @@ use crate::{
     CreateOrUpdateType,
   },
   ActorType,
+  SendActivity,
 };
 use activitypub_federation::{
   core::object_id::ObjectId,
@@ -13,20 +14,66 @@ use activitypub_federation::{
   traits::{ActivityHandler, Actor, ApubObject},
   utils::verify_domains_match,
 };
-use lemmy_db_schema::{source::person::Person, traits::Crud};
+use lemmy_api_common::{
+  context::LemmyContext,
+  private_message::{CreatePrivateMessage, EditPrivateMessage, PrivateMessageResponse},
+  websocket::{send::send_pm_ws_message, UserOperationCrud},
+};
+use lemmy_db_schema::{
+  newtypes::PersonId,
+  source::{person::Person, private_message::PrivateMessage},
+  traits::Crud,
+};
 use lemmy_utils::error::LemmyError;
-use lemmy_websocket::{send::send_pm_ws_message, LemmyContext, UserOperationCrud};
 use url::Url;
 
+#[async_trait::async_trait(?Send)]
+impl SendActivity for CreatePrivateMessage {
+  type Response = PrivateMessageResponse;
+
+  async fn send_activity(
+    _request: &Self,
+    response: &Self::Response,
+    context: &LemmyContext,
+  ) -> Result<(), LemmyError> {
+    CreateOrUpdateChatMessage::send(
+      &response.private_message_view.private_message,
+      response.private_message_view.creator.id,
+      CreateOrUpdateType::Create,
+      context,
+    )
+    .await
+  }
+}
+#[async_trait::async_trait(?Send)]
+impl SendActivity for EditPrivateMessage {
+  type Response = PrivateMessageResponse;
+
+  async fn send_activity(
+    _request: &Self,
+    response: &Self::Response,
+    context: &LemmyContext,
+  ) -> Result<(), LemmyError> {
+    CreateOrUpdateChatMessage::send(
+      &response.private_message_view.private_message,
+      response.private_message_view.creator.id,
+      CreateOrUpdateType::Update,
+      context,
+    )
+    .await
+  }
+}
+
 impl CreateOrUpdateChatMessage {
   #[tracing::instrument(skip_all)]
-  pub async fn send(
-    private_message: ApubPrivateMessage,
-    actor: &ApubPerson,
+  async fn send(
+    private_message: &PrivateMessage,
+    sender_id: PersonId,
     kind: CreateOrUpdateType,
     context: &LemmyContext,
   ) -> Result<(), LemmyError> {
     let recipient_id = private_message.recipient_id;
+    let sender: ApubPerson = Person::read(context.pool(), sender_id).await?.into();
     let recipient: ApubPerson = Person::read(context.pool(), recipient_id).await?.into();
 
     let id = generate_activity_id(
@@ -35,13 +82,15 @@ impl CreateOrUpdateChatMessage {
     )?;
     let create_or_update = CreateOrUpdateChatMessage {
       id: id.clone(),
-      actor: ObjectId::new(actor.actor_id()),
+      actor: ObjectId::new(sender.actor_id()),
       to: [ObjectId::new(recipient.actor_id())],
-      object: private_message.into_apub(context).await?,
+      object: ApubPrivateMessage(private_message.clone())
+        .into_apub(context)
+        .await?,
       kind,
     };
     let inbox = vec![recipient.shared_inbox_or_inbox()];
-    send_lemmy_activity(context, create_or_update, actor, inbox, true).await
+    send_lemmy_activity(context, create_or_update, &sender, inbox, true).await
   }
 }
 
index 8298a6fe04fcf2ebf9dde6d27aafb1f4bc3512fc..138a1fae1788bb454eb93792fc8050beb31c3283 100644 (file)
@@ -9,6 +9,13 @@ use crate::{
 };
 use activitypub_federation::{core::object_id::ObjectId, data::Data, traits::ActivityHandler};
 use activitystreams_kinds::activity::DeleteType;
+use lemmy_api_common::{
+  context::LemmyContext,
+  websocket::{
+    send::{send_comment_ws_message_simple, send_community_ws_message, send_post_ws_message},
+    UserOperationCrud,
+  },
+};
 use lemmy_db_schema::{
   source::{
     comment::{Comment, CommentUpdateForm},
@@ -26,11 +33,6 @@ use lemmy_db_schema::{
   traits::Crud,
 };
 use lemmy_utils::error::LemmyError;
-use lemmy_websocket::{
-  send::{send_comment_ws_message_simple, send_community_ws_message, send_post_ws_message},
-  LemmyContext,
-  UserOperationCrud,
-};
 use url::Url;
 
 #[async_trait::async_trait(?Send)]
index 08d9d3959942c503cb233ffab63f49a8574ce94f..4ace431e67f7d8f7679591fcfc1a1c60bb16d4ff 100644 (file)
@@ -3,6 +3,7 @@ use crate::{
   local_instance,
   objects::{instance::remote_instance_inboxes, person::ApubPerson},
   protocol::activities::deletion::delete_user::DeleteUser,
+  SendActivity,
 };
 use activitypub_federation::{
   core::object_id::ObjectId,
@@ -11,11 +12,54 @@ use activitypub_federation::{
   utils::verify_urls_match,
 };
 use activitystreams_kinds::{activity::DeleteType, public};
-use lemmy_api_common::utils::delete_user_account;
+use lemmy_api_common::{
+  context::LemmyContext,
+  person::{DeleteAccount, DeleteAccountResponse},
+  utils::{delete_user_account, get_local_user_view_from_jwt},
+};
 use lemmy_utils::error::LemmyError;
-use lemmy_websocket::LemmyContext;
 use url::Url;
 
+#[async_trait::async_trait(?Send)]
+impl SendActivity for DeleteAccount {
+  type Response = DeleteAccountResponse;
+
+  async fn send_activity(
+    request: &Self,
+    _response: &Self::Response,
+    context: &LemmyContext,
+  ) -> Result<(), LemmyError> {
+    let local_user_view =
+      get_local_user_view_from_jwt(&request.auth, context.pool(), context.secret()).await?;
+    let actor: ApubPerson = local_user_view.person.into();
+    delete_user_account(
+      actor.id,
+      context.pool(),
+      context.settings(),
+      context.client(),
+    )
+    .await?;
+
+    let actor_id = ObjectId::new(actor.actor_id.clone());
+    let id = generate_activity_id(
+      DeleteType::Delete,
+      &context.settings().get_protocol_and_hostname(),
+    )?;
+    let delete = DeleteUser {
+      actor: actor_id.clone(),
+      to: vec![public()],
+      object: actor_id,
+      kind: DeleteType::Delete,
+      id: id.clone(),
+      cc: vec![],
+    };
+
+    let inboxes = remote_instance_inboxes(context.pool()).await?;
+    send_lemmy_activity(context, delete, &actor, inboxes, true).await?;
+    Ok(())
+  }
+}
+
 /// This can be separate from Delete activity because it doesn't need to be handled in shared inbox
 /// (cause instance actor doesn't have shared inbox).
 #[async_trait::async_trait(?Send)]
@@ -61,26 +105,3 @@ impl ActivityHandler for DeleteUser {
     Ok(())
   }
 }
-
-impl DeleteUser {
-  #[tracing::instrument(skip_all)]
-  pub async fn send(actor: &ApubPerson, context: &LemmyContext) -> Result<(), LemmyError> {
-    let actor_id = ObjectId::new(actor.actor_id.clone());
-    let id = generate_activity_id(
-      DeleteType::Delete,
-      &context.settings().get_protocol_and_hostname(),
-    )?;
-    let delete = DeleteUser {
-      actor: actor_id.clone(),
-      to: vec![public()],
-      object: actor_id,
-      kind: DeleteType::Delete,
-      id: id.clone(),
-      cc: vec![],
-    };
-
-    let inboxes = remote_instance_inboxes(context.pool()).await?;
-    send_lemmy_activity(context, delete, actor, inboxes, true).await?;
-    Ok(())
-  }
-}
index bf4b920a81c07b813baca532f734eb5335dcb304..dae70dc3d5aa01752c742b16df442ebf41ac21b7 100644 (file)
@@ -21,6 +21,7 @@ use crate::{
     InCommunity,
   },
   ActorType,
+  SendActivity,
 };
 use activitypub_federation::{
   core::object_id::ObjectId,
@@ -28,6 +29,23 @@ use activitypub_federation::{
   utils::verify_domains_match,
 };
 use activitystreams_kinds::public;
+use lemmy_api_common::{
+  comment::{CommentResponse, DeleteComment, RemoveComment},
+  community::{CommunityResponse, DeleteCommunity, RemoveCommunity},
+  context::LemmyContext,
+  post::{DeletePost, PostResponse, RemovePost},
+  private_message::{DeletePrivateMessage, PrivateMessageResponse},
+  utils::get_local_user_view_from_jwt,
+  websocket::{
+    send::{
+      send_comment_ws_message_simple,
+      send_community_ws_message,
+      send_pm_ws_message,
+      send_post_ws_message,
+    },
+    UserOperationCrud,
+  },
+};
 use lemmy_db_schema::{
   source::{
     comment::{Comment, CommentUpdateForm},
@@ -39,16 +57,6 @@ use lemmy_db_schema::{
   traits::Crud,
 };
 use lemmy_utils::error::LemmyError;
-use lemmy_websocket::{
-  send::{
-    send_comment_ws_message_simple,
-    send_community_ws_message,
-    send_pm_ws_message,
-    send_post_ws_message,
-  },
-  LemmyContext,
-  UserOperationCrud,
-};
 use std::ops::Deref;
 use url::Url;
 
@@ -56,10 +64,176 @@ pub mod delete;
 pub mod delete_user;
 pub mod undo_delete;
 
+#[async_trait::async_trait(?Send)]
+impl SendActivity for DeletePost {
+  type Response = PostResponse;
+
+  async fn send_activity(
+    request: &Self,
+    response: &Self::Response,
+    context: &LemmyContext,
+  ) -> Result<(), LemmyError> {
+    let local_user_view =
+      get_local_user_view_from_jwt(&request.auth, context.pool(), context.secret()).await?;
+    let community = Community::read(context.pool(), response.post_view.community.id).await?;
+    let deletable = DeletableObjects::Post(Box::new(response.post_view.post.clone().into()));
+    send_apub_delete_in_community(
+      local_user_view.person,
+      community,
+      deletable,
+      None,
+      request.deleted,
+      context,
+    )
+    .await
+  }
+}
+
+#[async_trait::async_trait(?Send)]
+impl SendActivity for RemovePost {
+  type Response = PostResponse;
+
+  async fn send_activity(
+    request: &Self,
+    response: &Self::Response,
+    context: &LemmyContext,
+  ) -> Result<(), LemmyError> {
+    let local_user_view =
+      get_local_user_view_from_jwt(&request.auth, context.pool(), context.secret()).await?;
+    let community = Community::read(context.pool(), response.post_view.community.id).await?;
+    let deletable = DeletableObjects::Post(Box::new(response.post_view.post.clone().into()));
+    send_apub_delete_in_community(
+      local_user_view.person,
+      community,
+      deletable,
+      request.reason.clone().or_else(|| Some(String::new())),
+      request.removed,
+      context,
+    )
+    .await
+  }
+}
+
+#[async_trait::async_trait(?Send)]
+impl SendActivity for DeleteComment {
+  type Response = CommentResponse;
+
+  async fn send_activity(
+    request: &Self,
+    response: &Self::Response,
+    context: &LemmyContext,
+  ) -> Result<(), LemmyError> {
+    let community_id = response.comment_view.community.id;
+    let community = Community::read(context.pool(), community_id).await?;
+    let person = Person::read(context.pool(), response.comment_view.creator.id).await?;
+    let deletable =
+      DeletableObjects::Comment(Box::new(response.comment_view.comment.clone().into()));
+    send_apub_delete_in_community(person, community, deletable, None, request.deleted, context)
+      .await
+  }
+}
+
+#[async_trait::async_trait(?Send)]
+impl SendActivity for RemoveComment {
+  type Response = CommentResponse;
+
+  async fn send_activity(
+    request: &Self,
+    response: &Self::Response,
+    context: &LemmyContext,
+  ) -> Result<(), LemmyError> {
+    let local_user_view =
+      get_local_user_view_from_jwt(&request.auth, context.pool(), context.secret()).await?;
+    let comment = Comment::read(context.pool(), request.comment_id).await?;
+    let community = Community::read(context.pool(), response.comment_view.community.id).await?;
+    let deletable = DeletableObjects::Comment(Box::new(comment.into()));
+    send_apub_delete_in_community(
+      local_user_view.person,
+      community,
+      deletable,
+      request.reason.clone().or_else(|| Some(String::new())),
+      request.removed,
+      context,
+    )
+    .await
+  }
+}
+
+#[async_trait::async_trait(?Send)]
+impl SendActivity for DeletePrivateMessage {
+  type Response = PrivateMessageResponse;
+
+  async fn send_activity(
+    request: &Self,
+    response: &Self::Response,
+    context: &LemmyContext,
+  ) -> Result<(), LemmyError> {
+    let local_user_view =
+      get_local_user_view_from_jwt(&request.auth, context.pool(), context.secret()).await?;
+    send_apub_delete_private_message(
+      &local_user_view.person.into(),
+      response.private_message_view.private_message.clone(),
+      request.deleted,
+      context,
+    )
+    .await
+  }
+}
+
+#[async_trait::async_trait(?Send)]
+impl SendActivity for DeleteCommunity {
+  type Response = CommunityResponse;
+
+  async fn send_activity(
+    request: &Self,
+    _response: &Self::Response,
+    context: &LemmyContext,
+  ) -> Result<(), LemmyError> {
+    let local_user_view =
+      get_local_user_view_from_jwt(&request.auth, context.pool(), context.secret()).await?;
+    let community = Community::read(context.pool(), request.community_id).await?;
+    let deletable = DeletableObjects::Community(Box::new(community.clone().into()));
+    send_apub_delete_in_community(
+      local_user_view.person,
+      community,
+      deletable,
+      None,
+      request.deleted,
+      context,
+    )
+    .await
+  }
+}
+
+#[async_trait::async_trait(?Send)]
+impl SendActivity for RemoveCommunity {
+  type Response = CommunityResponse;
+
+  async fn send_activity(
+    request: &Self,
+    _response: &Self::Response,
+    context: &LemmyContext,
+  ) -> Result<(), LemmyError> {
+    let local_user_view =
+      get_local_user_view_from_jwt(&request.auth, context.pool(), context.secret()).await?;
+    let community = Community::read(context.pool(), request.community_id).await?;
+    let deletable = DeletableObjects::Community(Box::new(community.clone().into()));
+    send_apub_delete_in_community(
+      local_user_view.person,
+      community,
+      deletable,
+      request.reason.clone().or_else(|| Some(String::new())),
+      request.removed,
+      context,
+    )
+    .await
+  }
+}
+
 /// Parameter `reason` being set indicates that this is a removal by a mod. If its unset, this
 /// action was done by a normal user.
 #[tracing::instrument(skip_all)]
-pub async fn send_apub_delete_in_community(
+async fn send_apub_delete_in_community(
   actor: Person,
   community: Community,
   object: DeletableObjects,
@@ -88,7 +262,7 @@ pub async fn send_apub_delete_in_community(
 }
 
 #[tracing::instrument(skip_all)]
-pub async fn send_apub_delete_private_message(
+async fn send_apub_delete_private_message(
   actor: &ApubPerson,
   pm: PrivateMessage,
   deleted: bool,
index 8b845400e52a62f16c217075de6b46e13323d19b..b3cef38580f72c2d3e82ad0e4abf2902ec0d96eb 100644 (file)
@@ -9,6 +9,13 @@ use crate::{
 };
 use activitypub_federation::{core::object_id::ObjectId, data::Data, traits::ActivityHandler};
 use activitystreams_kinds::activity::UndoType;
+use lemmy_api_common::{
+  context::LemmyContext,
+  websocket::{
+    send::{send_comment_ws_message_simple, send_community_ws_message, send_post_ws_message},
+    UserOperationCrud,
+  },
+};
 use lemmy_db_schema::{
   source::{
     comment::{Comment, CommentUpdateForm},
@@ -26,11 +33,6 @@ use lemmy_db_schema::{
   traits::Crud,
 };
 use lemmy_utils::error::LemmyError;
-use lemmy_websocket::{
-  send::{send_comment_ws_message_simple, send_community_ws_message, send_post_ws_message},
-  LemmyContext,
-  UserOperationCrud,
-};
 use url::Url;
 
 #[async_trait::async_trait(?Send)]
index 5a8baa4c7b5525a0b7d83d1390cee4a3e7c9eff5..6702c8c9590c3893d56a08c12c1b5b552b95e860 100644 (file)
@@ -11,12 +11,15 @@ use activitypub_federation::{
   utils::verify_urls_match,
 };
 use activitystreams_kinds::activity::AcceptType;
-use lemmy_api_common::community::CommunityResponse;
+use lemmy_api_common::{
+  community::CommunityResponse,
+  context::LemmyContext,
+  websocket::{messages::SendUserRoomMessage, UserOperation},
+};
 use lemmy_db_schema::{source::community::CommunityFollower, traits::Followable};
 use lemmy_db_views::structs::LocalUserView;
 use lemmy_db_views_actor::structs::CommunityView;
 use lemmy_utils::error::LemmyError;
-use lemmy_websocket::{messages::SendUserRoomMessage, LemmyContext, UserOperation};
 use url::Url;
 
 impl AcceptFollow {
index 867eb2913d3b4c3242549e19e87e279755af0db2..62bd24157f4c6e92aed9b684b3b458ed00b9025c 100644 (file)
@@ -8,8 +8,13 @@ use crate::{
   fetcher::user_or_community::UserOrCommunity,
   local_instance,
   objects::{community::ApubCommunity, person::ApubPerson},
-  protocol::activities::following::{accept::AcceptFollow, follow::Follow},
+  protocol::activities::following::{
+    accept::AcceptFollow,
+    follow::Follow,
+    undo_follow::UndoFollow,
+  },
   ActorType,
+  SendActivity,
 };
 use activitypub_federation::{
   core::object_id::ObjectId,
@@ -17,15 +22,19 @@ use activitypub_federation::{
   traits::{ActivityHandler, Actor},
 };
 use activitystreams_kinds::activity::FollowType;
+use lemmy_api_common::{
+  community::{BlockCommunity, BlockCommunityResponse},
+  context::LemmyContext,
+  utils::get_local_user_view_from_jwt,
+};
 use lemmy_db_schema::{
   source::{
-    community::{CommunityFollower, CommunityFollowerForm},
+    community::{Community, CommunityFollower, CommunityFollowerForm},
     person::{PersonFollower, PersonFollowerForm},
   },
-  traits::Followable,
+  traits::{Crud, Followable},
 };
 use lemmy_utils::error::LemmyError;
-use lemmy_websocket::LemmyContext;
 use url::Url;
 
 impl Follow {
@@ -132,3 +141,19 @@ impl ActivityHandler for Follow {
     AcceptFollow::send(self, context, request_counter).await
   }
 }
+
+#[async_trait::async_trait(?Send)]
+impl SendActivity for BlockCommunity {
+  type Response = BlockCommunityResponse;
+
+  async fn send_activity(
+    request: &Self,
+    _response: &Self::Response,
+    context: &LemmyContext,
+  ) -> Result<(), LemmyError> {
+    let local_user_view =
+      get_local_user_view_from_jwt(&request.auth, context.pool(), context.secret()).await?;
+    let community = Community::read(context.pool(), request.community_id).await?;
+    UndoFollow::send(&local_user_view.person.into(), &community.into(), context).await
+  }
+}
index 60bdd5f785c5ec3c5b6874d0401fa30c51785e53..e472dc73a1dd3e9f1339717208c1915cf23270e1 100644 (file)
@@ -1,3 +1,41 @@
+use crate::{
+  objects::community::ApubCommunity,
+  protocol::activities::following::{follow::Follow, undo_follow::UndoFollow},
+  SendActivity,
+};
+use lemmy_api_common::{
+  community::{CommunityResponse, FollowCommunity},
+  context::LemmyContext,
+  utils::get_local_user_view_from_jwt,
+};
+use lemmy_db_schema::{source::community::Community, traits::Crud};
+use lemmy_utils::error::LemmyError;
+
 pub mod accept;
 pub mod follow;
 pub mod undo_follow;
+
+#[async_trait::async_trait(?Send)]
+impl SendActivity for FollowCommunity {
+  type Response = CommunityResponse;
+
+  async fn send_activity(
+    request: &Self,
+    _response: &Self::Response,
+    context: &LemmyContext,
+  ) -> Result<(), LemmyError> {
+    let local_user_view =
+      get_local_user_view_from_jwt(&request.auth, context.pool(), context.secret()).await?;
+    let person = local_user_view.person.clone().into();
+    let community: ApubCommunity = Community::read(context.pool(), request.community_id)
+      .await?
+      .into();
+    if community.local {
+      Ok(())
+    } else if request.follow {
+      Follow::send(&person, &community, context).await
+    } else {
+      UndoFollow::send(&person, &community, context).await
+    }
+  }
+}
index 012ebfb90f143943c184a93b63150c39f79053f1..436d8a02e84711f7f5f162406bb8dde7e03a27d6 100644 (file)
@@ -13,6 +13,7 @@ use activitypub_federation::{
   utils::verify_urls_match,
 };
 use activitystreams_kinds::activity::UndoType;
+use lemmy_api_common::context::LemmyContext;
 use lemmy_db_schema::{
   source::{
     community::{CommunityFollower, CommunityFollowerForm},
@@ -21,7 +22,6 @@ use lemmy_db_schema::{
   traits::Followable,
 };
 use lemmy_utils::error::LemmyError;
-use lemmy_websocket::LemmyContext;
 use url::Url;
 
 impl UndoFollow {
index c38eadcda2a000ae8c74af1b70015fe80f27460f..2fb5808b7869af7a085536965846914e498ef190 100644 (file)
@@ -1,5 +1,4 @@
 use crate::{
-  generate_moderators_url,
   insert_activity,
   local_instance,
   objects::{community::ApubCommunity, person::ApubPerson},
@@ -13,13 +12,13 @@ use activitypub_federation::{
 };
 use activitystreams_kinds::public;
 use anyhow::anyhow;
+use lemmy_api_common::{context::LemmyContext, utils::generate_moderators_url};
 use lemmy_db_schema::{
   newtypes::CommunityId,
   source::{community::Community, local_site::LocalSite},
 };
 use lemmy_db_views_actor::structs::{CommunityPersonBanView, CommunityView};
 use lemmy_utils::error::LemmyError;
-use lemmy_websocket::LemmyContext;
 use serde::Serialize;
 use std::ops::Deref;
 use tracing::info;
@@ -31,6 +30,7 @@ pub mod community;
 pub mod create_or_update;
 pub mod deletion;
 pub mod following;
+pub mod unfederated;
 pub mod voting;
 
 /// Checks that the specified Url actually identifies a Person (by fetching it), and that the person
diff --git a/crates/apub/src/activities/unfederated.rs b/crates/apub/src/activities/unfederated.rs
new file mode 100644 (file)
index 0000000..cca3340
--- /dev/null
@@ -0,0 +1,351 @@
+use crate::SendActivity;
+use lemmy_api_common::{
+  comment::{
+    CommentReportResponse,
+    CommentResponse,
+    GetComment,
+    GetComments,
+    GetCommentsResponse,
+    ListCommentReports,
+    ListCommentReportsResponse,
+    ResolveCommentReport,
+    SaveComment,
+  },
+  community::{
+    CommunityResponse,
+    CreateCommunity,
+    GetCommunity,
+    GetCommunityResponse,
+    ListCommunities,
+    ListCommunitiesResponse,
+    TransferCommunity,
+  },
+  person::{
+    AddAdmin,
+    AddAdminResponse,
+    BannedPersonsResponse,
+    BlockPerson,
+    BlockPersonResponse,
+    ChangePassword,
+    CommentReplyResponse,
+    GetBannedPersons,
+    GetCaptcha,
+    GetCaptchaResponse,
+    GetPersonDetails,
+    GetPersonDetailsResponse,
+    GetPersonMentions,
+    GetPersonMentionsResponse,
+    GetReplies,
+    GetRepliesResponse,
+    GetReportCount,
+    GetReportCountResponse,
+    GetUnreadCount,
+    GetUnreadCountResponse,
+    Login,
+    LoginResponse,
+    MarkAllAsRead,
+    MarkCommentReplyAsRead,
+    MarkPersonMentionAsRead,
+    PasswordChangeAfterReset,
+    PasswordReset,
+    PasswordResetResponse,
+    PersonMentionResponse,
+    Register,
+    SaveUserSettings,
+    VerifyEmail,
+    VerifyEmailResponse,
+  },
+  post::{
+    GetPost,
+    GetPostResponse,
+    GetPosts,
+    GetPostsResponse,
+    GetSiteMetadata,
+    GetSiteMetadataResponse,
+    ListPostReports,
+    ListPostReportsResponse,
+    MarkPostAsRead,
+    PostReportResponse,
+    PostResponse,
+    ResolvePostReport,
+    SavePost,
+  },
+  private_message::{
+    CreatePrivateMessageReport,
+    GetPrivateMessages,
+    ListPrivateMessageReports,
+    ListPrivateMessageReportsResponse,
+    MarkPrivateMessageAsRead,
+    PrivateMessageReportResponse,
+    PrivateMessageResponse,
+    PrivateMessagesResponse,
+    ResolvePrivateMessageReport,
+  },
+  site::{
+    ApproveRegistrationApplication,
+    CreateSite,
+    EditSite,
+    GetModlog,
+    GetModlogResponse,
+    GetSite,
+    GetSiteResponse,
+    GetUnreadRegistrationApplicationCount,
+    GetUnreadRegistrationApplicationCountResponse,
+    LeaveAdmin,
+    ListRegistrationApplications,
+    ListRegistrationApplicationsResponse,
+    PurgeComment,
+    PurgeCommunity,
+    PurgeItemResponse,
+    PurgePerson,
+    PurgePost,
+    RegistrationApplicationResponse,
+    ResolveObject,
+    ResolveObjectResponse,
+    Search,
+    SearchResponse,
+    SiteResponse,
+  },
+  websocket::structs::{
+    CommunityJoin,
+    CommunityJoinResponse,
+    ModJoin,
+    ModJoinResponse,
+    PostJoin,
+    PostJoinResponse,
+    UserJoin,
+    UserJoinResponse,
+  },
+};
+
+impl SendActivity for Register {
+  type Response = LoginResponse;
+}
+
+impl SendActivity for GetPersonDetails {
+  type Response = GetPersonDetailsResponse;
+}
+
+impl SendActivity for GetPrivateMessages {
+  type Response = PrivateMessagesResponse;
+}
+
+impl SendActivity for CreateSite {
+  type Response = SiteResponse;
+}
+
+impl SendActivity for EditSite {
+  type Response = SiteResponse;
+}
+
+impl SendActivity for GetSite {
+  type Response = GetSiteResponse;
+}
+
+impl SendActivity for GetCommunity {
+  type Response = GetCommunityResponse;
+}
+
+impl SendActivity for ListCommunities {
+  type Response = ListCommunitiesResponse;
+}
+
+impl SendActivity for CreateCommunity {
+  type Response = CommunityResponse;
+}
+
+impl SendActivity for GetPost {
+  type Response = GetPostResponse;
+}
+
+impl SendActivity for GetPosts {
+  type Response = GetPostsResponse;
+}
+
+impl SendActivity for GetComment {
+  type Response = CommentResponse;
+}
+
+impl SendActivity for GetComments {
+  type Response = GetCommentsResponse;
+}
+
+impl SendActivity for Login {
+  type Response = LoginResponse;
+}
+
+impl SendActivity for GetCaptcha {
+  type Response = GetCaptchaResponse;
+}
+
+impl SendActivity for GetReplies {
+  type Response = GetRepliesResponse;
+}
+
+impl SendActivity for AddAdmin {
+  type Response = AddAdminResponse;
+}
+
+impl SendActivity for GetUnreadRegistrationApplicationCount {
+  type Response = GetUnreadRegistrationApplicationCountResponse;
+}
+
+impl SendActivity for ListRegistrationApplications {
+  type Response = ListRegistrationApplicationsResponse;
+}
+
+impl SendActivity for ApproveRegistrationApplication {
+  type Response = RegistrationApplicationResponse;
+}
+
+impl SendActivity for GetBannedPersons {
+  type Response = BannedPersonsResponse;
+}
+
+impl SendActivity for BlockPerson {
+  type Response = BlockPersonResponse;
+}
+
+impl SendActivity for GetPersonMentions {
+  type Response = GetPersonMentionsResponse;
+}
+
+impl SendActivity for MarkPersonMentionAsRead {
+  type Response = PersonMentionResponse;
+}
+
+impl SendActivity for MarkCommentReplyAsRead {
+  type Response = CommentReplyResponse;
+}
+
+impl SendActivity for MarkAllAsRead {
+  type Response = GetRepliesResponse;
+}
+
+impl SendActivity for PasswordReset {
+  type Response = PasswordResetResponse;
+}
+
+impl SendActivity for PasswordChangeAfterReset {
+  type Response = LoginResponse;
+}
+
+impl SendActivity for UserJoin {
+  type Response = UserJoinResponse;
+}
+
+impl SendActivity for PostJoin {
+  type Response = PostJoinResponse;
+}
+
+impl SendActivity for CommunityJoin {
+  type Response = CommunityJoinResponse;
+}
+
+impl SendActivity for ModJoin {
+  type Response = ModJoinResponse;
+}
+
+impl SendActivity for SaveUserSettings {
+  type Response = LoginResponse;
+}
+
+impl SendActivity for ChangePassword {
+  type Response = LoginResponse;
+}
+
+impl SendActivity for GetReportCount {
+  type Response = GetReportCountResponse;
+}
+
+impl SendActivity for GetUnreadCount {
+  type Response = GetUnreadCountResponse;
+}
+
+impl SendActivity for VerifyEmail {
+  type Response = VerifyEmailResponse;
+}
+
+impl SendActivity for MarkPrivateMessageAsRead {
+  type Response = PrivateMessageResponse;
+}
+
+impl SendActivity for CreatePrivateMessageReport {
+  type Response = PrivateMessageReportResponse;
+}
+
+impl SendActivity for ResolvePrivateMessageReport {
+  type Response = PrivateMessageReportResponse;
+}
+
+impl SendActivity for ListPrivateMessageReports {
+  type Response = ListPrivateMessageReportsResponse;
+}
+
+impl SendActivity for GetModlog {
+  type Response = GetModlogResponse;
+}
+
+impl SendActivity for PurgePerson {
+  type Response = PurgeItemResponse;
+}
+
+impl SendActivity for PurgeCommunity {
+  type Response = PurgeItemResponse;
+}
+
+impl SendActivity for PurgePost {
+  type Response = PurgeItemResponse;
+}
+
+impl SendActivity for PurgeComment {
+  type Response = PurgeItemResponse;
+}
+
+impl SendActivity for Search {
+  type Response = SearchResponse;
+}
+
+impl SendActivity for ResolveObject {
+  type Response = ResolveObjectResponse;
+}
+
+impl SendActivity for TransferCommunity {
+  type Response = GetCommunityResponse;
+}
+
+impl SendActivity for LeaveAdmin {
+  type Response = GetSiteResponse;
+}
+
+impl SendActivity for MarkPostAsRead {
+  type Response = PostResponse;
+}
+
+impl SendActivity for SavePost {
+  type Response = PostResponse;
+}
+
+impl SendActivity for ListPostReports {
+  type Response = ListPostReportsResponse;
+}
+
+impl SendActivity for ResolvePostReport {
+  type Response = PostReportResponse;
+}
+
+impl SendActivity for GetSiteMetadata {
+  type Response = GetSiteMetadataResponse;
+}
+
+impl SendActivity for SaveComment {
+  type Response = CommentResponse;
+}
+
+impl SendActivity for ListCommentReports {
+  type Response = ListCommentReportsResponse;
+}
+
+impl SendActivity for ResolveCommentReport {
+  type Response = CommentReportResponse;
+}
index bff67efeef641c2e70e5c9922009a8e2c67fa2c5..4471fbd920922cae848e80ded5b618c243c78a88 100644 (file)
 use crate::{
+  activities::community::send_activity_in_community,
+  activity_lists::AnnouncableActivities,
+  fetcher::post_or_comment::PostOrComment,
   objects::{comment::ApubComment, person::ApubPerson, post::ApubPost},
-  protocol::activities::voting::vote::VoteType,
+  protocol::activities::voting::{
+    undo_vote::UndoVote,
+    vote::{Vote, VoteType},
+  },
+  SendActivity,
+};
+use activitypub_federation::core::object_id::ObjectId;
+use lemmy_api_common::{
+  comment::{CommentResponse, CreateCommentLike},
+  context::LemmyContext,
+  post::{CreatePostLike, PostResponse},
+  sensitive::Sensitive,
+  utils::get_local_user_view_from_jwt,
+  websocket::{
+    send::{send_comment_ws_message_simple, send_post_ws_message},
+    UserOperation,
+  },
 };
 use lemmy_db_schema::{
+  newtypes::CommunityId,
   source::{
     comment::{CommentLike, CommentLikeForm},
+    community::Community,
+    person::Person,
     post::{PostLike, PostLikeForm},
   },
-  traits::Likeable,
+  traits::{Crud, Likeable},
 };
 use lemmy_utils::error::LemmyError;
-use lemmy_websocket::{
-  send::{send_comment_ws_message_simple, send_post_ws_message},
-  LemmyContext,
-  UserOperation,
-};
 
 pub mod undo_vote;
 pub mod vote;
 
+#[async_trait::async_trait(?Send)]
+impl SendActivity for CreatePostLike {
+  type Response = PostResponse;
+
+  async fn send_activity(
+    request: &Self,
+    response: &Self::Response,
+    context: &LemmyContext,
+  ) -> Result<(), LemmyError> {
+    let object_id = ObjectId::new(response.post_view.post.ap_id.clone());
+    let community_id = response.post_view.community.id;
+    send_activity(
+      object_id,
+      community_id,
+      request.score,
+      &request.auth,
+      context,
+    )
+    .await
+  }
+}
+
+#[async_trait::async_trait(?Send)]
+impl SendActivity for CreateCommentLike {
+  type Response = CommentResponse;
+
+  async fn send_activity(
+    request: &Self,
+    response: &Self::Response,
+    context: &LemmyContext,
+  ) -> Result<(), LemmyError> {
+    let object_id = ObjectId::new(response.comment_view.comment.ap_id.clone());
+    let community_id = response.comment_view.community.id;
+    send_activity(
+      object_id,
+      community_id,
+      request.score,
+      &request.auth,
+      context,
+    )
+    .await
+  }
+}
+
+async fn send_activity(
+  object_id: ObjectId<PostOrComment>,
+  community_id: CommunityId,
+  score: i16,
+  jwt: &Sensitive<String>,
+  context: &LemmyContext,
+) -> Result<(), LemmyError> {
+  let community = Community::read(context.pool(), community_id).await?.into();
+  let local_user_view = get_local_user_view_from_jwt(jwt, context.pool(), context.secret()).await?;
+  let actor = Person::read(context.pool(), local_user_view.person.id)
+    .await?
+    .into();
+
+  // score of 1 means upvote, -1 downvote, 0 undo a previous vote
+  if score != 0 {
+    let vote = Vote::new(object_id, &actor, &community, score.try_into()?, context)?;
+    let activity = AnnouncableActivities::Vote(vote);
+    send_activity_in_community(activity, &actor, &community, vec![], false, context).await
+  } else {
+    // Lemmy API doesnt distinguish between Undo/Like and Undo/Dislike, so we hardcode it here.
+    let vote = Vote::new(object_id, &actor, &community, VoteType::Like, context)?;
+    let undo_vote = UndoVote::new(vote, &actor, &community, context)?;
+    let activity = AnnouncableActivities::UndoVote(undo_vote);
+    send_activity_in_community(activity, &actor, &community, vec![], false, context).await
+  }
+}
+
 #[tracing::instrument(skip_all)]
 async fn vote_comment(
   vote_type: &VoteType,
index 20c9432cde52957362b31fa5b1785607ada51717..7a419e879b388bc61b6be26af84cd6d1ca6aeded 100644 (file)
@@ -1,18 +1,13 @@
 use crate::{
   activities::{
-    community::send_activity_in_community,
     generate_activity_id,
     verify_person_in_community,
     voting::{undo_vote_comment, undo_vote_post},
   },
-  activity_lists::AnnouncableActivities,
   local_instance,
   objects::{community::ApubCommunity, person::ApubPerson},
   protocol::{
-    activities::voting::{
-      undo_vote::UndoVote,
-      vote::{Vote, VoteType},
-    },
+    activities::voting::{undo_vote::UndoVote, vote::Vote},
     InCommunity,
   },
   ActorType,
@@ -25,39 +20,27 @@ use activitypub_federation::{
   utils::verify_urls_match,
 };
 use activitystreams_kinds::activity::UndoType;
-use lemmy_db_schema::{newtypes::CommunityId, source::community::Community, traits::Crud};
+use lemmy_api_common::context::LemmyContext;
 use lemmy_utils::error::LemmyError;
-use lemmy_websocket::LemmyContext;
 use url::Url;
 
 impl UndoVote {
-  /// UndoVote has as:Public value in cc field, unlike other activities. This indicates to other
-  /// software (like GNU social, or presumably Mastodon), that the like actor should not be
-  /// disclosed.
-  #[tracing::instrument(skip_all)]
-  pub async fn send(
-    object: &PostOrComment,
+  pub(in crate::activities::voting) fn new(
+    vote: Vote,
     actor: &ApubPerson,
-    community_id: CommunityId,
-    kind: VoteType,
+    community: &ApubCommunity,
     context: &LemmyContext,
-  ) -> Result<(), LemmyError> {
-    let community: ApubCommunity = Community::read(context.pool(), community_id).await?.into();
-
-    let object = Vote::new(object, actor, &community, kind.clone(), context)?;
-    let id = generate_activity_id(
-      UndoType::Undo,
-      &context.settings().get_protocol_and_hostname(),
-    )?;
-    let undo_vote = UndoVote {
+  ) -> Result<Self, LemmyError> {
+    Ok(UndoVote {
       actor: ObjectId::new(actor.actor_id()),
-      object,
+      object: vote,
       kind: UndoType::Undo,
-      id: id.clone(),
+      id: generate_activity_id(
+        UndoType::Undo,
+        &context.settings().get_protocol_and_hostname(),
+      )?,
       audience: Some(ObjectId::new(community.actor_id())),
-    };
-    let activity = AnnouncableActivities::UndoVote(undo_vote);
-    send_activity_in_community(activity, actor, &community, vec![], false, context).await
+    })
   }
 }
 
index f8d44ed9878444b48f0dae5c166a58ed2ec13602..e435b682350f5ad1ca2dcbb38888c447a62aa477 100644 (file)
@@ -1,11 +1,9 @@
 use crate::{
   activities::{
-    community::send_activity_in_community,
     generate_activity_id,
     verify_person_in_community,
     voting::{vote_comment, vote_post},
   },
-  activity_lists::AnnouncableActivities,
   local_instance,
   objects::{community::ApubCommunity, person::ApubPerson},
   protocol::{
@@ -17,20 +15,14 @@ use crate::{
 };
 use activitypub_federation::{core::object_id::ObjectId, data::Data, traits::ActivityHandler};
 use anyhow::anyhow;
-use lemmy_db_schema::{
-  newtypes::CommunityId,
-  source::{community::Community, local_site::LocalSite},
-  traits::Crud,
-};
+use lemmy_api_common::context::LemmyContext;
+use lemmy_db_schema::source::local_site::LocalSite;
 use lemmy_utils::error::LemmyError;
-use lemmy_websocket::LemmyContext;
 use url::Url;
 
-/// Vote has as:Public value in cc field, unlike other activities. This indicates to other software
-/// (like GNU social, or presumably Mastodon), that the like actor should not be disclosed.
 impl Vote {
   pub(in crate::activities::voting) fn new(
-    object: &PostOrComment,
+    object_id: ObjectId<PostOrComment>,
     actor: &ApubPerson,
     community: &ApubCommunity,
     kind: VoteType,
@@ -38,27 +30,12 @@ impl Vote {
   ) -> Result<Vote, LemmyError> {
     Ok(Vote {
       actor: ObjectId::new(actor.actor_id()),
-      object: ObjectId::new(object.ap_id()),
+      object: object_id,
       kind: kind.clone(),
       id: generate_activity_id(kind, &context.settings().get_protocol_and_hostname())?,
       audience: Some(ObjectId::new(community.actor_id())),
     })
   }
-
-  #[tracing::instrument(skip_all)]
-  pub async fn send(
-    object: &PostOrComment,
-    actor: &ApubPerson,
-    community_id: CommunityId,
-    kind: VoteType,
-    context: &LemmyContext,
-  ) -> Result<(), LemmyError> {
-    let community = Community::read(context.pool(), community_id).await?.into();
-    let vote = Vote::new(object, actor, &community, kind, context)?;
-
-    let activity = AnnouncableActivities::Vote(vote);
-    send_activity_in_community(activity, actor, &community, vec![], false, context).await
-  }
 }
 
 #[async_trait::async_trait(?Send)]
index fa8eece38921fbd29bd22c7a354c0b0fb9c07e9d..6e1771127a00765ba652835ec7b24a25021ebd99 100644 (file)
@@ -24,8 +24,8 @@ use crate::{
   },
 };
 use activitypub_federation::{data::Data, deser::context::WithContext, traits::ActivityHandler};
+use lemmy_api_common::context::LemmyContext;
 use lemmy_utils::error::LemmyError;
-use lemmy_websocket::LemmyContext;
 use serde::{Deserialize, Serialize};
 use url::Url;
 
similarity index 93%
rename from crates/api_crud/src/comment/list.rs
rename to crates/apub/src/api/list_comments.rs
index afee451a3ea1b0948447d129d0be51331db17a2a..c4af6900aa3c7d1102326706c96bb24077488429 100644 (file)
@@ -1,24 +1,27 @@
-use crate::PerformCrud;
+use crate::{
+  api::PerformApub,
+  fetcher::resolve_actor_identifier,
+  objects::community::ApubCommunity,
+};
 use actix_web::web::Data;
 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,
   },
 };
-use lemmy_apub::{fetcher::resolve_actor_identifier, objects::community::ApubCommunity};
 use lemmy_db_schema::{
   source::{comment::Comment, community::Community, local_site::LocalSite},
   traits::{Crud, DeleteableOrRemoveable},
 };
 use lemmy_db_views::comment_view::CommentQuery;
 use lemmy_utils::{error::LemmyError, ConnectionId};
-use lemmy_websocket::LemmyContext;
 
 #[async_trait::async_trait(?Send)]
-impl PerformCrud for GetComments {
+impl PerformApub for GetComments {
   type Response = GetCommentsResponse;
 
   #[tracing::instrument(skip(context, _websocket_id))]
similarity index 93%
rename from crates/api_crud/src/post/list.rs
rename to crates/apub/src/api/list_posts.rs
index bf4086e47ab4d893af312862d1bb7bda94b4d03c..7a1f815c78f48fba77de0c1cb50409f240c9de2d 100644 (file)
@@ -1,6 +1,11 @@
-use crate::PerformCrud;
+use crate::{
+  api::PerformApub,
+  fetcher::resolve_actor_identifier,
+  objects::community::ApubCommunity,
+};
 use actix_web::web::Data;
 use lemmy_api_common::{
+  context::LemmyContext,
   post::{GetPosts, GetPostsResponse},
   utils::{
     check_private_instance,
@@ -8,17 +13,15 @@ use lemmy_api_common::{
     listing_type_with_site_default,
   },
 };
-use lemmy_apub::{fetcher::resolve_actor_identifier, objects::community::ApubCommunity};
 use lemmy_db_schema::{
   source::{community::Community, local_site::LocalSite},
   traits::DeleteableOrRemoveable,
 };
 use lemmy_db_views::post_view::PostQuery;
 use lemmy_utils::{error::LemmyError, ConnectionId};
-use lemmy_websocket::LemmyContext;
 
 #[async_trait::async_trait(?Send)]
-impl PerformCrud for GetPosts {
+impl PerformApub for GetPosts {
   type Response = GetPostsResponse;
 
   #[tracing::instrument(skip(context, _websocket_id))]
diff --git a/crates/apub/src/api/mod.rs b/crates/apub/src/api/mod.rs
new file mode 100644 (file)
index 0000000..233f72f
--- /dev/null
@@ -0,0 +1,21 @@
+use actix_web::web::Data;
+use lemmy_api_common::context::LemmyContext;
+use lemmy_utils::{error::LemmyError, ConnectionId};
+
+mod list_comments;
+mod list_posts;
+mod read_community;
+mod read_person;
+mod resolve_object;
+mod search;
+
+#[async_trait::async_trait(?Send)]
+pub trait PerformApub {
+  type Response: serde::ser::Serialize + Send;
+
+  async fn perform(
+    &self,
+    context: &Data<LemmyContext>,
+    websocket_id: Option<ConnectionId>,
+  ) -> Result<Self::Response, LemmyError>;
+}
similarity index 91%
rename from crates/api_crud/src/community/read.rs
rename to crates/apub/src/api/read_community.rs
index 1b3e5ff488f4ebcfbb2df59d3e00acc727363a8c..b1615d7d75aa466ef6f386a3e8cc58f512a1b90a 100644 (file)
@@ -1,12 +1,14 @@
-use crate::PerformCrud;
+use crate::{
+  api::PerformApub,
+  fetcher::resolve_actor_identifier,
+  objects::community::ApubCommunity,
+};
 use actix_web::web::Data;
 use lemmy_api_common::{
   community::{GetCommunity, GetCommunityResponse},
+  context::LemmyContext,
   utils::{check_private_instance, get_local_user_view_from_jwt_opt},
-};
-use lemmy_apub::{
-  fetcher::resolve_actor_identifier,
-  objects::{community::ApubCommunity, instance::instance_actor_id_from_url},
+  websocket::messages::GetCommunityUsersOnline,
 };
 use lemmy_db_schema::{
   impls::actor_language::default_post_language,
@@ -20,10 +22,9 @@ use lemmy_db_schema::{
 };
 use lemmy_db_views_actor::structs::{CommunityModeratorView, CommunityView};
 use lemmy_utils::{error::LemmyError, ConnectionId};
-use lemmy_websocket::{messages::GetCommunityUsersOnline, LemmyContext};
 
 #[async_trait::async_trait(?Send)]
-impl PerformCrud for GetCommunity {
+impl PerformApub for GetCommunity {
   type Response = GetCommunityResponse;
 
   #[tracing::instrument(skip(context, _websocket_id))]
@@ -77,7 +78,8 @@ impl PerformCrud for GetCommunity {
       .await
       .unwrap_or(1);
 
-    let site_id = instance_actor_id_from_url(community_view.community.actor_id.clone().into());
+    let site_id =
+      Site::instance_actor_id_from_url(community_view.community.actor_id.clone().into());
     let mut site = Site::read_from_apub_id(context.pool(), site_id).await?;
     // no need to include metadata for local site (its already available through other endpoints).
     // this also prevents us from leaking the federation private key.
similarity index 95%
rename from crates/api_crud/src/user/read.rs
rename to crates/apub/src/api/read_person.rs
index ccf5189cddf2b6516e61b52d4994b53f4c38d607..514bcfccc1c3ada70279917a81f149fa696e15eb 100644 (file)
@@ -1,10 +1,10 @@
-use crate::PerformCrud;
+use crate::{api::PerformApub, fetcher::resolve_actor_identifier, objects::person::ApubPerson};
 use actix_web::web::Data;
 use lemmy_api_common::{
+  context::LemmyContext,
   person::{GetPersonDetails, GetPersonDetailsResponse},
   utils::{check_private_instance, get_local_user_view_from_jwt_opt},
 };
-use lemmy_apub::{fetcher::resolve_actor_identifier, objects::person::ApubPerson};
 use lemmy_db_schema::{
   source::{local_site::LocalSite, person::Person},
   utils::post_to_comment_sort_type,
@@ -12,10 +12,9 @@ use lemmy_db_schema::{
 use lemmy_db_views::{comment_view::CommentQuery, post_view::PostQuery};
 use lemmy_db_views_actor::structs::{CommunityModeratorView, PersonViewSafe};
 use lemmy_utils::{error::LemmyError, ConnectionId};
-use lemmy_websocket::LemmyContext;
 
 #[async_trait::async_trait(?Send)]
-impl PerformCrud for GetPersonDetails {
+impl PerformApub for GetPersonDetails {
   type Response = GetPersonDetailsResponse;
 
   #[tracing::instrument(skip(self, context, _websocket_id))]
similarity index 93%
rename from crates/api/src/site/resolve_object.rs
rename to crates/apub/src/api/resolve_object.rs
index 0e59c6835f9472ad81180b4a1da7fc5a2f1b9ab4..c179ed58219d0a6bd5dd272942cb86e050518538 100644 (file)
@@ -1,19 +1,21 @@
-use crate::Perform;
+use crate::{
+  api::PerformApub,
+  fetcher::search::{search_query_to_object_id, SearchableObjects},
+};
 use actix_web::web::Data;
 use diesel::NotFound;
 use lemmy_api_common::{
+  context::LemmyContext,
   site::{ResolveObject, ResolveObjectResponse},
   utils::{check_private_instance, get_local_user_view_from_jwt_opt},
 };
-use lemmy_apub::fetcher::search::{search_query_to_object_id, SearchableObjects};
 use lemmy_db_schema::{newtypes::PersonId, source::local_site::LocalSite, utils::DbPool};
 use lemmy_db_views::structs::{CommentView, PostView};
 use lemmy_db_views_actor::structs::{CommunityView, PersonViewSafe};
 use lemmy_utils::{error::LemmyError, ConnectionId};
-use lemmy_websocket::LemmyContext;
 
 #[async_trait::async_trait(?Send)]
-impl Perform for ResolveObject {
+impl PerformApub for ResolveObject {
   type Response = ResolveObjectResponse;
 
   #[tracing::instrument(skip(context, _websocket_id))]
similarity index 97%
rename from crates/api/src/site/search.rs
rename to crates/apub/src/api/search.rs
index 5d813fcfdfa1621bdecd19677ededa7bcda72c87..cad41c5497ab323b682a7380c5ddfda424ebe5cd 100644 (file)
@@ -1,10 +1,14 @@
-use crate::Perform;
+use crate::{
+  api::PerformApub,
+  fetcher::resolve_actor_identifier,
+  objects::community::ApubCommunity,
+};
 use actix_web::web::Data;
 use lemmy_api_common::{
+  context::LemmyContext,
   site::{Search, SearchResponse},
   utils::{check_private_instance, get_local_user_view_from_jwt_opt},
 };
-use lemmy_apub::{fetcher::resolve_actor_identifier, objects::community::ApubCommunity};
 use lemmy_db_schema::{
   source::{community::Community, local_site::LocalSite},
   traits::DeleteableOrRemoveable,
@@ -14,10 +18,9 @@ use lemmy_db_schema::{
 use lemmy_db_views::{comment_view::CommentQuery, post_view::PostQuery};
 use lemmy_db_views_actor::{community_view::CommunityQuery, person_view::PersonQuery};
 use lemmy_utils::{error::LemmyError, ConnectionId};
-use lemmy_websocket::LemmyContext;
 
 #[async_trait::async_trait(?Send)]
-impl Perform for Search {
+impl PerformApub for Search {
   type Response = SearchResponse;
 
   #[tracing::instrument(skip(context, _websocket_id))]
index b7575370880e0df254fe257cc35385908e6abc8d..9616ddb306acc07a2608950233f87f5d770ffe52 100644 (file)
@@ -1,6 +1,5 @@
 use crate::{
   collections::CommunityContext,
-  generate_moderators_url,
   local_instance,
   objects::person::ApubPerson,
   protocol::collections::group_moderators::GroupModerators,
@@ -12,6 +11,7 @@ use activitypub_federation::{
 };
 use activitystreams_kinds::collection::OrderedCollectionType;
 use chrono::NaiveDateTime;
+use lemmy_api_common::utils::generate_moderators_url;
 use lemmy_db_schema::{
   source::community::{CommunityModerator, CommunityModeratorForm},
   traits::Joinable,
index c7742de725451300365b082cde4ab2a6b11a7a17..a16fbd02bba8ad75d3b3b1769600b34e167c1ffd 100644 (file)
@@ -1,7 +1,6 @@
 use crate::{
   activity_lists::AnnouncableActivities,
   collections::CommunityContext,
-  generate_outbox_url,
   objects::post::ApubPost,
   protocol::{
     activities::{
@@ -20,6 +19,7 @@ use activitypub_federation::{
 use activitystreams_kinds::collection::OrderedCollectionType;
 use chrono::NaiveDateTime;
 use futures::future::join_all;
+use lemmy_api_common::utils::generate_outbox_url;
 use lemmy_db_schema::{
   source::{person::Person, post::Post},
   traits::Crud,
index e2a274a01ee24328d69adf14b6231b54ac09e6a0..40bdf1206aef77cde5060885d12dbd88b1d8010f 100644 (file)
@@ -1,5 +1,5 @@
 use crate::objects::community::ApubCommunity;
-use lemmy_websocket::LemmyContext;
+use lemmy_api_common::context::LemmyContext;
 
 pub(crate) mod community_moderators;
 pub(crate) mod community_outbox;
index c84ebabbcbf574bd93a603f12f72328d7f06bccd..0eae410c6481f0156d4ac143786d90785ff1668c 100644 (file)
@@ -13,7 +13,7 @@ use lemmy_db_schema::source::{
   site::Site,
 };
 use lemmy_utils::LemmyError;
-use lemmy_websocket::LemmyContext;
+use lemmy_api_common::LemmyContext;
 
 // TODO: merge this trait with ApubObject (means that db_schema needs to depend on apub_lib)
 #[async_trait::async_trait(?Send)]
index d98bb8e4d42e7c3950dd66beb5cc79aa9e254961..0ce4dd8f607e53394de0af1f04ca4432d1d27e0d 100644 (file)
@@ -1,9 +1,9 @@
 use crate::{fetcher::webfinger::webfinger_resolve_actor, ActorType};
 use activitypub_federation::traits::ApubObject;
 use itertools::Itertools;
+use lemmy_api_common::context::LemmyContext;
 use lemmy_db_schema::traits::ApubActor;
 use lemmy_utils::error::LemmyError;
-use lemmy_websocket::LemmyContext;
 
 pub mod post_or_comment;
 pub mod search;
index d2d0b91f64e6fae2c0e58ab08619dfe1ac8033ea..68e176b0145ccc8ca1b078c89e2d90f42fbbbb7a 100644 (file)
@@ -7,12 +7,12 @@ use crate::{
 };
 use activitypub_federation::traits::ApubObject;
 use chrono::NaiveDateTime;
+use lemmy_api_common::context::LemmyContext;
 use lemmy_db_schema::{
   source::{community::Community, post::Post},
   traits::Crud,
 };
 use lemmy_utils::error::LemmyError;
-use lemmy_websocket::LemmyContext;
 use serde::Deserialize;
 use url::Url;
 
@@ -97,16 +97,6 @@ impl ApubObject for PostOrComment {
   }
 }
 
-impl PostOrComment {
-  pub(crate) fn ap_id(&self) -> Url {
-    match self {
-      PostOrComment::Post(p) => p.ap_id.clone(),
-      PostOrComment::Comment(c) => c.ap_id.clone(),
-    }
-    .into()
-  }
-}
-
 #[async_trait::async_trait(?Send)]
 impl InCommunity for PostOrComment {
   async fn community(
index 1daccd3a4f830ba061a8222ae82a98e7a24fd919..ffc2c96118694191ccf554b43b21c2416b01013f 100644 (file)
@@ -6,8 +6,8 @@ use crate::{
 };
 use activitypub_federation::{core::object_id::ObjectId, traits::ApubObject};
 use chrono::NaiveDateTime;
+use lemmy_api_common::context::LemmyContext;
 use lemmy_utils::error::LemmyError;
-use lemmy_websocket::LemmyContext;
 use serde::Deserialize;
 use url::Url;
 
@@ -15,7 +15,7 @@ use url::Url;
 /// ObjectId directly, or a webfinger identifier (@user@example.com or !community@example.com)
 /// which gets resolved to an URL.
 #[tracing::instrument(skip_all)]
-pub async fn search_query_to_object_id(
+pub(crate) async fn search_query_to_object_id(
   query: &str,
   local_only: bool,
   context: &LemmyContext,
@@ -54,7 +54,7 @@ pub async fn search_query_to_object_id(
 
 /// The types of ActivityPub objects that can be fetched directly by searching for their ID.
 #[derive(Debug)]
-pub enum SearchableObjects {
+pub(crate) enum SearchableObjects {
   Person(ApubPerson),
   Community(ApubCommunity),
   Post(ApubPost),
@@ -63,7 +63,7 @@ pub enum SearchableObjects {
 
 #[derive(Deserialize)]
 #[serde(untagged)]
-pub enum SearchableApubTypes {
+pub(crate) enum SearchableApubTypes {
   Group(Group),
   Person(Person),
   Page(Page),
index 156f5e83a6eb6f4969a69ef1576c8340d64e24cc..3af86be1a66a13777aaa4f49963dd3dd8d855fa2 100644 (file)
@@ -5,8 +5,8 @@ use crate::{
 };
 use activitypub_federation::traits::{Actor, ApubObject};
 use chrono::NaiveDateTime;
+use lemmy_api_common::context::LemmyContext;
 use lemmy_utils::error::LemmyError;
-use lemmy_websocket::LemmyContext;
 use serde::{Deserialize, Serialize};
 use url::Url;
 
index 8e97d7d07f9d595d0ac9ee74eb694599657abef4..4746736ebcf8c2c05896dbb4833560046b7e1afc 100644 (file)
@@ -2,30 +2,14 @@ use crate::{local_instance, ActorType, FEDERATION_HTTP_FETCH_LIMIT};
 use activitypub_federation::{core::object_id::ObjectId, traits::ApubObject};
 use anyhow::anyhow;
 use itertools::Itertools;
+use lemmy_api_common::context::LemmyContext;
 use lemmy_db_schema::newtypes::DbUrl;
-use lemmy_utils::error::LemmyError;
-use lemmy_websocket::LemmyContext;
-use serde::{Deserialize, Serialize};
+use lemmy_utils::{error::LemmyError, WebfingerResponse};
 use tracing::debug;
 use url::Url;
 
-#[derive(Serialize, Deserialize, Debug)]
-pub struct WebfingerLink {
-  pub rel: Option<String>,
-  #[serde(rename = "type")]
-  pub kind: Option<String>,
-  pub href: Option<Url>,
-}
-
-#[derive(Serialize, Deserialize, Debug)]
-pub struct WebfingerResponse {
-  pub subject: String,
-  pub links: Vec<WebfingerLink>,
-}
-
 /// Turns a person id like `@name@example.com` into an apub ID, like `https://example.com/user/name`,
 /// using webfinger.
-#[tracing::instrument(skip_all)]
 pub(crate) async fn webfinger_resolve_actor<Kind>(
   identifier: &str,
   local_only: bool,
index 498a23c8ab82ce47b189cdf6896bd862ee32b3a0..5e7de7e25a6c9c9726c5824c7093a0819ed42882 100644 (file)
@@ -5,9 +5,9 @@ use crate::{
 use activitypub_federation::traits::ApubObject;
 use actix_web::{web, web::Path, HttpResponse};
 use diesel::result::Error::NotFound;
+use lemmy_api_common::context::LemmyContext;
 use lemmy_db_schema::{newtypes::CommentId, source::comment::Comment, traits::Crud};
 use lemmy_utils::error::LemmyError;
-use lemmy_websocket::LemmyContext;
 use serde::Deserialize;
 
 #[derive(Deserialize)]
index 8b860f5738f21d66b39f2b20f80eca2acc5c00c9..74809509fb4adad01f0559b5084b339f4db4a87e 100644 (file)
@@ -5,7 +5,6 @@ use crate::{
     community_outbox::ApubCommunityOutbox,
     CommunityContext,
   },
-  generate_outbox_url,
   http::{create_apub_response, create_apub_tombstone_response, receive_lemmy_activity},
   local_instance,
   objects::{community::ApubCommunity, person::ApubPerson},
@@ -17,9 +16,9 @@ use activitypub_federation::{
   traits::ApubObject,
 };
 use actix_web::{web, HttpRequest, HttpResponse};
+use lemmy_api_common::{context::LemmyContext, utils::generate_outbox_url};
 use lemmy_db_schema::{source::community::Community, traits::ApubActor};
 use lemmy_utils::error::LemmyError;
-use lemmy_websocket::LemmyContext;
 use serde::Deserialize;
 
 #[derive(Deserialize)]
index f351ea4f047d82a7b1892c376f2894e3d264a85e..726834c00bf3bdb4f00957569f06abcaf35dd9d8 100644 (file)
@@ -15,9 +15,9 @@ use activitypub_federation::{
 };
 use actix_web::{web, HttpRequest, HttpResponse};
 use http::StatusCode;
+use lemmy_api_common::context::LemmyContext;
 use lemmy_db_schema::source::activity::Activity;
 use lemmy_utils::error::LemmyError;
-use lemmy_websocket::LemmyContext;
 use once_cell::sync::OnceCell;
 use serde::{de::DeserializeOwned, Deserialize, Serialize};
 use serde_json::Value;
index 0ca31bd5cca1b5016b8e7eaee135dd041632b2f8..6a1bc5b35c52efa8da7c1499c83ea45525d3cae3 100644 (file)
@@ -1,16 +1,15 @@
 use crate::{
   activity_lists::PersonInboxActivitiesWithAnnouncable,
   fetcher::user_or_community::UserOrCommunity,
-  generate_outbox_url,
   http::{create_apub_response, create_apub_tombstone_response, receive_lemmy_activity},
   objects::person::ApubPerson,
   protocol::collections::empty_outbox::EmptyOutbox,
 };
 use activitypub_federation::{deser::context::WithContext, traits::ApubObject};
 use actix_web::{web, HttpRequest, HttpResponse};
+use lemmy_api_common::{context::LemmyContext, utils::generate_outbox_url};
 use lemmy_db_schema::{source::person::Person, traits::ApubActor};
 use lemmy_utils::error::LemmyError;
-use lemmy_websocket::LemmyContext;
 use serde::Deserialize;
 
 #[derive(Deserialize)]
index 5da69fb4589da57e5ddfce08de3ed4ffd4e30fc3..bea5da3a46d5cf08f1d72dfa987f6e12362aa8cd 100644 (file)
@@ -5,9 +5,9 @@ use crate::{
 use activitypub_federation::traits::ApubObject;
 use actix_web::{web, HttpResponse};
 use diesel::result::Error::NotFound;
+use lemmy_api_common::context::LemmyContext;
 use lemmy_db_schema::{newtypes::PostId, source::post::Post, traits::Crud};
 use lemmy_utils::error::LemmyError;
-use lemmy_websocket::LemmyContext;
 use serde::Deserialize;
 
 #[derive(Deserialize)]
index 201fc5b3a597e22b5c14df85dd9a57ba0b97ffed..fe6c34f639dc59f0de71abe1129964f757ee12b6 100644 (file)
@@ -6,9 +6,9 @@ use crate::{
 };
 use activitypub_federation::{deser::context::WithContext, traits::ApubObject};
 use actix_web::{web, HttpRequest, HttpResponse};
+use lemmy_api_common::context::LemmyContext;
 use lemmy_db_views::structs::SiteView;
 use lemmy_utils::error::LemmyError;
-use lemmy_websocket::LemmyContext;
 use url::Url;
 
 pub(crate) async fn get_apub_site_http(
index f5d8d3565d84d74a8d1bd2dc005bebbb130467d7..0908a1f4f4ec1cd3fcec5e28cf8acec0c93decab 100644 (file)
@@ -6,21 +6,20 @@ use activitypub_federation::{
   LocalInstance,
   UrlVerifier,
 };
-use anyhow::Context;
 use async_trait::async_trait;
+use lemmy_api_common::context::LemmyContext;
 use lemmy_db_schema::{
-  newtypes::DbUrl,
   source::{activity::Activity, instance::Instance, local_site::LocalSite},
   utils::DbPool,
 };
-use lemmy_utils::{error::LemmyError, location_info, settings::structs::Settings};
-use lemmy_websocket::LemmyContext;
+use lemmy_utils::{error::LemmyError, settings::structs::Settings};
 use once_cell::sync::Lazy;
 use tokio::sync::OnceCell;
-use url::{ParseError, Url};
+use url::Url;
 
 pub mod activities;
 pub(crate) mod activity_lists;
+pub mod api;
 pub(crate) mod collections;
 pub mod fetcher;
 pub mod http;
@@ -193,68 +192,6 @@ pub(crate) fn check_apub_id_valid_with_strictness(
   Ok(())
 }
 
-pub enum EndpointType {
-  Community,
-  Person,
-  Post,
-  Comment,
-  PrivateMessage,
-}
-
-/// Generates an apub endpoint for a given domain, IE xyz.tld
-pub fn generate_local_apub_endpoint(
-  endpoint_type: EndpointType,
-  name: &str,
-  domain: &str,
-) -> Result<DbUrl, ParseError> {
-  let point = match endpoint_type {
-    EndpointType::Community => "c",
-    EndpointType::Person => "u",
-    EndpointType::Post => "post",
-    EndpointType::Comment => "comment",
-    EndpointType::PrivateMessage => "private_message",
-  };
-
-  Ok(Url::parse(&format!("{}/{}/{}", domain, point, name))?.into())
-}
-
-pub fn generate_followers_url(actor_id: &DbUrl) -> Result<DbUrl, ParseError> {
-  Ok(Url::parse(&format!("{}/followers", actor_id))?.into())
-}
-
-pub fn generate_inbox_url(actor_id: &DbUrl) -> Result<DbUrl, ParseError> {
-  Ok(Url::parse(&format!("{}/inbox", actor_id))?.into())
-}
-
-pub fn generate_site_inbox_url(actor_id: &DbUrl) -> Result<DbUrl, ParseError> {
-  let mut actor_id: Url = actor_id.clone().into();
-  actor_id.set_path("site_inbox");
-  Ok(actor_id.into())
-}
-
-pub fn generate_shared_inbox_url(actor_id: &DbUrl) -> Result<DbUrl, LemmyError> {
-  let actor_id: Url = actor_id.clone().into();
-  let url = format!(
-    "{}://{}{}/inbox",
-    &actor_id.scheme(),
-    &actor_id.host_str().context(location_info!())?,
-    if let Some(port) = actor_id.port() {
-      format!(":{}", port)
-    } else {
-      String::new()
-    },
-  );
-  Ok(Url::parse(&url)?.into())
-}
-
-pub fn generate_outbox_url(actor_id: &DbUrl) -> Result<DbUrl, ParseError> {
-  Ok(Url::parse(&format!("{}/outbox", actor_id))?.into())
-}
-
-fn generate_moderators_url(community_id: &DbUrl) -> Result<DbUrl, LemmyError> {
-  Ok(Url::parse(&format!("{}/moderators", community_id))?.into())
-}
-
 /// Store a sent or received activity in the database, for logging purposes. These records are not
 /// persistent.
 #[tracing::instrument(skip(pool))]
@@ -280,3 +217,16 @@ pub trait ActorType: Actor + ApubObject {
     PublicKey::new_main_key(self.actor_id(), self.public_key().to_string())
   }
 }
+
+#[async_trait::async_trait(?Send)]
+pub trait SendActivity {
+  type Response;
+
+  async fn send_activity(
+    _request: &Self,
+    _response: &Self::Response,
+    _context: &LemmyContext,
+  ) -> Result<(), LemmyError> {
+    Ok(())
+  }
+}
index 8e24270d0e329d5382d8426f7fb6fb9cd14b63e2..559078942d88a0556caf26a3f3a76743251c9ffb 100644 (file)
@@ -5,6 +5,7 @@ use crate::{
 };
 use activitypub_federation::core::object_id::ObjectId;
 use activitystreams_kinds::link::MentionType;
+use lemmy_api_common::context::LemmyContext;
 use lemmy_db_schema::{
   source::{comment::Comment, person::Person, post::Post},
   traits::Crud,
@@ -14,7 +15,6 @@ use lemmy_utils::{
   error::LemmyError,
   utils::{scrape_text_for_mentions, MentionData},
 };
-use lemmy_websocket::LemmyContext;
 use serde::{Deserialize, Serialize};
 use serde_json::Value;
 use url::Url;
index df20700fbd5b6bdca4c77b42dd5e077cd5a5404e..ab11b00d857d8d84ee1139839a4af30e2626a610 100644 (file)
@@ -20,7 +20,7 @@ use activitypub_federation::{
 };
 use activitystreams_kinds::{object::NoteType, public};
 use chrono::NaiveDateTime;
-use lemmy_api_common::utils::local_site_opt_to_slur_regex;
+use lemmy_api_common::{context::LemmyContext, utils::local_site_opt_to_slur_regex};
 use lemmy_db_schema::{
   source::{
     comment::{Comment, CommentInsertForm, CommentUpdateForm},
@@ -35,12 +35,11 @@ use lemmy_utils::{
   error::LemmyError,
   utils::{convert_datetime, markdown_to_html, remove_slurs},
 };
-use lemmy_websocket::LemmyContext;
 use std::ops::Deref;
 use url::Url;
 
 #[derive(Clone, Debug)]
-pub struct ApubComment(Comment);
+pub struct ApubComment(pub(crate) Comment);
 
 impl Deref for ApubComment {
   type Target = Comment;
index aefc7edb233cd707c7c0d0e9a1d6e7b53f6b4987..b309d25fc037ccc1a20146b398db0935be2a1318 100644 (file)
@@ -2,8 +2,6 @@ use crate::{
   check_apub_id_valid_with_strictness,
   collections::{community_moderators::ApubCommunityModerators, CommunityContext},
   fetch_local_site_data,
-  generate_moderators_url,
-  generate_outbox_url,
   local_instance,
   objects::instance::fetch_instance_actor_for_object,
   protocol::{
@@ -20,6 +18,10 @@ use activitypub_federation::{
 use activitystreams_kinds::actor::GroupType;
 use chrono::NaiveDateTime;
 use itertools::Itertools;
+use lemmy_api_common::{
+  context::LemmyContext,
+  utils::{generate_moderators_url, generate_outbox_url},
+};
 use lemmy_db_schema::{
   source::{
     actor_language::CommunityLanguage,
@@ -33,7 +35,6 @@ use lemmy_utils::{
   error::LemmyError,
   utils::{convert_datetime, markdown_to_html},
 };
-use lemmy_websocket::LemmyContext;
 use std::ops::Deref;
 use tracing::debug;
 use url::Url;
index 9f33ee518d8da5d4fd6744301d938b9a66c25c2a..5ec4fe9097d64ec7982e76ca156c676df3ab346b 100644 (file)
@@ -20,7 +20,7 @@ use activitypub_federation::{
   utils::verify_domains_match,
 };
 use chrono::NaiveDateTime;
-use lemmy_api_common::utils::local_site_opt_to_slur_regex;
+use lemmy_api_common::{context::LemmyContext, utils::local_site_opt_to_slur_regex};
 use lemmy_db_schema::{
   source::{
     actor_language::SiteLanguage,
@@ -34,7 +34,6 @@ use lemmy_utils::{
   error::LemmyError,
   utils::{check_slurs, check_slurs_opt, convert_datetime, markdown_to_html},
 };
-use lemmy_websocket::LemmyContext;
 use std::ops::Deref;
 use tracing::debug;
 use url::Url;
@@ -177,15 +176,6 @@ impl Actor for ApubSite {
   }
 }
 
-/// Instance actor is at the root path, so we simply need to clear the path and other unnecessary
-/// parts of the url.
-pub fn instance_actor_id_from_url(mut url: Url) -> Url {
-  url.set_fragment(None);
-  url.set_path("");
-  url.set_query(None);
-  url
-}
-
 /// try to fetch the instance actor (to make things like instance rules available)
 pub(in crate::objects) async fn fetch_instance_actor_for_object(
   object_id: Url,
@@ -193,7 +183,7 @@ pub(in crate::objects) async fn fetch_instance_actor_for_object(
   request_counter: &mut i32,
 ) {
   // try to fetch the instance actor (to make things like instance rules available)
-  let instance_id = instance_actor_id_from_url(object_id);
+  let instance_id = Site::instance_actor_id_from_url(object_id);
   let site = ObjectId::<ApubSite>::new(instance_id.clone())
     .dereference(context, local_instance(context).await, request_counter)
     .await;
index 5098d0b2b11507a339f805ad69350a5ae096593b..58e1f23f55e5c0298adccf225e36dbbdf6b4f5cf 100644 (file)
@@ -56,14 +56,17 @@ pub(crate) fn verify_is_remote_object(id: &Url, settings: &Settings) -> Result<(
 pub(crate) mod tests {
   use actix::Actor;
   use anyhow::anyhow;
-  use lemmy_api_common::request::build_user_agent;
+  use lemmy_api_common::{
+    context::LemmyContext,
+    request::build_user_agent,
+    websocket::chat_server::ChatServer,
+  };
   use lemmy_db_schema::{source::secret::Secret, utils::build_db_pool_for_tests};
   use lemmy_utils::{
     error::LemmyError,
     rate_limit::{RateLimitCell, RateLimitConfig},
     settings::SETTINGS,
   };
-  use lemmy_websocket::{chat_server::ChatServer, LemmyContext};
   use reqwest::{Client, Request, Response};
   use reqwest_middleware::{ClientBuilder, Middleware, Next};
   use task_local_extensions::Extensions;
@@ -110,6 +113,7 @@ pub(crate) mod tests {
       pool.clone(),
       |_, _, _, _| Box::pin(x()),
       |_, _, _, _| Box::pin(x()),
+      |_, _, _, _| Box::pin(x()),
       client.clone(),
       settings.clone(),
       secret.clone(),
index fb450557d4e5769388a3b161a207d3bb13df696a..2017b605c84eb7301a7345251d6ba88e00fc0792 100644 (file)
@@ -1,7 +1,6 @@
 use crate::{
   check_apub_id_valid_with_strictness,
   fetch_local_site_data,
-  generate_outbox_url,
   objects::{instance::fetch_instance_actor_for_object, read_from_string_or_source_opt},
   protocol::{
     objects::{
@@ -19,7 +18,10 @@ use activitypub_federation::{
   utils::verify_domains_match,
 };
 use chrono::NaiveDateTime;
-use lemmy_api_common::utils::local_site_opt_to_slur_regex;
+use lemmy_api_common::{
+  context::LemmyContext,
+  utils::{generate_outbox_url, local_site_opt_to_slur_regex},
+};
 use lemmy_db_schema::{
   source::{
     instance::Instance,
@@ -32,7 +34,6 @@ use lemmy_utils::{
   error::LemmyError,
   utils::{check_slurs, check_slurs_opt, convert_datetime, markdown_to_html},
 };
-use lemmy_websocket::LemmyContext;
 use std::ops::Deref;
 use url::Url;
 
index b7d38e347fed06f87fae2b3a2c2d2173ac4a5371..afe025ce263bf4b6ce6f57c7b320a650a9eec76e 100644 (file)
@@ -22,7 +22,11 @@ use activitypub_federation::{
 };
 use activitystreams_kinds::public;
 use chrono::NaiveDateTime;
-use lemmy_api_common::{request::fetch_site_data, utils::local_site_opt_to_slur_regex};
+use lemmy_api_common::{
+  context::LemmyContext,
+  request::fetch_site_data,
+  utils::local_site_opt_to_slur_regex,
+};
 use lemmy_db_schema::{
   self,
   source::{
@@ -38,12 +42,11 @@ use lemmy_utils::{
   error::LemmyError,
   utils::{check_slurs, convert_datetime, markdown_to_html, remove_slurs},
 };
-use lemmy_websocket::LemmyContext;
 use std::ops::Deref;
 use url::Url;
 
 #[derive(Clone, Debug)]
-pub struct ApubPost(Post);
+pub struct ApubPost(pub(crate) Post);
 
 impl Deref for ApubPost {
   type Target = Post;
index 47a9c5d13bee564caa4aa5b96b214cee5cc07b77..4d8c70076c1afe5eea7d08964ec9ffd06bd518a2 100644 (file)
@@ -15,7 +15,7 @@ use activitypub_federation::{
   utils::verify_domains_match,
 };
 use chrono::NaiveDateTime;
-use lemmy_api_common::utils::check_person_block;
+use lemmy_api_common::{context::LemmyContext, utils::check_person_block};
 use lemmy_db_schema::{
   source::{
     person::Person,
@@ -27,12 +27,11 @@ use lemmy_utils::{
   error::LemmyError,
   utils::{convert_datetime, markdown_to_html},
 };
-use lemmy_websocket::LemmyContext;
 use std::ops::Deref;
 use url::Url;
 
 #[derive(Clone, Debug)]
-pub struct ApubPrivateMessage(PrivateMessage);
+pub struct ApubPrivateMessage(pub(crate) PrivateMessage);
 
 impl Deref for ApubPrivateMessage {
   type Target = PrivateMessage;
index 91467a96ca2060412d44332027c1d2ad3d4adc29..3ac040ced0a7b44b3c5b1445e5d86c6de76ce230 100644 (file)
@@ -8,8 +8,8 @@ use activitypub_federation::{core::object_id::ObjectId, deser::helpers::deserial
 use activitystreams_kinds::activity::BlockType;
 use anyhow::anyhow;
 use chrono::{DateTime, FixedOffset};
+use lemmy_api_common::context::LemmyContext;
 use lemmy_utils::error::LemmyError;
-use lemmy_websocket::LemmyContext;
 use serde::{Deserialize, Serialize};
 use serde_with::skip_serializing_none;
 use url::Url;
index ade126eec684ea7cdb9ae9b7f65b88f7e8ea2e92..d818af9de8212dbaaa4e6e38873abeb1bf8b6282 100644 (file)
@@ -6,8 +6,8 @@ use crate::{
 };
 use activitypub_federation::{core::object_id::ObjectId, deser::helpers::deserialize_one_or_many};
 use activitystreams_kinds::activity::UndoType;
+use lemmy_api_common::context::LemmyContext;
 use lemmy_utils::error::LemmyError;
-use lemmy_websocket::LemmyContext;
 use serde::{Deserialize, Serialize};
 use serde_with::skip_serializing_none;
 use url::Url;
index f23fcbae01b0f93832b152d63788fb213d059875..22fc07fcbaf4fd85a130772aeb6f562786ca3ceb 100644 (file)
@@ -6,8 +6,8 @@ use crate::{
 };
 use activitypub_federation::{core::object_id::ObjectId, deser::helpers::deserialize_one_or_many};
 use activitystreams_kinds::activity::AddType;
+use lemmy_api_common::context::LemmyContext;
 use lemmy_utils::error::LemmyError;
-use lemmy_websocket::LemmyContext;
 use serde::{Deserialize, Serialize};
 use url::Url;
 
index 2ee744b7fbed62aed2d9db0b3b520065889c49e3..ce46fb920f6cba3b8aaf22d0992514ee8a3955a7 100644 (file)
@@ -6,8 +6,8 @@ use crate::{
 };
 use activitypub_federation::{core::object_id::ObjectId, deser::helpers::deserialize_one_or_many};
 use activitystreams_kinds::activity::RemoveType;
+use lemmy_api_common::context::LemmyContext;
 use lemmy_utils::error::LemmyError;
-use lemmy_websocket::LemmyContext;
 use serde::{Deserialize, Serialize};
 use url::Url;
 
index 34738c56a49bfee338255c02dbf93566f5aa9c33..0a1ef650fc264c06d20d7e1ba407de3578f2ee0b 100644 (file)
@@ -7,8 +7,8 @@ use crate::{
 };
 use activitypub_federation::{core::object_id::ObjectId, deser::helpers::deserialize_one};
 use activitystreams_kinds::activity::FlagType;
+use lemmy_api_common::context::LemmyContext;
 use lemmy_utils::error::LemmyError;
-use lemmy_websocket::LemmyContext;
 use serde::{Deserialize, Serialize};
 use url::Url;
 
index f534f236945f0747e504d72cf86319a3eeaca8af..9a2f1f48165e7c7c47f09f743ded9016b0f11cd5 100644 (file)
@@ -6,8 +6,8 @@ use crate::{
 };
 use activitypub_federation::{core::object_id::ObjectId, deser::helpers::deserialize_one_or_many};
 use activitystreams_kinds::activity::UpdateType;
+use lemmy_api_common::context::LemmyContext;
 use lemmy_utils::error::LemmyError;
-use lemmy_websocket::LemmyContext;
 use serde::{Deserialize, Serialize};
 use url::Url;
 
index 0de7161f4de639e1be3cec8239e21f839f035d8d..dfa1dbe9ff5d5d5683e5241299ebe73e541ae57e 100644 (file)
@@ -6,9 +6,9 @@ use crate::{
   protocol::{activities::CreateOrUpdateType, objects::note::Note, InCommunity},
 };
 use activitypub_federation::{core::object_id::ObjectId, deser::helpers::deserialize_one_or_many};
+use lemmy_api_common::context::LemmyContext;
 use lemmy_db_schema::{source::community::Community, traits::Crud};
 use lemmy_utils::error::LemmyError;
-use lemmy_websocket::LemmyContext;
 use serde::{Deserialize, Serialize};
 use url::Url;
 
index b0311b5ff99e80f14bac42d45f34f0657d18a6ce..2c15d9f90d98c8a282d18f275e4fbdf9c291159e 100644 (file)
@@ -5,8 +5,8 @@ use crate::{
   protocol::{activities::CreateOrUpdateType, objects::page::Page, InCommunity},
 };
 use activitypub_federation::{core::object_id::ObjectId, deser::helpers::deserialize_one_or_many};
+use lemmy_api_common::context::LemmyContext;
 use lemmy_utils::error::LemmyError;
-use lemmy_websocket::LemmyContext;
 use serde::{Deserialize, Serialize};
 use url::Url;
 
index f5ae40d8a9b82708490ef8b60edf6d5ed14c319a..d92ac2456c044d774a0c8eb1fe79d8682e706c8d 100644 (file)
@@ -7,12 +7,12 @@ use crate::{
 use activitypub_federation::{core::object_id::ObjectId, deser::helpers::deserialize_one_or_many};
 use activitystreams_kinds::activity::DeleteType;
 use anyhow::anyhow;
+use lemmy_api_common::context::LemmyContext;
 use lemmy_db_schema::{
   source::{community::Community, post::Post},
   traits::Crud,
 };
 use lemmy_utils::error::LemmyError;
-use lemmy_websocket::LemmyContext;
 use serde::{Deserialize, Serialize};
 use serde_with::skip_serializing_none;
 use url::Url;
index c4946850a1896e55ce848466de407ced7886e42a..d5249ba9aaa438d2e6156f83f1d67c361613da70 100644 (file)
@@ -6,8 +6,8 @@ use crate::{
 };
 use activitypub_federation::{core::object_id::ObjectId, deser::helpers::deserialize_one_or_many};
 use activitystreams_kinds::activity::UndoType;
+use lemmy_api_common::context::LemmyContext;
 use lemmy_utils::error::LemmyError;
-use lemmy_websocket::LemmyContext;
 use serde::{Deserialize, Serialize};
 use serde_with::skip_serializing_none;
 use url::Url;
index 1d17cf158963e1a3f01047ec476db06ca42fcb43..0973c76a86059d2472b31869c7f7f4e071b171d8 100644 (file)
@@ -6,8 +6,8 @@ use crate::{
 };
 use activitypub_federation::core::object_id::ObjectId;
 use activitystreams_kinds::activity::UndoType;
+use lemmy_api_common::context::LemmyContext;
 use lemmy_utils::error::LemmyError;
-use lemmy_websocket::LemmyContext;
 use serde::{Deserialize, Serialize};
 use url::Url;
 
index 5da9b791c8d7770daa63fcfb9d4d8968752eacda..2a09a45eaa4a4022a48f6abd3679cb36f3e54654 100644 (file)
@@ -6,8 +6,8 @@ use crate::{
   protocol::InCommunity,
 };
 use activitypub_federation::core::object_id::ObjectId;
+use lemmy_api_common::context::LemmyContext;
 use lemmy_utils::error::LemmyError;
-use lemmy_websocket::LemmyContext;
 use serde::{Deserialize, Serialize};
 use std::convert::TryFrom;
 use strum_macros::Display;
index ac1ef228504a26a68e25d3306c0779b59c8c74da..b9cf851827951de3e649435ba30e80a0426401f5 100644 (file)
@@ -1,9 +1,8 @@
-use crate::generate_followers_url;
 use activitystreams_kinds::collection::CollectionType;
+use lemmy_api_common::{context::LemmyContext, utils::generate_followers_url};
 use lemmy_db_schema::source::community::Community;
 use lemmy_db_views_actor::structs::CommunityFollowerView;
 use lemmy_utils::error::LemmyError;
-use lemmy_websocket::LemmyContext;
 use serde::{Deserialize, Serialize};
 use url::Url;
 
index a65e74da225a1d77b6b63956fc321bcf0f65839f..ef0f2a875a8f642b34d85b832e67d9d8766d2b2e 100644 (file)
@@ -1,9 +1,9 @@
 use crate::{local_instance, objects::community::ApubCommunity};
 use activitypub_federation::{deser::values::MediaTypeMarkdown, utils::fetch_object_http};
 use activitystreams_kinds::object::ImageType;
+use lemmy_api_common::context::LemmyContext;
 use lemmy_db_schema::newtypes::DbUrl;
 use lemmy_utils::error::LemmyError;
-use lemmy_websocket::LemmyContext;
 use serde::{de::DeserializeOwned, Deserialize, Serialize};
 use std::collections::HashMap;
 use url::Url;
index 564aed16956e7e5ee05d106d405bd91588c5599d..03f71a348b2d712029b8682fb642bc2a9fe51b98 100644 (file)
@@ -19,7 +19,7 @@ use activitypub_federation::{
 };
 use activitystreams_kinds::actor::GroupType;
 use chrono::{DateTime, FixedOffset};
-use lemmy_api_common::utils::local_site_opt_to_slur_regex;
+use lemmy_api_common::{context::LemmyContext, utils::local_site_opt_to_slur_regex};
 use lemmy_db_schema::{
   newtypes::InstanceId,
   source::community::{CommunityInsertForm, CommunityUpdateForm},
@@ -29,7 +29,6 @@ use lemmy_utils::{
   error::LemmyError,
   utils::{check_slurs, check_slurs_opt},
 };
-use lemmy_websocket::LemmyContext;
 use serde::{Deserialize, Serialize};
 use serde_with::skip_serializing_none;
 use url::Url;
index 21f7bcf38b67ffc30c12d7c7001afe3cc1d5f82a..f561c313df9e624ad2ec692bbefad7237707aa50 100644 (file)
@@ -15,12 +15,12 @@ use activitypub_federation::{
 };
 use activitystreams_kinds::object::NoteType;
 use chrono::{DateTime, FixedOffset};
+use lemmy_api_common::context::LemmyContext;
 use lemmy_db_schema::{
   source::{community::Community, post::Post},
   traits::Crud,
 };
 use lemmy_utils::error::LemmyError;
-use lemmy_websocket::LemmyContext;
 use serde::{Deserialize, Serialize};
 use serde_with::skip_serializing_none;
 use std::ops::Deref;
index b25e1d97c742161596659a7eee9396ebcf0eba2e..a62fb8e57d878a8de695dea561897ea0e15601cd 100644 (file)
@@ -20,9 +20,9 @@ use activitystreams_kinds::{
 };
 use chrono::{DateTime, FixedOffset};
 use itertools::Itertools;
+use lemmy_api_common::context::LemmyContext;
 use lemmy_db_schema::newtypes::DbUrl;
 use lemmy_utils::error::LemmyError;
-use lemmy_websocket::LemmyContext;
 use serde::{Deserialize, Serialize};
 use serde_with::skip_serializing_none;
 use url::Url;
index 42d384eb97daf8d95f244e6cf68dc0a53fe005e1..96f8a2f0555e7836e77e80ce1a4bdf5fa6f01b2f 100644 (file)
@@ -75,4 +75,13 @@ impl Site {
     let conn = &mut get_conn(pool).await?;
     site.order_by(id).offset(1).get_results::<Self>(conn).await
   }
+
+  /// Instance actor is at the root path, so we simply need to clear the path and other unnecessary
+  /// parts of the url.
+  pub fn instance_actor_id_from_url(mut url: Url) -> Url {
+    url.set_fragment(None);
+    url.set_path("");
+    url.set_query(None);
+    url
+  }
 }
index cbcd259c0b7647d11e51312af1eeb91bb04049ae..bc2b573e52ab420b0855ea2a8adc7e4d27e04511 100644 (file)
@@ -13,12 +13,10 @@ doctest = false
 
 [dependencies]
 lemmy_utils = { workspace = true }
-lemmy_websocket = { workspace = true }
 lemmy_db_views = { workspace = true }
 lemmy_db_views_actor = { workspace = true }
 lemmy_db_schema = { workspace = true }
-lemmy_api_common = { workspace = true }
-lemmy_apub = { workspace = true }
+lemmy_api_common = { workspace = true, features = ["full"] }
 diesel = { workspace = true }
 actix-web = { workspace = true }
 anyhow = { workspace = true }
index 436148b964664a27efe0e31860df4bc440212ca7..594bf1153dbb2c6f1ad356e96a12e14fdc1b6f4b 100644 (file)
@@ -1,6 +1,7 @@
 use actix_web::{error::ErrorBadRequest, web, Error, HttpRequest, HttpResponse, Result};
 use anyhow::anyhow;
 use chrono::{DateTime, NaiveDateTime, Utc};
+use lemmy_api_common::context::LemmyContext;
 use lemmy_db_schema::{
   newtypes::LocalUserId,
   source::{community::Community, local_user::LocalUser, person::Person},
@@ -20,7 +21,6 @@ use lemmy_db_views_actor::{
   structs::{CommentReplyView, PersonMentionView},
 };
 use lemmy_utils::{claims::Claims, error::LemmyError, utils::markdown_to_html};
-use lemmy_websocket::LemmyContext;
 use once_cell::sync::Lazy;
 use rss::{
   extension::dublincore::DublinCoreExtensionBuilder,
index 716b18be81426ab58f2837aa8db92b2fc68c3c43..0b1f6fbdd7c8d60e0f6fad1daa2d209c8e98937e 100644 (file)
@@ -11,10 +11,9 @@ use actix_web::{
   HttpResponse,
 };
 use futures::stream::{Stream, StreamExt};
-use lemmy_api_common::utils::get_local_user_view_from_jwt;
+use lemmy_api_common::{context::LemmyContext, utils::get_local_user_view_from_jwt};
 use lemmy_db_schema::source::local_site::LocalSite;
 use lemmy_utils::{claims::Claims, rate_limit::RateLimitCell, REQWEST_TIMEOUT};
-use lemmy_websocket::LemmyContext;
 use reqwest::Body;
 use reqwest_middleware::{ClientWithMiddleware, RequestBuilder};
 use serde::{Deserialize, Serialize};
index 9c3a324029c9403adcba1940d51e489769ed318d..13786e3b691ba0a96c362ef0e768240e3e7f573e 100644 (file)
@@ -1,8 +1,8 @@
 use actix_web::{error::ErrorBadRequest, web, Error, HttpResponse, Result};
 use anyhow::anyhow;
+use lemmy_api_common::context::LemmyContext;
 use lemmy_db_views::structs::SiteView;
 use lemmy_utils::{error::LemmyError, version};
-use lemmy_websocket::LemmyContext;
 use serde::{Deserialize, Serialize};
 use url::Url;
 
index 113959769fd273910fb1df673ad0aa61653972d5..9056ea632be2d2f52ea5af06940d2f9d7ee764bb 100644 (file)
@@ -1,12 +1,11 @@
 use actix_web::{web, web::Query, HttpResponse};
 use anyhow::Context;
-use lemmy_apub::fetcher::webfinger::{WebfingerLink, WebfingerResponse};
+use lemmy_api_common::context::LemmyContext;
 use lemmy_db_schema::{
   source::{community::Community, person::Person},
   traits::ApubActor,
 };
-use lemmy_utils::{error::LemmyError, location_info};
-use lemmy_websocket::LemmyContext;
+use lemmy_utils::{error::LemmyError, location_info, WebfingerLink, WebfingerResponse};
 use serde::Deserialize;
 use url::Url;
 
index beaf173ba3c6294b4fb9580355463776b58de785..eeb588439ab098d5b976fb73439195f678ccb0fc 100644 (file)
@@ -16,7 +16,9 @@ mod test;
 pub mod utils;
 pub mod version;
 
+use serde::{Deserialize, Serialize};
 use std::{fmt, time::Duration};
+use url::Url;
 
 pub type ConnectionId = usize;
 
@@ -31,6 +33,20 @@ impl fmt::Display for IpAddr {
   }
 }
 
+#[derive(Serialize, Deserialize, Debug)]
+pub struct WebfingerLink {
+  pub rel: Option<String>,
+  #[serde(rename = "type")]
+  pub kind: Option<String>,
+  pub href: Option<Url>,
+}
+
+#[derive(Serialize, Deserialize, Debug)]
+pub struct WebfingerResponse {
+  pub subject: String,
+  pub links: Vec<WebfingerLink>,
+}
+
 #[macro_export]
 macro_rules! location_info {
   () => {
diff --git a/crates/websocket/Cargo.toml b/crates/websocket/Cargo.toml
deleted file mode 100644 (file)
index 829b759..0000000
+++ /dev/null
@@ -1,38 +0,0 @@
-[package]
-name = "lemmy_websocket"
-version.workspace = true
-edition.workspace = true
-description.workspace = true
-license.workspace = true
-homepage.workspace = true
-documentation.workspace = true
-repository.workspace = true
-
-[lib]
-name = "lemmy_websocket"
-path = "src/lib.rs"
-doctest = false
-
-[dependencies]
-lemmy_utils = { workspace = true }
-lemmy_api_common = { workspace = true, features = ["full"] }
-lemmy_db_schema = { workspace = true, features = ["full"] }
-lemmy_db_views = { workspace = true, features = ["full"] }
-lemmy_db_views_actor = { workspace = true, features = ["full"] }
-reqwest-middleware = { workspace = true }
-tracing = { workspace = true }
-rand = { workspace = true }
-serde = { workspace = true }
-serde_json = { workspace = true }
-actix = { workspace = true }
-anyhow = { workspace = true }
-diesel = { workspace = true }
-tokio = { workspace = true }
-strum = { workspace = true }
-strum_macros = { workspace = true }
-chrono = { workspace = true }
-actix-web = { workspace = true }
-opentelemetry = { workspace = true }
-tracing-opentelemetry = { workspace = true }
-actix-web-actors = { version = "4.1.0", default-features = false }
-background-jobs = "0.13.0"
index 82a73f884d0aa092622358699c3f382b4740a571..77e5c27d73c6b96ca83ce119a6b3c4e020657834 100644 (file)
@@ -28,6 +28,7 @@ use lemmy_api_common::{
     RemoveCommunity,
     TransferCommunity,
   },
+  context::LemmyContext,
   person::{
     AddAdmin,
     BanPerson,
@@ -94,12 +95,20 @@ use lemmy_api_common::{
     ResolveObject,
     Search,
   },
-  websocket::{CommunityJoin, ModJoin, PostJoin, UserJoin},
+  websocket::{
+    routes::chat_route,
+    serialize_websocket_message,
+    structs::{CommunityJoin, ModJoin, PostJoin, UserJoin},
+    UserOperation,
+    UserOperationApub,
+    UserOperationCrud,
+  },
 };
 use lemmy_api_crud::PerformCrud;
-use lemmy_utils::rate_limit::RateLimitCell;
-use lemmy_websocket::{routes::chat_route, LemmyContext};
+use lemmy_apub::{api::PerformApub, SendActivity};
+use lemmy_utils::{error::LemmyError, rate_limit::RateLimitCell, ConnectionId};
 use serde::Deserialize;
+use std::result;
 
 pub fn config(cfg: &mut web::ServiceConfig, rate_limit: &RateLimitCell) {
   cfg.service(
@@ -123,12 +132,12 @@ pub fn config(cfg: &mut web::ServiceConfig, rate_limit: &RateLimitCell) {
       .service(
         web::resource("/search")
           .wrap(rate_limit.search())
-          .route(web::get().to(route_get::<Search>)),
+          .route(web::get().to(route_get_apub::<Search>)),
       )
       .service(
         web::resource("/resolve_object")
           .wrap(rate_limit.message())
-          .route(web::get().to(route_get::<ResolveObject>)),
+          .route(web::get().to(route_get_apub::<ResolveObject>)),
       )
       // Community
       .service(
@@ -140,7 +149,7 @@ pub fn config(cfg: &mut web::ServiceConfig, rate_limit: &RateLimitCell) {
       .service(
         web::scope("/community")
           .wrap(rate_limit.message())
-          .route("", web::get().to(route_get_crud::<GetCommunity>))
+          .route("", web::get().to(route_get_apub::<GetCommunity>))
           .route("", web::put().to(route_post_crud::<EditCommunity>))
           .route("/hide", web::put().to(route_post::<HideCommunity>))
           .route("/list", web::get().to(route_get_crud::<ListCommunities>))
@@ -182,7 +191,7 @@ pub fn config(cfg: &mut web::ServiceConfig, rate_limit: &RateLimitCell) {
           )
           .route("/lock", web::post().to(route_post::<LockPost>))
           .route("/sticky", web::post().to(route_post::<StickyPost>))
-          .route("/list", web::get().to(route_get_crud::<GetPosts>))
+          .route("/list", web::get().to(route_get_apub::<GetPosts>))
           .route("/like", web::post().to(route_post::<CreatePostLike>))
           .route("/save", web::put().to(route_post::<SavePost>))
           .route("/join", web::post().to(route_post::<PostJoin>))
@@ -218,7 +227,7 @@ pub fn config(cfg: &mut web::ServiceConfig, rate_limit: &RateLimitCell) {
           )
           .route("/like", web::post().to(route_post::<CreateCommentLike>))
           .route("/save", web::put().to(route_post::<SaveComment>))
-          .route("/list", web::get().to(route_get_crud::<GetComments>))
+          .route("/list", web::get().to(route_get_apub::<GetComments>))
           .route("/report", web::post().to(route_post::<CreateCommentReport>))
           .route(
             "/report/resolve",
@@ -276,7 +285,7 @@ pub fn config(cfg: &mut web::ServiceConfig, rate_limit: &RateLimitCell) {
       .service(
         web::scope("/user")
           .wrap(rate_limit.message())
-          .route("", web::get().to(route_get_crud::<GetPersonDetails>))
+          .route("", web::get().to(route_get_apub::<GetPersonDetails>))
           .route("/mention", web::get().to(route_get::<GetPersonMentions>))
           .route(
             "/mention/mark_as_read",
@@ -349,19 +358,21 @@ pub fn config(cfg: &mut web::ServiceConfig, rate_limit: &RateLimitCell) {
   );
 }
 
-async fn perform<Request>(
-  data: Request,
+async fn perform<'a, Data>(
+  data: Data,
   context: web::Data<LemmyContext>,
 ) -> Result<HttpResponse, Error>
 where
-  Request: Perform,
-  Request: Send + 'static,
+  Data: Perform
+    + SendActivity<Response = <Data as Perform>::Response>
+    + Clone
+    + Deserialize<'a>
+    + Send
+    + 'static,
 {
-  let res = data
-    .perform(&context, None)
-    .await
-    .map(|json| HttpResponse::Ok().json(json))?;
-  Ok(res)
+  let res = data.perform(&context, None).await?;
+  SendActivity::send_activity(&data, &res, &context).await?;
+  Ok(HttpResponse::Ok().json(res))
 }
 
 async fn route_get<'a, Data>(
@@ -369,34 +380,63 @@ async fn route_get<'a, Data>(
   context: web::Data<LemmyContext>,
 ) -> Result<HttpResponse, Error>
 where
-  Data: Deserialize<'a> + Send + 'static + Perform,
+  Data: Perform
+    + SendActivity<Response = <Data as Perform>::Response>
+    + Clone
+    + Deserialize<'a>
+    + Send
+    + 'static,
 {
   perform::<Data>(data.0, context).await
 }
 
+async fn route_get_apub<'a, Data>(
+  data: web::Query<Data>,
+  context: web::Data<LemmyContext>,
+) -> Result<HttpResponse, Error>
+where
+  Data: PerformApub
+    + SendActivity<Response = <Data as PerformApub>::Response>
+    + Clone
+    + Deserialize<'a>
+    + Send
+    + 'static,
+{
+  let res = data.perform(&context, None).await?;
+  SendActivity::send_activity(&data.0, &res, &context).await?;
+  Ok(HttpResponse::Ok().json(res))
+}
+
 async fn route_post<'a, Data>(
   data: web::Json<Data>,
   context: web::Data<LemmyContext>,
 ) -> Result<HttpResponse, Error>
 where
-  Data: Deserialize<'a> + Send + 'static + Perform,
+  Data: Perform
+    + SendActivity<Response = <Data as Perform>::Response>
+    + Clone
+    + Deserialize<'a>
+    + Send
+    + 'static,
 {
   perform::<Data>(data.0, context).await
 }
 
-async fn perform_crud<Request>(
-  data: Request,
+async fn perform_crud<'a, Data>(
+  data: Data,
   context: web::Data<LemmyContext>,
 ) -> Result<HttpResponse, Error>
 where
-  Request: PerformCrud,
-  Request: Send + 'static,
+  Data: PerformCrud
+    + SendActivity<Response = <Data as PerformCrud>::Response>
+    + Clone
+    + Deserialize<'a>
+    + Send
+    + 'static,
 {
-  let res = data
-    .perform(&context, None)
-    .await
-    .map(|json| HttpResponse::Ok().json(json))?;
-  Ok(res)
+  let res = data.perform(&context, None).await?;
+  SendActivity::send_activity(&data, &res, &context).await?;
+  Ok(HttpResponse::Ok().json(res))
 }
 
 async fn route_get_crud<'a, Data>(
@@ -404,7 +444,12 @@ async fn route_get_crud<'a, Data>(
   context: web::Data<LemmyContext>,
 ) -> Result<HttpResponse, Error>
 where
-  Data: Deserialize<'a> + Send + 'static + PerformCrud,
+  Data: PerformCrud
+    + SendActivity<Response = <Data as PerformCrud>::Response>
+    + Clone
+    + Deserialize<'a>
+    + Send
+    + 'static,
 {
   perform_crud::<Data>(data.0, context).await
 }
@@ -414,7 +459,340 @@ async fn route_post_crud<'a, Data>(
   context: web::Data<LemmyContext>,
 ) -> Result<HttpResponse, Error>
 where
-  Data: Deserialize<'a> + Send + 'static + PerformCrud,
+  Data: PerformCrud
+    + SendActivity<Response = <Data as PerformCrud>::Response>
+    + Clone
+    + Deserialize<'a>
+    + Send
+    + 'static,
 {
   perform_crud::<Data>(data.0, context).await
 }
+
+pub async fn match_websocket_operation_crud(
+  context: LemmyContext,
+  id: ConnectionId,
+  op: UserOperationCrud,
+  data: &str,
+) -> result::Result<String, LemmyError> {
+  match op {
+    // User ops
+    UserOperationCrud::Register => {
+      do_websocket_operation_crud::<Register>(context, id, op, data).await
+    }
+    UserOperationCrud::DeleteAccount => {
+      do_websocket_operation_crud::<DeleteAccount>(context, id, op, data).await
+    }
+
+    // Private Message ops
+    UserOperationCrud::CreatePrivateMessage => {
+      do_websocket_operation_crud::<CreatePrivateMessage>(context, id, op, data).await
+    }
+    UserOperationCrud::EditPrivateMessage => {
+      do_websocket_operation_crud::<EditPrivateMessage>(context, id, op, data).await
+    }
+    UserOperationCrud::DeletePrivateMessage => {
+      do_websocket_operation_crud::<DeletePrivateMessage>(context, id, op, data).await
+    }
+    UserOperationCrud::GetPrivateMessages => {
+      do_websocket_operation_crud::<GetPrivateMessages>(context, id, op, data).await
+    }
+
+    // Site ops
+    UserOperationCrud::CreateSite => {
+      do_websocket_operation_crud::<CreateSite>(context, id, op, data).await
+    }
+    UserOperationCrud::EditSite => {
+      do_websocket_operation_crud::<EditSite>(context, id, op, data).await
+    }
+    UserOperationCrud::GetSite => {
+      do_websocket_operation_crud::<GetSite>(context, id, op, data).await
+    }
+
+    // Community ops
+    UserOperationCrud::ListCommunities => {
+      do_websocket_operation_crud::<ListCommunities>(context, id, op, data).await
+    }
+    UserOperationCrud::CreateCommunity => {
+      do_websocket_operation_crud::<CreateCommunity>(context, id, op, data).await
+    }
+    UserOperationCrud::EditCommunity => {
+      do_websocket_operation_crud::<EditCommunity>(context, id, op, data).await
+    }
+    UserOperationCrud::DeleteCommunity => {
+      do_websocket_operation_crud::<DeleteCommunity>(context, id, op, data).await
+    }
+    UserOperationCrud::RemoveCommunity => {
+      do_websocket_operation_crud::<RemoveCommunity>(context, id, op, data).await
+    }
+
+    // Post ops
+    UserOperationCrud::CreatePost => {
+      do_websocket_operation_crud::<CreatePost>(context, id, op, data).await
+    }
+    UserOperationCrud::GetPost => {
+      do_websocket_operation_crud::<GetPost>(context, id, op, data).await
+    }
+    UserOperationCrud::EditPost => {
+      do_websocket_operation_crud::<EditPost>(context, id, op, data).await
+    }
+    UserOperationCrud::DeletePost => {
+      do_websocket_operation_crud::<DeletePost>(context, id, op, data).await
+    }
+    UserOperationCrud::RemovePost => {
+      do_websocket_operation_crud::<RemovePost>(context, id, op, data).await
+    }
+
+    // Comment ops
+    UserOperationCrud::CreateComment => {
+      do_websocket_operation_crud::<CreateComment>(context, id, op, data).await
+    }
+    UserOperationCrud::EditComment => {
+      do_websocket_operation_crud::<EditComment>(context, id, op, data).await
+    }
+    UserOperationCrud::DeleteComment => {
+      do_websocket_operation_crud::<DeleteComment>(context, id, op, data).await
+    }
+    UserOperationCrud::RemoveComment => {
+      do_websocket_operation_crud::<RemoveComment>(context, id, op, data).await
+    }
+    UserOperationCrud::GetComment => {
+      do_websocket_operation_crud::<GetComment>(context, id, op, data).await
+    }
+  }
+}
+
+async fn do_websocket_operation_crud<'a, 'b, Data>(
+  context: LemmyContext,
+  id: ConnectionId,
+  op: UserOperationCrud,
+  data: &str,
+) -> result::Result<String, LemmyError>
+where
+  Data: PerformCrud + SendActivity<Response = <Data as PerformCrud>::Response>,
+  for<'de> Data: Deserialize<'de>,
+{
+  let parsed_data: Data = serde_json::from_str(data)?;
+  let res = parsed_data
+    .perform(&web::Data::new(context.clone()), Some(id))
+    .await?;
+  SendActivity::send_activity(&parsed_data, &res, &context).await?;
+  serialize_websocket_message(&op, &res)
+}
+
+pub async fn match_websocket_operation_apub(
+  context: LemmyContext,
+  id: ConnectionId,
+  op: UserOperationApub,
+  data: &str,
+) -> result::Result<String, LemmyError> {
+  match op {
+    UserOperationApub::GetPersonDetails => {
+      do_websocket_operation_apub::<GetPersonDetails>(context, id, op, data).await
+    }
+    UserOperationApub::GetCommunity => {
+      do_websocket_operation_apub::<GetCommunity>(context, id, op, data).await
+    }
+    UserOperationApub::GetComments => {
+      do_websocket_operation_apub::<GetComments>(context, id, op, data).await
+    }
+    UserOperationApub::GetPosts => {
+      do_websocket_operation_apub::<GetPosts>(context, id, op, data).await
+    }
+    UserOperationApub::ResolveObject => {
+      do_websocket_operation_apub::<ResolveObject>(context, id, op, data).await
+    }
+    UserOperationApub::Search => do_websocket_operation_apub::<Search>(context, id, op, data).await,
+  }
+}
+
+async fn do_websocket_operation_apub<'a, 'b, Data>(
+  context: LemmyContext,
+  id: ConnectionId,
+  op: UserOperationApub,
+  data: &str,
+) -> result::Result<String, LemmyError>
+where
+  Data: PerformApub + SendActivity<Response = <Data as PerformApub>::Response>,
+  for<'de> Data: Deserialize<'de>,
+{
+  let parsed_data: Data = serde_json::from_str(data)?;
+  let res = parsed_data
+    .perform(&web::Data::new(context.clone()), Some(id))
+    .await?;
+  SendActivity::send_activity(&parsed_data, &res, &context).await?;
+  serialize_websocket_message(&op, &res)
+}
+
+pub async fn match_websocket_operation(
+  context: LemmyContext,
+  id: ConnectionId,
+  op: UserOperation,
+  data: &str,
+) -> result::Result<String, LemmyError> {
+  match op {
+    // User ops
+    UserOperation::Login => do_websocket_operation::<Login>(context, id, op, data).await,
+    UserOperation::GetCaptcha => do_websocket_operation::<GetCaptcha>(context, id, op, data).await,
+    UserOperation::GetReplies => do_websocket_operation::<GetReplies>(context, id, op, data).await,
+    UserOperation::AddAdmin => do_websocket_operation::<AddAdmin>(context, id, op, data).await,
+    UserOperation::GetUnreadRegistrationApplicationCount => {
+      do_websocket_operation::<GetUnreadRegistrationApplicationCount>(context, id, op, data).await
+    }
+    UserOperation::ListRegistrationApplications => {
+      do_websocket_operation::<ListRegistrationApplications>(context, id, op, data).await
+    }
+    UserOperation::ApproveRegistrationApplication => {
+      do_websocket_operation::<ApproveRegistrationApplication>(context, id, op, data).await
+    }
+    UserOperation::BanPerson => do_websocket_operation::<BanPerson>(context, id, op, data).await,
+    UserOperation::GetBannedPersons => {
+      do_websocket_operation::<GetBannedPersons>(context, id, op, data).await
+    }
+    UserOperation::BlockPerson => {
+      do_websocket_operation::<BlockPerson>(context, id, op, data).await
+    }
+    UserOperation::GetPersonMentions => {
+      do_websocket_operation::<GetPersonMentions>(context, id, op, data).await
+    }
+    UserOperation::MarkPersonMentionAsRead => {
+      do_websocket_operation::<MarkPersonMentionAsRead>(context, id, op, data).await
+    }
+    UserOperation::MarkCommentReplyAsRead => {
+      do_websocket_operation::<MarkCommentReplyAsRead>(context, id, op, data).await
+    }
+    UserOperation::MarkAllAsRead => {
+      do_websocket_operation::<MarkAllAsRead>(context, id, op, data).await
+    }
+    UserOperation::PasswordReset => {
+      do_websocket_operation::<PasswordReset>(context, id, op, data).await
+    }
+    UserOperation::PasswordChange => {
+      do_websocket_operation::<PasswordChangeAfterReset>(context, id, op, data).await
+    }
+    UserOperation::UserJoin => do_websocket_operation::<UserJoin>(context, id, op, data).await,
+    UserOperation::PostJoin => do_websocket_operation::<PostJoin>(context, id, op, data).await,
+    UserOperation::CommunityJoin => {
+      do_websocket_operation::<CommunityJoin>(context, id, op, data).await
+    }
+    UserOperation::ModJoin => do_websocket_operation::<ModJoin>(context, id, op, data).await,
+    UserOperation::SaveUserSettings => {
+      do_websocket_operation::<SaveUserSettings>(context, id, op, data).await
+    }
+    UserOperation::ChangePassword => {
+      do_websocket_operation::<ChangePassword>(context, id, op, data).await
+    }
+    UserOperation::GetReportCount => {
+      do_websocket_operation::<GetReportCount>(context, id, op, data).await
+    }
+    UserOperation::GetUnreadCount => {
+      do_websocket_operation::<GetUnreadCount>(context, id, op, data).await
+    }
+    UserOperation::VerifyEmail => {
+      do_websocket_operation::<VerifyEmail>(context, id, op, data).await
+    }
+
+    // Private Message ops
+    UserOperation::MarkPrivateMessageAsRead => {
+      do_websocket_operation::<MarkPrivateMessageAsRead>(context, id, op, data).await
+    }
+    UserOperation::CreatePrivateMessageReport => {
+      do_websocket_operation::<CreatePrivateMessageReport>(context, id, op, data).await
+    }
+    UserOperation::ResolvePrivateMessageReport => {
+      do_websocket_operation::<ResolvePrivateMessageReport>(context, id, op, data).await
+    }
+    UserOperation::ListPrivateMessageReports => {
+      do_websocket_operation::<ListPrivateMessageReports>(context, id, op, data).await
+    }
+
+    // Site ops
+    UserOperation::GetModlog => do_websocket_operation::<GetModlog>(context, id, op, data).await,
+    UserOperation::PurgePerson => {
+      do_websocket_operation::<PurgePerson>(context, id, op, data).await
+    }
+    UserOperation::PurgeCommunity => {
+      do_websocket_operation::<PurgeCommunity>(context, id, op, data).await
+    }
+    UserOperation::PurgePost => do_websocket_operation::<PurgePost>(context, id, op, data).await,
+    UserOperation::PurgeComment => {
+      do_websocket_operation::<PurgeComment>(context, id, op, data).await
+    }
+    UserOperation::TransferCommunity => {
+      do_websocket_operation::<TransferCommunity>(context, id, op, data).await
+    }
+    UserOperation::LeaveAdmin => do_websocket_operation::<LeaveAdmin>(context, id, op, data).await,
+
+    // Community ops
+    UserOperation::FollowCommunity => {
+      do_websocket_operation::<FollowCommunity>(context, id, op, data).await
+    }
+    UserOperation::BlockCommunity => {
+      do_websocket_operation::<BlockCommunity>(context, id, op, data).await
+    }
+    UserOperation::BanFromCommunity => {
+      do_websocket_operation::<BanFromCommunity>(context, id, op, data).await
+    }
+    UserOperation::AddModToCommunity => {
+      do_websocket_operation::<AddModToCommunity>(context, id, op, data).await
+    }
+
+    // Post ops
+    UserOperation::LockPost => do_websocket_operation::<LockPost>(context, id, op, data).await,
+    UserOperation::StickyPost => do_websocket_operation::<StickyPost>(context, id, op, data).await,
+    UserOperation::CreatePostLike => {
+      do_websocket_operation::<CreatePostLike>(context, id, op, data).await
+    }
+    UserOperation::MarkPostAsRead => {
+      do_websocket_operation::<MarkPostAsRead>(context, id, op, data).await
+    }
+    UserOperation::SavePost => do_websocket_operation::<SavePost>(context, id, op, data).await,
+    UserOperation::CreatePostReport => {
+      do_websocket_operation::<CreatePostReport>(context, id, op, data).await
+    }
+    UserOperation::ListPostReports => {
+      do_websocket_operation::<ListPostReports>(context, id, op, data).await
+    }
+    UserOperation::ResolvePostReport => {
+      do_websocket_operation::<ResolvePostReport>(context, id, op, data).await
+    }
+    UserOperation::GetSiteMetadata => {
+      do_websocket_operation::<GetSiteMetadata>(context, id, op, data).await
+    }
+
+    // Comment ops
+    UserOperation::SaveComment => {
+      do_websocket_operation::<SaveComment>(context, id, op, data).await
+    }
+    UserOperation::CreateCommentLike => {
+      do_websocket_operation::<CreateCommentLike>(context, id, op, data).await
+    }
+    UserOperation::CreateCommentReport => {
+      do_websocket_operation::<CreateCommentReport>(context, id, op, data).await
+    }
+    UserOperation::ListCommentReports => {
+      do_websocket_operation::<ListCommentReports>(context, id, op, data).await
+    }
+    UserOperation::ResolveCommentReport => {
+      do_websocket_operation::<ResolveCommentReport>(context, id, op, data).await
+    }
+  }
+}
+
+async fn do_websocket_operation<'a, 'b, Data>(
+  context: LemmyContext,
+  id: ConnectionId,
+  op: UserOperation,
+  data: &str,
+) -> result::Result<String, LemmyError>
+where
+  Data: Perform + SendActivity<Response = <Data as Perform>::Response>,
+  for<'de> Data: Deserialize<'de>,
+{
+  let parsed_data: Data = serde_json::from_str(data)?;
+  let res = parsed_data
+    .perform(&web::Data::new(context.clone()), Some(id))
+    .await?;
+  SendActivity::send_activity(&parsed_data, &res, &context).await?;
+  serialize_websocket_message(&op, &res)
+}
index bcbebb503fadc630363f0140e0e50fe665603357..89933a15e3289bb163c25fd51c7e6add80bebc3b 100644 (file)
@@ -8,14 +8,16 @@ use diesel::{
   TextExpressionMethods,
 };
 use diesel_async::RunQueryDsl;
-use lemmy_api_common::lemmy_db_views::structs::SiteView;
-use lemmy_apub::{
-  generate_followers_url,
-  generate_inbox_url,
-  generate_local_apub_endpoint,
-  generate_shared_inbox_url,
-  generate_site_inbox_url,
-  EndpointType,
+use lemmy_api_common::{
+  lemmy_db_views::structs::SiteView,
+  utils::{
+    generate_followers_url,
+    generate_inbox_url,
+    generate_local_apub_endpoint,
+    generate_shared_inbox_url,
+    generate_site_inbox_url,
+    EndpointType,
+  },
 };
 use lemmy_db_schema::{
   source::{
index 728b3d3707571a5a721576bc3662dfe85036c454..c60c1823a3dbf7066490a52a67318a6fffca17d5 100644 (file)
@@ -5,16 +5,16 @@ use actix::prelude::*;
 use actix_web::{middleware, web::Data, App, HttpServer, Result};
 use diesel_migrations::EmbeddedMigrations;
 use doku::json::{AutoComments, CommentsStyle, Formatting, ObjectsStyle};
-use lemmy_api::match_websocket_operation;
 use lemmy_api_common::{
+  context::LemmyContext,
   lemmy_db_views::structs::SiteView,
   request::build_user_agent,
   utils::{
     check_private_instance_and_federation_enabled,
     local_site_rate_limit_to_rate_limit_config,
   },
+  websocket::chat_server::ChatServer,
 };
-use lemmy_api_crud::match_websocket_operation_crud;
 use lemmy_db_schema::{
   source::secret::Secret,
   utils::{build_db_pool, get_database_url, run_migrations},
@@ -22,6 +22,11 @@ use lemmy_db_schema::{
 use lemmy_routes::{feeds, images, nodeinfo, webfinger};
 use lemmy_server::{
   api_routes,
+  api_routes::{
+    match_websocket_operation,
+    match_websocket_operation_apub,
+    match_websocket_operation_crud,
+  },
   code_migrations::run_advanced_migrations,
   init_logging,
   root_span_builder::QuieterRootSpanBuilder,
@@ -32,7 +37,6 @@ use lemmy_utils::{
   rate_limit::RateLimitCell,
   settings::{structs::Settings, SETTINGS},
 };
-use lemmy_websocket::{chat_server::ChatServer, LemmyContext};
 use reqwest::Client;
 use reqwest_middleware::ClientBuilder;
 use reqwest_retry::{policies::ExponentialBackoff, RetryTransientMiddleware};
@@ -135,6 +139,7 @@ async fn main() -> Result<(), LemmyError> {
     pool.clone(),
     |c, i, o, d| Box::pin(match_websocket_operation(c, i, o, d)),
     |c, i, o, d| Box::pin(match_websocket_operation_crud(c, i, o, d)),
+    |c, i, o, d| Box::pin(match_websocket_operation_apub(c, i, o, d)),
     client.clone(),
     settings.clone(),
     secret.clone(),