]> Untitled Git - lemmy.git/blob - crates/api/src/routes.rs
cdc9e736be4b98feddcf4fda1a6b6fcc162ad2f6
[lemmy.git] / crates / api / src / routes.rs
1 use crate::Perform;
2 use actix_web::{error::ErrorBadRequest, *};
3 use lemmy_api_common::{comment::*, community::*, person::*, post::*, site::*, websocket::*};
4 use lemmy_utils::rate_limit::RateLimit;
5 use lemmy_websocket::{routes::chat_route, LemmyContext};
6 use serde::Deserialize;
7
8 pub fn config(cfg: &mut web::ServiceConfig, rate_limit: &RateLimit) {
9   cfg.service(
10     web::scope("/api/v2")
11       // Websockets
12       .service(web::resource("/ws").to(chat_route))
13       // Site
14       .service(
15         web::scope("/site")
16           .wrap(rate_limit.message())
17           // Admin Actions
18           .route("/transfer", web::post().to(route_post::<TransferSite>))
19           .route("/config", web::get().to(route_get::<GetSiteConfig>))
20           .route("/config", web::put().to(route_post::<SaveSiteConfig>)),
21       )
22       .service(
23         web::resource("/modlog")
24           .wrap(rate_limit.message())
25           .route(web::get().to(route_get::<GetModlog>)),
26       )
27       .service(
28         web::resource("/search")
29           .wrap(rate_limit.message())
30           .route(web::get().to(route_get::<Search>)),
31       )
32       // Community
33       .service(
34         web::scope("/community")
35           .wrap(rate_limit.message())
36           .route("/follow", web::post().to(route_post::<FollowCommunity>))
37           .route("/transfer", web::post().to(route_post::<TransferCommunity>))
38           .route("/ban_user", web::post().to(route_post::<BanFromCommunity>))
39           .route("/mod", web::post().to(route_post::<AddModToCommunity>))
40           .route("/join", web::post().to(route_post::<CommunityJoin>))
41           .route("/mod/join", web::post().to(route_post::<ModJoin>)),
42       )
43       // Post
44       .service(
45         web::scope("/post")
46           .wrap(rate_limit.message())
47           .route("/lock", web::post().to(route_post::<LockPost>))
48           .route("/sticky", web::post().to(route_post::<StickyPost>))
49           .route("/like", web::post().to(route_post::<CreatePostLike>))
50           .route("/save", web::put().to(route_post::<SavePost>))
51           .route("/join", web::post().to(route_post::<PostJoin>))
52           .route("/report", web::post().to(route_post::<CreatePostReport>))
53           .route(
54             "/report/resolve",
55             web::put().to(route_post::<ResolvePostReport>),
56           )
57           .route("/report/list", web::get().to(route_get::<ListPostReports>)),
58       )
59       // Comment
60       .service(
61         web::scope("/comment")
62           .wrap(rate_limit.message())
63           .route(
64             "/mark_as_read",
65             web::post().to(route_post::<MarkCommentAsRead>),
66           )
67           .route("/like", web::post().to(route_post::<CreateCommentLike>))
68           .route("/save", web::put().to(route_post::<SaveComment>))
69           .route("/report", web::post().to(route_post::<CreateCommentReport>))
70           .route(
71             "/report/resolve",
72             web::put().to(route_post::<ResolveCommentReport>),
73           )
74           .route(
75             "/report/list",
76             web::get().to(route_get::<ListCommentReports>),
77           ),
78       )
79       // Private Message
80       .service(
81         web::scope("/private_message")
82           .wrap(rate_limit.message())
83           .route(
84             "/mark_as_read",
85             web::post().to(route_post::<MarkPrivateMessageAsRead>),
86           ),
87       )
88       // User actions
89       .service(
90         web::scope("/user")
91           .wrap(rate_limit.message())
92           .route("/mention", web::get().to(route_get::<GetPersonMentions>))
93           .route(
94             "/mention/mark_as_read",
95             web::post().to(route_post::<MarkPersonMentionAsRead>),
96           )
97           .route("/replies", web::get().to(route_get::<GetReplies>))
98           .route(
99             "/followed_communities",
100             web::get().to(route_get::<GetFollowedCommunities>),
101           )
102           .route("/join", web::post().to(route_post::<UserJoin>))
103           // Admin action. I don't like that it's in /user
104           .route("/ban", web::post().to(route_post::<BanPerson>))
105           // Account actions. I don't like that they're in /user maybe /accounts
106           .route("/login", web::post().to(route_post::<Login>))
107           .route("/get_captcha", web::get().to(route_get::<GetCaptcha>))
108           .route(
109             "/password_reset",
110             web::post().to(route_post::<PasswordReset>),
111           )
112           .route(
113             "/password_change",
114             web::post().to(route_post::<PasswordChange>),
115           )
116           // mark_all_as_read feels off being in this section as well
117           .route(
118             "/mark_all_as_read",
119             web::post().to(route_post::<MarkAllAsRead>),
120           )
121           .route(
122             "/save_user_settings",
123             web::put().to(route_post::<SaveUserSettings>),
124           )
125           .route("/report_count", web::get().to(route_get::<GetReportCount>)),
126       )
127       // Admin Actions
128       .service(
129         web::resource("/admin/add")
130           .wrap(rate_limit.message())
131           .route(web::post().to(route_post::<AddAdmin>)),
132       ),
133   );
134 }
135
136 async fn perform<Request>(
137   data: Request,
138   context: web::Data<LemmyContext>,
139 ) -> Result<HttpResponse, Error>
140 where
141   Request: Perform,
142   Request: Send + 'static,
143 {
144   let res = data
145     .perform(&context, None)
146     .await
147     .map(|json| HttpResponse::Ok().json(json))
148     .map_err(ErrorBadRequest)?;
149   Ok(res)
150 }
151
152 async fn route_get<'a, Data>(
153   data: web::Query<Data>,
154   context: web::Data<LemmyContext>,
155 ) -> Result<HttpResponse, Error>
156 where
157   Data: Deserialize<'a> + Send + 'static + Perform,
158 {
159   perform::<Data>(data.0, context).await
160 }
161
162 async fn route_post<'a, Data>(
163   data: web::Json<Data>,
164   context: web::Data<LemmyContext>,
165 ) -> Result<HttpResponse, Error>
166 where
167   Data: Deserialize<'a> + Send + 'static + Perform,
168 {
169   perform::<Data>(data.0, context).await
170 }