]> Untitled Git - lemmy.git/blob - server/src/api/mod.rs
routes.api: fix get_captcha endpoint (#1135)
[lemmy.git] / server / src / api / mod.rs
1 use crate::{api::claims::Claims, DbPool, LemmyContext};
2 use actix_web::web::Data;
3 use lemmy_api_structs::blocking;
4 use lemmy_db::{
5   community::Community,
6   community_view::CommunityUserBanView,
7   post::Post,
8   user::User_,
9   Crud,
10 };
11 use lemmy_utils::{APIError, ConnectionId, LemmyError};
12
13 pub mod claims;
14 pub mod comment;
15 pub mod community;
16 pub mod post;
17 pub mod site;
18 pub mod user;
19
20 #[async_trait::async_trait(?Send)]
21 pub trait Perform {
22   type Response: serde::ser::Serialize + Send;
23
24   async fn perform(
25     &self,
26     context: &Data<LemmyContext>,
27     websocket_id: Option<ConnectionId>,
28   ) -> Result<Self::Response, LemmyError>;
29 }
30
31 pub(in crate::api) async fn is_mod_or_admin(
32   pool: &DbPool,
33   user_id: i32,
34   community_id: i32,
35 ) -> Result<(), LemmyError> {
36   let is_mod_or_admin = blocking(pool, move |conn| {
37     Community::is_mod_or_admin(conn, user_id, community_id)
38   })
39   .await?;
40   if !is_mod_or_admin {
41     return Err(APIError::err("not_a_mod_or_admin").into());
42   }
43   Ok(())
44 }
45 pub async fn is_admin(pool: &DbPool, user_id: i32) -> Result<(), LemmyError> {
46   let user = blocking(pool, move |conn| User_::read(conn, user_id)).await??;
47   if !user.admin {
48     return Err(APIError::err("not_an_admin").into());
49   }
50   Ok(())
51 }
52
53 pub(in crate::api) async fn get_post(post_id: i32, pool: &DbPool) -> Result<Post, LemmyError> {
54   match blocking(pool, move |conn| Post::read(conn, post_id)).await? {
55     Ok(post) => Ok(post),
56     Err(_e) => Err(APIError::err("couldnt_find_post").into()),
57   }
58 }
59
60 pub(in crate::api) async fn get_user_from_jwt(
61   jwt: &str,
62   pool: &DbPool,
63 ) -> Result<User_, LemmyError> {
64   let claims = match Claims::decode(&jwt) {
65     Ok(claims) => claims.claims,
66     Err(_e) => return Err(APIError::err("not_logged_in").into()),
67   };
68   let user_id = claims.id;
69   let user = blocking(pool, move |conn| User_::read(conn, user_id)).await??;
70   // Check for a site ban
71   if user.banned {
72     return Err(APIError::err("site_ban").into());
73   }
74   Ok(user)
75 }
76
77 pub(in crate::api) async fn get_user_from_jwt_opt(
78   jwt: &Option<String>,
79   pool: &DbPool,
80 ) -> Result<Option<User_>, LemmyError> {
81   match jwt {
82     Some(jwt) => Ok(Some(get_user_from_jwt(jwt, pool).await?)),
83     None => Ok(None),
84   }
85 }
86
87 pub(in crate::api) async fn check_community_ban(
88   user_id: i32,
89   community_id: i32,
90   pool: &DbPool,
91 ) -> Result<(), LemmyError> {
92   let is_banned = move |conn: &'_ _| CommunityUserBanView::get(conn, user_id, community_id).is_ok();
93   if blocking(pool, is_banned).await? {
94     Err(APIError::err("community_ban").into())
95   } else {
96     Ok(())
97   }
98 }