]> Untitled Git - lemmy.git/blobdiff - src/api_routes_http.rs
Remove SendActivity and Perform traits, rely on channel (#3596)
[lemmy.git] / src / api_routes_http.rs
index 34083a48d19af22ea445770fd04378763ffc427b..bc4340e3cccf5baf61d8fc18fc506ca12791436a 100644 (file)
@@ -1,4 +1,3 @@
-use crate::api_routes_websocket::websocket;
 use actix_web::{guard, web, Error, HttpResponse, Result};
 use lemmy_api::Perform;
 use lemmy_api_common::{
@@ -7,9 +6,9 @@ use lemmy_api_common::{
     CreateCommentLike,
     CreateCommentReport,
     DeleteComment,
+    DistinguishComment,
     EditComment,
     GetComment,
-    GetComments,
     ListCommentReports,
     RemoveComment,
     ResolveCommentReport,
@@ -23,13 +22,13 @@ use lemmy_api_common::{
     DeleteCommunity,
     EditCommunity,
     FollowCommunity,
-    GetCommunity,
     HideCommunity,
     ListCommunities,
     RemoveCommunity,
     TransferCommunity,
   },
   context::LemmyContext,
+  custom_emoji::{CreateCustomEmoji, DeleteCustomEmoji, EditCustomEmoji},
   person::{
     AddAdmin,
     BanPerson,
@@ -38,7 +37,6 @@ use lemmy_api_common::{
     DeleteAccount,
     GetBannedPersons,
     GetCaptcha,
-    GetPersonDetails,
     GetPersonMentions,
     GetReplies,
     GetReportCount,
@@ -54,13 +52,12 @@ use lemmy_api_common::{
     VerifyEmail,
   },
   post::{
-    CreatePost,
     CreatePostLike,
     CreatePostReport,
     DeletePost,
     EditPost,
+    FeaturePost,
     GetPost,
-    GetPosts,
     GetSiteMetadata,
     ListPostReports,
     LockPost,
@@ -68,7 +65,6 @@ use lemmy_api_common::{
     RemovePost,
     ResolvePostReport,
     SavePost,
-    StickyPost,
   },
   private_message::{
     CreatePrivateMessage,
@@ -84,6 +80,7 @@ use lemmy_api_common::{
     ApproveRegistrationApplication,
     CreateSite,
     EditSite,
+    GetFederatedInstances,
     GetModlog,
     GetSite,
     GetUnreadRegistrationApplicationCount,
@@ -93,21 +90,26 @@ use lemmy_api_common::{
     PurgeCommunity,
     PurgePerson,
     PurgePost,
-    ResolveObject,
-    Search,
   },
-  websocket::structs::{CommunityJoin, ModJoin, PostJoin, UserJoin},
 };
-use lemmy_api_crud::PerformCrud;
-use lemmy_apub::{api::PerformApub, SendActivity};
-use lemmy_utils::rate_limit::RateLimitCell;
+use lemmy_api_crud::{post::create::create_post, PerformCrud};
+use lemmy_apub::{
+  api::{
+    list_comments::list_comments,
+    list_posts::list_posts,
+    read_community::read_community,
+    read_person::read_person,
+    resolve_object::resolve_object,
+    search::search,
+  },
+  SendActivity,
+};
+use lemmy_utils::{rate_limit::RateLimitCell, spawn_try_task, SYNCHRONOUS_FEDERATION};
 use serde::Deserialize;
 
 pub fn config(cfg: &mut web::ServiceConfig, rate_limit: &RateLimitCell) {
   cfg.service(
     web::scope("/api/v3")
-      // Websocket
-      .service(web::resource("/ws").to(websocket))
       // Site
       .service(
         web::scope("/site")
@@ -125,12 +127,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_apub::<Search>)),
+          .route(web::get().to(search)),
       )
       .service(
         web::resource("/resolve_object")
           .wrap(rate_limit.message())
-          .route(web::get().to(route_get_apub::<ResolveObject>)),
+          .route(web::get().to(resolve_object)),
       )
       // Community
       .service(
@@ -142,7 +144,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_apub::<GetCommunity>))
+          .route("", web::get().to(read_community))
           .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>))
@@ -159,9 +161,12 @@ pub fn config(cfg: &mut web::ServiceConfig, rate_limit: &RateLimitCell) {
           )
           .route("/transfer", web::post().to(route_post::<TransferCommunity>))
           .route("/ban_user", web::post().to(route_post::<BanFromCommunity>))
-          .route("/mod", web::post().to(route_post::<AddModToCommunity>))
-          .route("/join", web::post().to(route_post::<CommunityJoin>))
-          .route("/mod/join", web::post().to(route_post::<ModJoin>)),
+          .route("/mod", web::post().to(route_post::<AddModToCommunity>)),
+      )
+      .service(
+        web::scope("/federated_instances")
+          .wrap(rate_limit.message())
+          .route("", web::get().to(route_get::<GetFederatedInstances>)),
       )
       // Post
       .service(
@@ -169,7 +174,7 @@ pub fn config(cfg: &mut web::ServiceConfig, rate_limit: &RateLimitCell) {
         web::resource("/post")
           .guard(guard::Post())
           .wrap(rate_limit.post())
-          .route(web::post().to(route_post_crud::<CreatePost>)),
+          .route(web::post().to(create_post)),
       )
       .service(
         web::scope("/post")
@@ -183,11 +188,10 @@ pub fn config(cfg: &mut web::ServiceConfig, rate_limit: &RateLimitCell) {
             web::post().to(route_post::<MarkPostAsRead>),
           )
           .route("/lock", web::post().to(route_post::<LockPost>))
-          .route("/sticky", web::post().to(route_post::<StickyPost>))
-          .route("/list", web::get().to(route_get_apub::<GetPosts>))
+          .route("/feature", web::post().to(route_post::<FeaturePost>))
+          .route("/list", web::get().to(list_posts))
           .route("/like", web::post().to(route_post::<CreatePostLike>))
           .route("/save", web::put().to(route_post::<SavePost>))
-          .route("/join", web::post().to(route_post::<PostJoin>))
           .route("/report", web::post().to(route_post::<CreatePostReport>))
           .route(
             "/report/resolve",
@@ -218,9 +222,13 @@ pub fn config(cfg: &mut web::ServiceConfig, rate_limit: &RateLimitCell) {
             "/mark_as_read",
             web::post().to(route_post::<MarkCommentReplyAsRead>),
           )
+          .route(
+            "/distinguish",
+            web::post().to(route_post::<DistinguishComment>),
+          )
           .route("/like", web::post().to(route_post::<CreateCommentLike>))
           .route("/save", web::put().to(route_post::<SaveComment>))
-          .route("/list", web::get().to(route_get_apub::<GetComments>))
+          .route("/list", web::get().to(list_comments))
           .route("/report", web::post().to(route_post::<CreateCommentReport>))
           .route(
             "/report/resolve",
@@ -278,14 +286,13 @@ pub fn config(cfg: &mut web::ServiceConfig, rate_limit: &RateLimitCell) {
       .service(
         web::scope("/user")
           .wrap(rate_limit.message())
-          .route("", web::get().to(route_get_apub::<GetPersonDetails>))
+          .route("", web::get().to(read_person))
           .route("/mention", web::get().to(route_get::<GetPersonMentions>))
           .route(
             "/mention/mark_as_read",
             web::post().to(route_post::<MarkPersonMentionAsRead>),
           )
           .route("/replies", web::get().to(route_get::<GetReplies>))
-          .route("/join", web::post().to(route_post::<UserJoin>))
           // Admin action. I don't like that it's in /user
           .route("/ban", web::post().to(route_post::<BanPerson>))
           .route("/banned", web::get().to(route_get::<GetBannedPersons>))
@@ -338,15 +345,24 @@ pub fn config(cfg: &mut web::ServiceConfig, rate_limit: &RateLimitCell) {
           .route(
             "/registration_application/approve",
             web::put().to(route_post::<ApproveRegistrationApplication>),
+          )
+          .service(
+            web::scope("/purge")
+              .route("/person", web::post().to(route_post::<PurgePerson>))
+              .route("/community", web::post().to(route_post::<PurgeCommunity>))
+              .route("/post", web::post().to(route_post::<PurgePost>))
+              .route("/comment", web::post().to(route_post::<PurgeComment>)),
           ),
       )
       .service(
-        web::scope("/admin/purge")
+        web::scope("/custom_emoji")
           .wrap(rate_limit.message())
-          .route("/person", web::post().to(route_post::<PurgePerson>))
-          .route("/community", web::post().to(route_post::<PurgeCommunity>))
-          .route("/post", web::post().to(route_post::<PurgePost>))
-          .route("/comment", web::post().to(route_post::<PurgeComment>)),
+          .route("", web::post().to(route_post_crud::<CreateCustomEmoji>))
+          .route("", web::put().to(route_post_crud::<EditCustomEmoji>))
+          .route(
+            "/delete",
+            web::post().to(route_post_crud::<DeleteCustomEmoji>),
+          ),
       ),
   );
 }
@@ -354,6 +370,7 @@ pub fn config(cfg: &mut web::ServiceConfig, rate_limit: &RateLimitCell) {
 async fn perform<'a, Data>(
   data: Data,
   context: web::Data<LemmyContext>,
+  apub_data: activitypub_federation::config::Data<LemmyContext>,
 ) -> Result<HttpResponse, Error>
 where
   Data: Perform
@@ -363,14 +380,21 @@ where
     + Send
     + 'static,
 {
-  let res = data.perform(&context, None).await?;
-  SendActivity::send_activity(&data, &res, &context).await?;
-  Ok(HttpResponse::Ok().json(res))
+  let res = data.perform(&context).await?;
+  let res_clone = res.clone();
+  let fed_task = async move { SendActivity::send_activity(&data, &res_clone, &apub_data).await };
+  if *SYNCHRONOUS_FEDERATION {
+    fed_task.await?;
+  } else {
+    spawn_try_task(fed_task);
+  }
+  Ok(HttpResponse::Ok().json(&res))
 }
 
 async fn route_get<'a, Data>(
   data: web::Query<Data>,
   context: web::Data<LemmyContext>,
+  apub_data: activitypub_federation::config::Data<LemmyContext>,
 ) -> Result<HttpResponse, Error>
 where
   Data: Perform
@@ -380,29 +404,13 @@ where
     + 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))
+  perform::<Data>(data.0, context, apub_data).await
 }
 
 async fn route_post<'a, Data>(
   data: web::Json<Data>,
   context: web::Data<LemmyContext>,
+  apub_data: activitypub_federation::config::Data<LemmyContext>,
 ) -> Result<HttpResponse, Error>
 where
   Data: Perform
@@ -412,12 +420,13 @@ where
     + Send
     + 'static,
 {
-  perform::<Data>(data.0, context).await
+  perform::<Data>(data.0, context, apub_data).await
 }
 
 async fn perform_crud<'a, Data>(
   data: Data,
   context: web::Data<LemmyContext>,
+  apub_data: activitypub_federation::config::Data<LemmyContext>,
 ) -> Result<HttpResponse, Error>
 where
   Data: PerformCrud
@@ -427,14 +436,21 @@ where
     + Send
     + 'static,
 {
-  let res = data.perform(&context, None).await?;
-  SendActivity::send_activity(&data, &res, &context).await?;
-  Ok(HttpResponse::Ok().json(res))
+  let res = data.perform(&context).await?;
+  let res_clone = res.clone();
+  let fed_task = async move { SendActivity::send_activity(&data, &res_clone, &apub_data).await };
+  if *SYNCHRONOUS_FEDERATION {
+    fed_task.await?;
+  } else {
+    spawn_try_task(fed_task);
+  }
+  Ok(HttpResponse::Ok().json(&res))
 }
 
 async fn route_get_crud<'a, Data>(
   data: web::Query<Data>,
   context: web::Data<LemmyContext>,
+  apub_data: activitypub_federation::config::Data<LemmyContext>,
 ) -> Result<HttpResponse, Error>
 where
   Data: PerformCrud
@@ -444,12 +460,13 @@ where
     + Send
     + 'static,
 {
-  perform_crud::<Data>(data.0, context).await
+  perform_crud::<Data>(data.0, context, apub_data).await
 }
 
 async fn route_post_crud<'a, Data>(
   data: web::Json<Data>,
   context: web::Data<LemmyContext>,
+  apub_data: activitypub_federation::config::Data<LemmyContext>,
 ) -> Result<HttpResponse, Error>
 where
   Data: PerformCrud
@@ -459,5 +476,5 @@ where
     + Send
     + 'static,
 {
-  perform_crud::<Data>(data.0, context).await
+  perform_crud::<Data>(data.0, context, apub_data).await
 }