summaryrefslogtreecommitdiffstats
path: root/server/src/routes/api.rs
diff options
context:
space:
mode:
Diffstat (limited to 'server/src/routes/api.rs')
-rw-r--r--server/src/routes/api.rs103
1 files changed, 103 insertions, 0 deletions
diff --git a/server/src/routes/api.rs b/server/src/routes/api.rs
new file mode 100644
index 00000000..5121d240
--- /dev/null
+++ b/server/src/routes/api.rs
@@ -0,0 +1,103 @@
+use crate::api::comment::*;
+use crate::api::community::*;
+use crate::api::post::*;
+use crate::api::site::*;
+use crate::api::user::*;
+use crate::api::{Oper, Perform};
+use actix_web::{web, HttpResponse};
+use diesel::r2d2::{ConnectionManager, Pool};
+use diesel::PgConnection;
+use failure::Error;
+use serde::Serialize;
+
+type DbParam = web::Data<Pool<ConnectionManager<PgConnection>>>;
+
+#[rustfmt::skip]
+pub fn config(cfg: &mut web::ServiceConfig) {
+ cfg
+ // Site
+ .route("/api/v1/site", web::get().to(route_get::<GetSite, GetSiteResponse>))
+ .route("/api/v1/categories", web::get().to(route_get::<ListCategories, ListCategoriesResponse>))
+ .route("/api/v1/modlog", web::get().to(route_get::<GetModlog, GetModlogResponse>))
+ .route("/api/v1/search", web::get().to(route_get::<Search, SearchResponse>))
+ // Community
+ .route("/api/v1/community", web::post().to(route_post::<CreateCommunity, CommunityResponse>))
+ .route("/api/v1/community", web::get().to(route_get::<GetCommunity, GetCommunityResponse>))
+ .route("/api/v1/community", web::put().to(route_post::<EditCommunity, CommunityResponse>))
+ .route("/api/v1/community/list", web::get().to(route_get::<ListCommunities, ListCommunitiesResponse>))
+ .route("/api/v1/community/follow", web::post().to(route_post::<FollowCommunity, CommunityResponse>))
+ // Post
+ .route("/api/v1/post", web::post().to(route_post::<CreatePost, PostResponse>))
+ .route("/api/v1/post", web::put().to(route_post::<EditPost, PostResponse>))
+ .route("/api/v1/post", web::get().to(route_get::<GetPost, GetPostResponse>))
+ .route("/api/v1/post/list", web::get().to(route_get::<GetPosts, GetPostsResponse>))
+ .route("/api/v1/post/like", web::post().to(route_post::<CreatePostLike, CreatePostLikeResponse>))
+ .route("/api/v1/post/save", web::put().to(route_post::<SavePost, PostResponse>))
+ // Comment
+ .route("/api/v1/comment", web::post().to(route_post::<CreateComment, CommentResponse>))
+ .route("/api/v1/comment", web::put().to(route_post::<EditComment, CommentResponse>))
+ .route("/api/v1/comment/like", web::post().to(route_post::<CreateCommentLike, CommentResponse>))
+ .route("/api/v1/comment/save", web::put().to(route_post::<SaveComment, CommentResponse>))
+ // User
+ .route("/api/v1/user", web::get().to(route_get::<GetUserDetails, GetUserDetailsResponse>))
+ .route("/api/v1/user/mention", web::get().to(route_get::<GetUserMentions, GetUserMentionsResponse>))
+ .route("/api/v1/user/mention", web::put().to(route_post::<EditUserMention, UserMentionResponse>))
+ .route("/api/v1/user/replies", web::get().to(route_get::<GetReplies, GetRepliesResponse>))
+ .route("/api/v1/user/followed_communities", web::get().to(route_get::<GetFollowedCommunities, GetFollowedCommunitiesResponse>))
+ // Mod actions
+ .route("/api/v1/community/transfer", web::post().to(route_post::<TransferCommunity, GetCommunityResponse>))
+ .route("/api/v1/community/ban_user", web::post().to(route_post::<BanFromCommunity, BanFromCommunityResponse>))
+ .route("/api/v1/community/mod", web::post().to(route_post::<AddModToCommunity, AddModToCommunityResponse>))
+ // Admin actions
+ .route("/api/v1/site", web::post().to(route_post::<CreateSite, SiteResponse>))
+ .route("/api/v1/site", web::put().to(route_post::<EditSite, SiteResponse>))
+ .route("/api/v1/site/transfer", web::post().to(route_post::<TransferSite, GetSiteResponse>))
+ .route("/api/v1/admin/add", web::post().to(route_post::<AddAdmin, AddAdminResponse>))
+ .route("/api/v1/user/ban", web::post().to(route_post::<BanUser, BanUserResponse>))
+ // User account actions
+ .route("/api/v1/user/login", web::post().to(route_post::<Login, LoginResponse>))
+ .route("/api/v1/user/register", web::post().to(route_post::<Register, LoginResponse>))
+ .route("/api/v1/user/delete_account", web::post().to(route_post::<DeleteAccount, LoginResponse>))
+ .route("/api/v1/user/password_reset", web::post().to(route_post::<PasswordReset, PasswordResetResponse>))
+ .route("/api/v1/user/password_change", web::post().to(route_post::<PasswordChange, LoginResponse>))
+ .route("/api/v1/user/mark_all_as_read", web::post().to(route_post::<MarkAllAsRead, GetRepliesResponse>))
+ .route("/api/v1/user/save_user_settings", web::put().to(route_post::<SaveUserSettings, LoginResponse>));
+}
+
+fn perform<Request, Response>(data: Request, db: DbParam) -> Result<HttpResponse, Error>
+where
+ Response: Serialize,
+ Oper<Request>: Perform<Response>,
+{
+ let conn = match db.get() {
+ Ok(c) => c,
+ Err(e) => return Err(format_err!("{}", e)),
+ };
+ let oper: Oper<Request> = Oper::new(data);
+ let response = oper.perform(&conn);
+ Ok(HttpResponse::Ok().json(response?))
+}
+
+async fn route_get<Data, Response>(
+ data: web::Query<Data>,
+ db: DbParam,
+) -> Result<HttpResponse, Error>
+where
+ Data: Serialize,
+ Response: Serialize,
+ Oper<Data>: Perform<Response>,
+{
+ perform::<Data, Response>(data.0, db)
+}
+
+async fn route_post<Data, Response>(
+ data: web::Json<Data>,
+ db: DbParam,
+) -> Result<HttpResponse, Error>
+where
+ Data: Serialize,
+ Response: Serialize,
+ Oper<Data>: Perform<Response>,
+{
+ perform::<Data, Response>(data.0, db)
+}