summaryrefslogtreecommitdiff
path: root/src/api/posts.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/api/posts.rs')
-rw-r--r--src/api/posts.rs120
1 files changed, 90 insertions, 30 deletions
diff --git a/src/api/posts.rs b/src/api/posts.rs
index f1cdab3..ca459cd 100644
--- a/src/api/posts.rs
+++ b/src/api/posts.rs
@@ -5,26 +5,33 @@ use axum::{
};
use serde::Deserialize;
-use crate::{types::{
- extract::{AuthorizedUser, Check, CheckResult, Json},
- http::ResponseCode,
- post::Post,
-}, public::docs::{EndpointDocumentation, EndpointMethod}};
+use crate::{
+ public::docs::{EndpointDocumentation, EndpointMethod},
+ types::{
+ comment::Comment,
+ extract::{AuthorizedUser, Check, CheckResult, Json},
+ http::ResponseCode,
+ like::Like,
+ post::Post,
+ },
+};
pub const POSTS_CREATE: EndpointDocumentation = EndpointDocumentation {
uri: "/api/posts/create",
method: EndpointMethod::Post,
description: "Creates a new post",
- body: Some(r#"
+ body: Some(
+ r#"
{
"content" : "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua."
}
- "#),
+ "#,
+ ),
responses: &[
(201, "Successfully created post"),
(400, "Body does not match parameters"),
(401, "Unauthorized"),
- (500, "Failed to create post")
+ (500, "Failed to create post"),
],
cookie: Some("auth"),
};
@@ -65,16 +72,18 @@ pub const POSTS_PAGE: EndpointDocumentation = EndpointDocumentation {
uri: "/api/posts/page",
method: EndpointMethod::Post,
description: "Load a section of posts from newest to oldest",
- body: Some(r#"
+ body: Some(
+ r#"
{
"page": 0
}
- "#),
+ "#,
+ ),
responses: &[
(200, "Returns posts in <span>application/json<span>"),
(400, "Body does not match parameters"),
(401, "Unauthorized"),
- (500, "Failed to fetch posts")
+ (500, "Failed to fetch posts"),
],
cookie: Some("auth"),
};
@@ -105,21 +114,71 @@ async fn page(
ResponseCode::Success.json(&json)
}
+pub const COMMENTS_PAGE: EndpointDocumentation = EndpointDocumentation {
+ uri: "/api/posts/comments",
+ method: EndpointMethod::Post,
+ description: "Load a section of comments from newest to oldest",
+ body: Some(
+ r#"
+ {
+ "page": 1,
+ "post_id": 13
+ }
+ "#,
+ ),
+ responses: &[
+ (200, "Returns comments in <span>application/json<span>"),
+ (400, "Body does not match parameters"),
+ (401, "Unauthorized"),
+ (500, "Failed to fetch comments"),
+ ],
+ cookie: Some("auth"),
+};
+
+#[derive(Deserialize)]
+struct CommentsPageRequest {
+ page: u64,
+ post_id: u64
+}
+
+impl Check for CommentsPageRequest {
+ fn check(&self) -> CheckResult {
+ Ok(())
+ }
+}
+
+async fn comments(
+ AuthorizedUser(_user): AuthorizedUser,
+ Json(body): Json<CommentsPageRequest>,
+) -> Response {
+ let Ok(comments) = Comment::from_comment_page(body.page, body.post_id) else {
+ return ResponseCode::InternalServerError.text("Failed to fetch comments")
+ };
+
+ let Ok(json) = serde_json::to_string(&comments) else {
+ return ResponseCode::InternalServerError.text("Failed to fetch comments")
+ };
+
+ ResponseCode::Success.json(&json)
+}
+
pub const POSTS_USER: EndpointDocumentation = EndpointDocumentation {
uri: "/api/posts/user",
method: EndpointMethod::Post,
description: "Load a section of posts from newest to oldest from a specific user",
- body: Some(r#"
+ body: Some(
+ r#"
{
"user_id": 3,
"page": 0
}
- "#),
+ "#,
+ ),
responses: &[
(200, "Returns posts in <span>application/json<span>"),
(400, "Body does not match parameters"),
(401, "Unauthorized"),
- (500, "Failed to fetch posts")
+ (500, "Failed to fetch posts"),
],
cookie: Some("auth"),
};
@@ -155,17 +214,19 @@ pub const POSTS_COMMENT: EndpointDocumentation = EndpointDocumentation {
uri: "/api/posts/comment",
method: EndpointMethod::Patch,
description: "Add a comment to a post",
- body: Some(r#"
+ body: Some(
+ r#"
{
"content": "This is a very cool comment",
"post_id": 0
}
- "#),
+ "#,
+ ),
responses: &[
(200, "Successfully added comment"),
(400, "Body does not match parameters"),
(401, "Unauthorized"),
- (500, "Failed to add comment")
+ (500, "Failed to add comment"),
],
cookie: Some("auth"),
};
@@ -192,11 +253,7 @@ async fn comment(
AuthorizedUser(user): AuthorizedUser,
Json(body): Json<PostCommentRequest>,
) -> Response {
- let Ok(mut post) = Post::from_post_id(body.post_id) else {
- return ResponseCode::InternalServerError.text("Failed to add comment")
- };
-
- if let Err(err) = post.comment(user.user_id, body.content) {
+ if let Err(err) = Comment::new(user.user_id, body.post_id, &body.content) {
return err;
}
@@ -207,17 +264,19 @@ pub const POSTS_LIKE: EndpointDocumentation = EndpointDocumentation {
uri: "/api/posts/like",
method: EndpointMethod::Patch,
description: "Set like status on a post",
- body: Some(r#"
+ body: Some(
+ r#"
{
"post_id" : 0,
"status" : true
}
- "#),
+ "#,
+ ),
responses: &[
(200, "Successfully set like status"),
(400, "Body does not match parameters"),
(401, "Unauthorized"),
- (500, "Failed to set like status")
+ (500, "Failed to set like status"),
],
cookie: Some("auth"),
};
@@ -235,11 +294,11 @@ impl Check for PostLikeRequest {
}
async fn like(AuthorizedUser(user): AuthorizedUser, Json(body): Json<PostLikeRequest>) -> Response {
- let Ok(mut post) = Post::from_post_id(body.post_id) else {
- return ResponseCode::InternalServerError.text("Failed to fetch posts")
- };
-
- if let Err(err) = post.like(user.user_id, body.state) {
+ if body.state {
+ if let Err(err) = Like::add_liked(user.user_id, body.post_id) {
+ return err;
+ }
+ } else if let Err(err) = Like::remove_liked(user.user_id, body.post_id) {
return err;
}
@@ -250,6 +309,7 @@ pub fn router() -> Router {
Router::new()
.route("/create", post(create))
.route("/page", post(page))
+ .route("/comments", post(comments))
.route("/user", post(user))
.route("/comment", patch(comment))
.route("/like", patch(like))