-use crate::api_routes_websocket::websocket;
use actix_web::{guard, web, Error, HttpResponse, Result};
-use lemmy_api::Perform;
+use lemmy_api::{
+ comment::{distinguish::distinguish_comment, save::save_comment},
+ comment_report::{list::list_comment_reports, resolve::resolve_comment_report},
+ local_user::notifications::mark_reply_read::mark_reply_as_read,
+ Perform,
+};
use lemmy_api_common::{
- comment::{
- CreateComment,
- CreateCommentLike,
- CreateCommentReport,
- DeleteComment,
- DistinguishComment,
- EditComment,
- GetComment,
- GetComments,
- ListCommentReports,
- RemoveComment,
- ResolveCommentReport,
- SaveComment,
- },
+ comment::{CreateCommentLike, CreateCommentReport, DeleteComment, EditComment, RemoveComment},
community::{
AddModToCommunity,
BanFromCommunity,
DeleteCommunity,
EditCommunity,
FollowCommunity,
- GetCommunity,
HideCommunity,
- ListCommunities,
RemoveCommunity,
TransferCommunity,
},
context::LemmyContext,
+ custom_emoji::{CreateCustomEmoji, DeleteCustomEmoji, EditCustomEmoji},
person::{
AddAdmin,
BanPerson,
DeleteAccount,
GetBannedPersons,
GetCaptcha,
- GetPersonDetails,
GetPersonMentions,
GetReplies,
GetReportCount,
GetUnreadCount,
Login,
MarkAllAsRead,
- MarkCommentReplyAsRead,
MarkPersonMentionAsRead,
PasswordChangeAfterReset,
PasswordReset,
VerifyEmail,
},
post::{
- CreatePost,
CreatePostLike,
CreatePostReport,
DeletePost,
EditPost,
FeaturePost,
- GetPost,
- GetPosts,
GetSiteMetadata,
ListPostReports,
LockPost,
CreatePrivateMessageReport,
DeletePrivateMessage,
EditPrivateMessage,
- GetPrivateMessages,
ListPrivateMessageReports,
MarkPrivateMessageAsRead,
ResolvePrivateMessageReport,
},
site::{
ApproveRegistrationApplication,
- CreateSite,
- EditSite,
+ GetFederatedInstances,
GetModlog,
- GetSite,
GetUnreadRegistrationApplicationCount,
LeaveAdmin,
ListRegistrationApplications,
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::{
+ comment::{create::create_comment, read::get_comment},
+ community::list::list_communities,
+ post::{create::create_post, read::get_post},
+ private_message::read::get_private_message,
+ site::{create::create_site, read::get_site, update::update_site},
+ PerformCrud,
+};
+use lemmy_apub::{
+ api::{
+ list_comments::list_comments,
+ list_posts::list_posts,
+ read_community::get_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")
.wrap(rate_limit.message())
- .route("", web::get().to(route_get_crud::<GetSite>))
+ .route("", web::get().to(get_site))
// Admin Actions
- .route("", web::post().to(route_post_crud::<CreateSite>))
- .route("", web::put().to(route_post_crud::<EditSite>)),
+ .route("", web::post().to(create_site))
+ .route("", web::put().to(update_site)),
)
.service(
web::resource("/modlog")
.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(
.service(
web::scope("/community")
.wrap(rate_limit.message())
- .route("", web::get().to(route_get_apub::<GetCommunity>))
+ .route("", web::get().to(get_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>))
+ .route("/list", web::get().to(list_communities))
.route("/follow", web::post().to(route_post::<FollowCommunity>))
.route("/block", web::post().to(route_post::<BlockCommunity>))
.route(
)
.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(
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")
.wrap(rate_limit.message())
- .route("", web::get().to(route_get_crud::<GetPost>))
+ .route("", web::get().to(get_post))
.route("", web::put().to(route_post_crud::<EditPost>))
.route("/delete", web::post().to(route_post_crud::<DeletePost>))
.route("/remove", web::post().to(route_post_crud::<RemovePost>))
)
.route("/lock", web::post().to(route_post::<LockPost>))
.route("/feature", web::post().to(route_post::<FeaturePost>))
- .route("/list", web::get().to(route_get_apub::<GetPosts>))
+ .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",
web::resource("/comment")
.guard(guard::Post())
.wrap(rate_limit.comment())
- .route(web::post().to(route_post_crud::<CreateComment>)),
+ .route(web::post().to(create_comment)),
)
.service(
web::scope("/comment")
.wrap(rate_limit.message())
- .route("", web::get().to(route_get_crud::<GetComment>))
+ .route("", web::get().to(get_comment))
.route("", web::put().to(route_post_crud::<EditComment>))
.route("/delete", web::post().to(route_post_crud::<DeleteComment>))
.route("/remove", web::post().to(route_post_crud::<RemoveComment>))
- .route(
- "/mark_as_read",
- web::post().to(route_post::<MarkCommentReplyAsRead>),
- )
- .route(
- "/distinguish",
- web::post().to(route_post::<DistinguishComment>),
- )
+ .route("/mark_as_read", web::post().to(mark_reply_as_read))
+ .route("/distinguish", web::post().to(distinguish_comment))
.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("/save", web::put().to(save_comment))
+ .route("/list", web::get().to(list_comments))
.route("/report", web::post().to(route_post::<CreateCommentReport>))
- .route(
- "/report/resolve",
- web::put().to(route_post::<ResolveCommentReport>),
- )
- .route(
- "/report/list",
- web::get().to(route_get::<ListCommentReports>),
- ),
+ .route("/report/resolve", web::put().to(resolve_comment_report))
+ .route("/report/list", web::get().to(list_comment_reports)),
)
// Private Message
.service(
web::scope("/private_message")
.wrap(rate_limit.message())
- .route("/list", web::get().to(route_get_crud::<GetPrivateMessages>))
+ .route("/list", web::get().to(get_private_message))
.route("", web::post().to(route_post_crud::<CreatePrivateMessage>))
.route("", web::put().to(route_post_crud::<EditPrivateMessage>))
.route(
.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>))
.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>),
+ ),
),
);
}
async fn perform<'a, Data>(
data: Data,
context: web::Data<LemmyContext>,
+ apub_data: activitypub_federation::config::Data<LemmyContext>,
) -> Result<HttpResponse, Error>
where
Data: Perform
+ 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
+ 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
+ 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
+ Send
+ 'static,
{
- 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>(
- data: web::Query<Data>,
- context: web::Data<LemmyContext>,
-) -> Result<HttpResponse, Error>
-where
- Data: PerformCrud
- + SendActivity<Response = <Data as PerformCrud>::Response>
- + Clone
- + Deserialize<'a>
- + Send
- + 'static,
-{
- perform_crud::<Data>(data.0, context).await
+ 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_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
+ Send
+ 'static,
{
- perform_crud::<Data>(data.0, context).await
+ perform_crud::<Data>(data.0, context, apub_data).await
}