summaryrefslogtreecommitdiff
path: root/src/api
diff options
context:
space:
mode:
Diffstat (limited to 'src/api')
-rw-r--r--src/api/admin.rs63
-rw-r--r--src/api/auth.rs34
-rw-r--r--src/api/posts.rs120
-rw-r--r--src/api/users.rs35
4 files changed, 186 insertions, 66 deletions
diff --git a/src/api/admin.rs b/src/api/admin.rs
index 8db3032..6030315 100644
--- a/src/api/admin.rs
+++ b/src/api/admin.rs
@@ -6,7 +6,10 @@ use tower_cookies::{Cookie, Cookies};
use crate::{
database,
- public::{admin, docs::{EndpointDocumentation, EndpointMethod}},
+ public::{
+ admin,
+ docs::{EndpointDocumentation, EndpointMethod},
+ },
types::{
extract::{AdminUser, Check, CheckResult, Json},
http::ResponseCode,
@@ -17,14 +20,16 @@ pub const ADMIN_AUTH: EndpointDocumentation = EndpointDocumentation {
uri: "/api/admin/auth",
method: EndpointMethod::Post,
description: "Authenticates on the admin panel",
- body: Some(r#"
+ body: Some(
+ r#"
{
"secret" : "admin"
}
- "#),
+ "#,
+ ),
responses: &[
(200, "Successfully executed SQL query"),
- (400, " Successfully authed, admin cookie returned")
+ (400, " Successfully authed, admin cookie returned"),
],
cookie: None,
};
@@ -60,16 +65,18 @@ pub const ADMIN_QUERY: EndpointDocumentation = EndpointDocumentation {
uri: "/api/admin/query",
method: EndpointMethod::Post,
description: "Run a SQL query on the database",
- body: Some(r#"
+ body: Some(
+ r#"
{
"query" : "DROP TABLE users;"
}
- "#),
+ "#,
+ ),
responses: &[
(200, "Successfully executed SQL query"),
(400, "Body does not match parameters"),
(401, "Unauthorized"),
- (500, "SQL query ran into an error")
+ (500, "SQL query ran into an error"),
],
cookie: Some("admin"),
};
@@ -102,7 +109,7 @@ pub const ADMIN_POSTS: EndpointDocumentation = EndpointDocumentation {
responses: &[
(200, "Returns sql table in <span>text/html</span>"),
(401, "Unauthorized"),
- (500, "Failed to fetch data")
+ (500, "Failed to fetch data"),
],
cookie: Some("admin"),
};
@@ -119,7 +126,7 @@ pub const ADMIN_USERS: EndpointDocumentation = EndpointDocumentation {
responses: &[
(200, "Returns sql table in <span>text/html</span>"),
(401, "Unauthorized"),
- (500, "Failed to fetch data")
+ (500, "Failed to fetch data"),
],
cookie: Some("admin"),
};
@@ -136,7 +143,7 @@ pub const ADMIN_SESSIONS: EndpointDocumentation = EndpointDocumentation {
responses: &[
(200, "Returns sql table in <span>text/html</span>"),
(401, "Unauthorized"),
- (500, "Failed to fetch data")
+ (500, "Failed to fetch data"),
],
cookie: Some("admin"),
};
@@ -145,6 +152,40 @@ async fn sessions(_: AdminUser) -> Response {
admin::generate_sessions()
}
+pub const ADMIN_COMMENTS: EndpointDocumentation = EndpointDocumentation {
+ uri: "/api/admin/comments",
+ method: EndpointMethod::Post,
+ description: "Returns the entire comments table",
+ body: None,
+ responses: &[
+ (200, "Returns sql table in <span>text/html</span>"),
+ (401, "Unauthorized"),
+ (500, "Failed to fetch data"),
+ ],
+ cookie: Some("admin"),
+};
+
+async fn comments(_: AdminUser) -> Response {
+ admin::generate_comments()
+}
+
+pub const ADMIN_LIKES: EndpointDocumentation = EndpointDocumentation {
+ uri: "/api/admin/likes",
+ method: EndpointMethod::Post,
+ description: "Returns the entire likes table",
+ body: None,
+ responses: &[
+ (200, "Returns sql table in <span>text/html</span>"),
+ (401, "Unauthorized"),
+ (500, "Failed to fetch data"),
+ ],
+ cookie: Some("admin"),
+};
+
+async fn likes(_: AdminUser) -> Response {
+ admin::generate_likes()
+}
+
async fn check(check: Option<AdminUser>) -> Response {
if check.is_none() {
ResponseCode::Success.text("false")
@@ -160,5 +201,7 @@ pub fn router() -> Router {
.route("/posts", post(posts))
.route("/users", post(users))
.route("/sessions", post(sessions))
+ .route("/comments", post(comments))
+ .route("/likes", post(likes))
.route("/check", post(check))
}
diff --git a/src/api/auth.rs b/src/api/auth.rs
index 0ff180e..60ddc80 100644
--- a/src/api/auth.rs
+++ b/src/api/auth.rs
@@ -3,18 +3,22 @@ use serde::Deserialize;
use time::{Duration, OffsetDateTime};
use tower_cookies::{Cookie, Cookies};
-use crate::{types::{
- extract::{AuthorizedUser, Check, CheckResult, Json, Log},
- http::ResponseCode,
- session::Session,
- user::User,
-}, public::docs::{EndpointDocumentation, EndpointMethod}};
+use crate::{
+ public::docs::{EndpointDocumentation, EndpointMethod},
+ types::{
+ extract::{AuthorizedUser, Check, CheckResult, Json, Log},
+ http::ResponseCode,
+ session::Session,
+ user::User,
+ },
+};
pub const AUTH_REGISTER: EndpointDocumentation = EndpointDocumentation {
uri: "/api/auth/register",
method: EndpointMethod::Post,
description: "Registeres a new account",
- body: Some(r#"
+ body: Some(
+ r#"
{
"firstname": "[Object]",
"lastname": "object]",
@@ -25,7 +29,8 @@ pub const AUTH_REGISTER: EndpointDocumentation = EndpointDocumentation {
"month": 1,
"year": 1970
}
- "#),
+ "#,
+ ),
responses: &[
(201, "Successfully registered new user"),
(400, "Body does not match parameters"),
@@ -123,15 +128,20 @@ pub const AUTH_LOGIN: EndpointDocumentation = EndpointDocumentation {
uri: "/api/auth/login",
method: EndpointMethod::Post,
description: "Logs into an existing account",
- body: Some(r#"
+ body: Some(
+ r#"
{
"email": "object@object.object",
"password": "i love js"
}
- "#),
+ "#,
+ ),
responses: &[
(200, "Successfully logged in, auth cookie is returned"),
- (400, "Body does not match parameters, or invalid email password combination"),
+ (
+ 400,
+ "Body does not match parameters, or invalid email password combination",
+ ),
],
cookie: None,
};
@@ -184,7 +194,7 @@ pub const AUTH_LOGOUT: EndpointDocumentation = EndpointDocumentation {
responses: &[
(200, "Successfully logged out"),
(401, "Unauthorized"),
- (500, "Failed to log out user")
+ (500, "Failed to log out user"),
],
cookie: None,
};
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))
diff --git a/src/api/users.rs b/src/api/users.rs
index 7d1f006..0ce9988 100644
--- a/src/api/users.rs
+++ b/src/api/users.rs
@@ -1,8 +1,11 @@
-use crate::{types::{
- extract::{AuthorizedUser, Check, CheckResult, Json, Png},
- http::ResponseCode,
- user::User,
-}, public::docs::{EndpointDocumentation, EndpointMethod}};
+use crate::{
+ public::docs::{EndpointDocumentation, EndpointMethod},
+ types::{
+ extract::{AuthorizedUser, Check, CheckResult, Json, Png},
+ http::ResponseCode,
+ user::User,
+ },
+};
use axum::{
response::Response,
routing::{post, put},
@@ -14,16 +17,18 @@ pub const USERS_LOAD: EndpointDocumentation = EndpointDocumentation {
uri: "/api/users/load",
method: EndpointMethod::Post,
description: "Loads a requested set of users",
- body: Some(r#"
+ body: Some(
+ r#"
{
"ids": [0, 3, 7]
}
- "#),
+ "#,
+ ),
responses: &[
(200, "Returns users in <span>application/json</span>"),
(400, "Body does not match parameters"),
(401, "Unauthorized"),
- (500, "Failed to fetch users")
+ (500, "Failed to fetch users"),
],
cookie: Some("auth"),
};
@@ -55,17 +60,19 @@ pub const USERS_PAGE: EndpointDocumentation = EndpointDocumentation {
uri: "/api/users/page",
method: EndpointMethod::Post,
description: "Load a section of users from newest to oldest",
- body: Some(r#"
+ body: Some(
+ r#"
{
"user_id": 3,
"page": 0
}
- "#),
+ "#,
+ ),
responses: &[
(200, "Returns users in <span>application/json</span>"),
(400, "Body does not match parameters"),
(401, "Unauthorized"),
- (500, "Failed to fetch users")
+ (500, "Failed to fetch users"),
],
cookie: Some("auth"),
};
@@ -104,7 +111,7 @@ pub const USERS_SELF: EndpointDocumentation = EndpointDocumentation {
responses: &[
(200, "Successfully executed SQL query"),
(401, "Unauthorized"),
- (500, "Failed to fetch user")
+ (500, "Failed to fetch user"),
],
cookie: Some("auth"),
};
@@ -126,7 +133,7 @@ pub const USERS_AVATAR: EndpointDocumentation = EndpointDocumentation {
(200, "Successfully updated avatar"),
(400, "Invalid PNG or disallowed size"),
(401, "Unauthorized"),
- (500, "Failed to update avatar")
+ (500, "Failed to update avatar"),
],
cookie: Some("auth"),
};
@@ -150,7 +157,7 @@ pub const USERS_BANNER: EndpointDocumentation = EndpointDocumentation {
(200, "Successfully updated banner"),
(400, "Invalid PNG or disallowed size"),
(401, "Unauthorized"),
- (500, "Failed to update banner")
+ (500, "Failed to update banner"),
],
cookie: Some("auth"),
};