]> Untitled Git - lemmy.git/blob - src/api_routes.rs
Removing the site creator, adding leave_admin. Fixes #1808 (#2052)
[lemmy.git] / src / api_routes.rs
1 use actix_web::*;
2 use lemmy_api::Perform;
3 use lemmy_api_common::{comment::*, community::*, person::*, post::*, site::*, websocket::*};
4 use lemmy_api_crud::PerformCrud;
5 use lemmy_utils::rate_limit::RateLimit;
6 use lemmy_websocket::{routes::chat_route, LemmyContext};
7 use serde::Deserialize;
8
9 pub fn config(cfg: &mut web::ServiceConfig, rate_limit: &RateLimit) {
10   cfg.service(
11     web::scope("/api/v3")
12       // Websocket
13       .service(web::resource("/ws").to(chat_route))
14       // Site
15       .service(
16         web::scope("/site")
17           .wrap(rate_limit.message())
18           .route("", web::get().to(route_get_crud::<GetSite>))
19           // Admin Actions
20           .route("", web::post().to(route_post_crud::<CreateSite>))
21           .route("", web::put().to(route_post_crud::<EditSite>))
22           .route("/config", web::get().to(route_get::<GetSiteConfig>))
23           .route("/config", web::put().to(route_post::<SaveSiteConfig>)),
24       )
25       .service(
26         web::resource("/modlog")
27           .wrap(rate_limit.message())
28           .route(web::get().to(route_get::<GetModlog>)),
29       )
30       .service(
31         web::resource("/search")
32           .wrap(rate_limit.message())
33           .route(web::get().to(route_get::<Search>)),
34       )
35       .service(
36         web::resource("/resolve_object")
37           .wrap(rate_limit.message())
38           .route(web::get().to(route_get::<ResolveObject>)),
39       )
40       // Community
41       .service(
42         web::resource("/community")
43           .guard(guard::Post())
44           .wrap(rate_limit.register())
45           .route(web::post().to(route_post_crud::<CreateCommunity>)),
46       )
47       .service(
48         web::scope("/community")
49           .wrap(rate_limit.message())
50           .route("", web::get().to(route_get_crud::<GetCommunity>))
51           .route("", web::put().to(route_post_crud::<EditCommunity>))
52           .route("/list", web::get().to(route_get_crud::<ListCommunities>))
53           .route("/follow", web::post().to(route_post::<FollowCommunity>))
54           .route("/block", web::post().to(route_post::<BlockCommunity>))
55           .route(
56             "/delete",
57             web::post().to(route_post_crud::<DeleteCommunity>),
58           )
59           // Mod Actions
60           .route(
61             "/remove",
62             web::post().to(route_post_crud::<RemoveCommunity>),
63           )
64           .route("/transfer", web::post().to(route_post::<TransferCommunity>))
65           .route("/ban_user", web::post().to(route_post::<BanFromCommunity>))
66           .route("/mod", web::post().to(route_post::<AddModToCommunity>))
67           .route("/join", web::post().to(route_post::<CommunityJoin>))
68           .route("/mod/join", web::post().to(route_post::<ModJoin>)),
69       )
70       // Post
71       .service(
72         // Handle POST to /post separately to add the post() rate limitter
73         web::resource("/post")
74           .guard(guard::Post())
75           .wrap(rate_limit.post())
76           .route(web::post().to(route_post_crud::<CreatePost>)),
77       )
78       .service(
79         web::scope("/post")
80           .wrap(rate_limit.message())
81           .route("", web::get().to(route_get_crud::<GetPost>))
82           .route("", web::put().to(route_post_crud::<EditPost>))
83           .route("/delete", web::post().to(route_post_crud::<DeletePost>))
84           .route("/remove", web::post().to(route_post_crud::<RemovePost>))
85           .route(
86             "/mark_as_read",
87             web::post().to(route_post::<MarkPostAsRead>),
88           )
89           .route("/lock", web::post().to(route_post::<LockPost>))
90           .route("/sticky", web::post().to(route_post::<StickyPost>))
91           .route("/list", web::get().to(route_get_crud::<GetPosts>))
92           .route("/like", web::post().to(route_post::<CreatePostLike>))
93           .route("/save", web::put().to(route_post::<SavePost>))
94           .route("/join", web::post().to(route_post::<PostJoin>))
95           .route("/report", web::post().to(route_post::<CreatePostReport>))
96           .route(
97             "/report/resolve",
98             web::put().to(route_post::<ResolvePostReport>),
99           )
100           .route("/report/list", web::get().to(route_get::<ListPostReports>))
101           .route(
102             "/site_metadata",
103             web::get().to(route_get::<GetSiteMetadata>),
104           ),
105       )
106       // Comment
107       .service(
108         // Handle POST to /comment separately to add the comment() rate limitter
109         web::resource("/comment")
110           .guard(guard::Post())
111           .wrap(rate_limit.comment())
112           .route(web::post().to(route_post_crud::<CreateComment>)),
113       )
114       .service(
115         web::scope("/comment")
116           .wrap(rate_limit.message())
117           .route("", web::get().to(route_get_crud::<GetComment>))
118           .route("", web::put().to(route_post_crud::<EditComment>))
119           .route("/delete", web::post().to(route_post_crud::<DeleteComment>))
120           .route("/remove", web::post().to(route_post_crud::<RemoveComment>))
121           .route(
122             "/mark_as_read",
123             web::post().to(route_post::<MarkCommentAsRead>),
124           )
125           .route("/like", web::post().to(route_post::<CreateCommentLike>))
126           .route("/save", web::put().to(route_post::<SaveComment>))
127           .route("/list", web::get().to(route_get_crud::<GetComments>))
128           .route("/report", web::post().to(route_post::<CreateCommentReport>))
129           .route(
130             "/report/resolve",
131             web::put().to(route_post::<ResolveCommentReport>),
132           )
133           .route(
134             "/report/list",
135             web::get().to(route_get::<ListCommentReports>),
136           ),
137       )
138       // Private Message
139       .service(
140         web::scope("/private_message")
141           .wrap(rate_limit.message())
142           .route("/list", web::get().to(route_get_crud::<GetPrivateMessages>))
143           .route("", web::post().to(route_post_crud::<CreatePrivateMessage>))
144           .route("", web::put().to(route_post_crud::<EditPrivateMessage>))
145           .route(
146             "/delete",
147             web::post().to(route_post_crud::<DeletePrivateMessage>),
148           )
149           .route(
150             "/mark_as_read",
151             web::post().to(route_post::<MarkPrivateMessageAsRead>),
152           ),
153       )
154       // User
155       .service(
156         // Account action, I don't like that it's in /user maybe /accounts
157         // Handle /user/register separately to add the register() rate limitter
158         web::resource("/user/register")
159           .guard(guard::Post())
160           .wrap(rate_limit.register())
161           .route(web::post().to(route_post_crud::<Register>)),
162       )
163       .service(
164         // Handle captcha separately
165         web::resource("/user/get_captcha")
166           .wrap(rate_limit.post())
167           .route(web::get().to(route_get::<GetCaptcha>)),
168       )
169       // User actions
170       .service(
171         web::scope("/user")
172           .wrap(rate_limit.message())
173           .route("", web::get().to(route_get_crud::<GetPersonDetails>))
174           .route("/mention", web::get().to(route_get::<GetPersonMentions>))
175           .route(
176             "/mention/mark_as_read",
177             web::post().to(route_post::<MarkPersonMentionAsRead>),
178           )
179           .route("/replies", web::get().to(route_get::<GetReplies>))
180           .route("/join", web::post().to(route_post::<UserJoin>))
181           // Admin action. I don't like that it's in /user
182           .route("/ban", web::post().to(route_post::<BanPerson>))
183           .route("/banned", web::get().to(route_get::<GetBannedPersons>))
184           .route("/block", web::post().to(route_post::<BlockPerson>))
185           // Account actions. I don't like that they're in /user maybe /accounts
186           .route("/login", web::post().to(route_post::<Login>))
187           .route(
188             "/delete_account",
189             web::post().to(route_post_crud::<DeleteAccount>),
190           )
191           .route(
192             "/password_reset",
193             web::post().to(route_post::<PasswordReset>),
194           )
195           .route(
196             "/password_change",
197             web::post().to(route_post::<PasswordChange>),
198           )
199           // mark_all_as_read feels off being in this section as well
200           .route(
201             "/mark_all_as_read",
202             web::post().to(route_post::<MarkAllAsRead>),
203           )
204           .route(
205             "/save_user_settings",
206             web::put().to(route_post::<SaveUserSettings>),
207           )
208           .route(
209             "/change_password",
210             web::put().to(route_post::<ChangePassword>),
211           )
212           .route("/report_count", web::get().to(route_get::<GetReportCount>))
213           .route("/unread_count", web::get().to(route_get::<GetUnreadCount>))
214           .route("/verify_email", web::post().to(route_post::<VerifyEmail>))
215           .route("/leave_admin", web::post().to(route_post::<LeaveAdmin>)),
216       )
217       // Admin Actions
218       .service(
219         web::scope("/admin")
220           .wrap(rate_limit.message())
221           .route("/add", web::post().to(route_post::<AddAdmin>))
222           .route(
223             "/registration_application/count",
224             web::get().to(route_get::<GetUnreadRegistrationApplicationCount>),
225           )
226           .route(
227             "/registration_application/list",
228             web::get().to(route_get::<ListRegistrationApplications>),
229           )
230           .route(
231             "/registration_application/approve",
232             web::put().to(route_post::<ApproveRegistrationApplication>),
233           ),
234       ),
235   );
236 }
237
238 async fn perform<Request>(
239   data: Request,
240   context: web::Data<LemmyContext>,
241 ) -> Result<HttpResponse, Error>
242 where
243   Request: Perform,
244   Request: Send + 'static,
245 {
246   let res = data
247     .perform(&context, None)
248     .await
249     .map(|json| HttpResponse::Ok().json(json))?;
250   Ok(res)
251 }
252
253 async fn route_get<'a, Data>(
254   data: web::Query<Data>,
255   context: web::Data<LemmyContext>,
256 ) -> Result<HttpResponse, Error>
257 where
258   Data: Deserialize<'a> + Send + 'static + Perform,
259 {
260   perform::<Data>(data.0, context).await
261 }
262
263 async fn route_post<'a, Data>(
264   data: web::Json<Data>,
265   context: web::Data<LemmyContext>,
266 ) -> Result<HttpResponse, Error>
267 where
268   Data: Deserialize<'a> + Send + 'static + Perform,
269 {
270   perform::<Data>(data.0, context).await
271 }
272
273 async fn perform_crud<Request>(
274   data: Request,
275   context: web::Data<LemmyContext>,
276 ) -> Result<HttpResponse, Error>
277 where
278   Request: PerformCrud,
279   Request: Send + 'static,
280 {
281   let res = data
282     .perform(&context, None)
283     .await
284     .map(|json| HttpResponse::Ok().json(json))?;
285   Ok(res)
286 }
287
288 async fn route_get_crud<'a, Data>(
289   data: web::Query<Data>,
290   context: web::Data<LemmyContext>,
291 ) -> Result<HttpResponse, Error>
292 where
293   Data: Deserialize<'a> + Send + 'static + PerformCrud,
294 {
295   perform_crud::<Data>(data.0, context).await
296 }
297
298 async fn route_post_crud<'a, Data>(
299   data: web::Json<Data>,
300   context: web::Data<LemmyContext>,
301 ) -> Result<HttpResponse, Error>
302 where
303   Data: Deserialize<'a> + Send + 'static + PerformCrud,
304 {
305   perform_crud::<Data>(data.0, context).await
306 }