From 9c60ae2000c876f019532c984abd8aaa8befc267 Mon Sep 17 00:00:00 2001 From: Imbus Date: Fri, 27 Oct 2023 16:05:12 +0200 Subject: [PATCH] Individual post api endpoint --- server/src/db.rs | 8 ++++++++ server/src/main.rs | 3 ++- server/src/routes/post.rs | 13 +++++++++++-- 3 files changed, 21 insertions(+), 3 deletions(-) diff --git a/server/src/db.rs b/server/src/db.rs index 0c694ee..aa7e33d 100644 --- a/server/src/db.rs +++ b/server/src/db.rs @@ -19,6 +19,14 @@ pub async fn db_get_latest_posts(pool: &SqlitePool, limit: i64, offset: i64) -> .unwrap() } +// Gets the post with id from the database +pub async fn db_get_post(id: i64, pool: &SqlitePool) -> Option { + sqlx::query_as!(Post, "SELECT * FROM posts WHERE id = ?", id) + .fetch_one(pool) + .await + .ok() +} + // Inserts a new post to the database pub async fn db_new_post(userid: i64, content: &str, pool: &SqlitePool) -> Option { info!("User with id {} submitted a post", userid); diff --git a/server/src/main.rs b/server/src/main.rs index 719a040..6d95008 100755 --- a/server/src/main.rs +++ b/server/src/main.rs @@ -10,7 +10,7 @@ mod jwt; mod routes; mod state; -use routes::{get_posts, login, new_post, register}; +use routes::{get_posts, login, new_post, post_by_id, register}; use state::CaptchaState; use state::ServerState; @@ -31,6 +31,7 @@ async fn main() -> std::io::Result<()> { scope("/api") .service(get_posts) .service(new_post) + .service(post_by_id) .service(login) .service(register) .app_data(Data::new(data.clone())) diff --git a/server/src/routes/post.rs b/server/src/routes/post.rs index 8380f97..42ef85e 100755 --- a/server/src/routes/post.rs +++ b/server/src/routes/post.rs @@ -1,8 +1,8 @@ -use crate::db::{db_get_latest_posts, db_new_post}; +use crate::db::{db_get_latest_posts, db_get_post, db_new_post}; use crate::jwt::validate_token; use crate::ServerState; -use actix_web::web::{Data, Query}; +use actix_web::web::{Data, Path, Query}; use actix_web::{get, post, web::Json, HttpResponse, Responder, Result}; use log::info; use serde::{Deserialize, Serialize}; @@ -94,3 +94,12 @@ pub async fn new_post(new_post: Json, state: Data) -> Resu None => Ok(HttpResponse::InternalServerError().json("Error")), }; } + +#[get("posts/{id}")] +pub async fn post_by_id(path: Path, state: Data) -> Result { + let id = path.into_inner(); + match db_get_post(id, &state.pool).await { + Some(post) => Ok(HttpResponse::Ok().json(post)), + None => Ok(HttpResponse::NotFound().json("Error")), + } +}