Individual post api endpoint

This commit is contained in:
Imbus 2023-10-27 16:05:12 +02:00
parent 6bef5ada4d
commit 9c60ae2000
3 changed files with 21 additions and 3 deletions

View file

@ -19,6 +19,14 @@ pub async fn db_get_latest_posts(pool: &SqlitePool, limit: i64, offset: i64) ->
.unwrap() .unwrap()
} }
// Gets the post with id from the database
pub async fn db_get_post(id: i64, pool: &SqlitePool) -> Option<Post> {
sqlx::query_as!(Post, "SELECT * FROM posts WHERE id = ?", id)
.fetch_one(pool)
.await
.ok()
}
// Inserts a new post to the database // Inserts a new post to the database
pub async fn db_new_post(userid: i64, content: &str, pool: &SqlitePool) -> Option<Post> { pub async fn db_new_post(userid: i64, content: &str, pool: &SqlitePool) -> Option<Post> {
info!("User with id {} submitted a post", userid); info!("User with id {} submitted a post", userid);

View file

@ -10,7 +10,7 @@ mod jwt;
mod routes; mod routes;
mod state; 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::CaptchaState;
use state::ServerState; use state::ServerState;
@ -31,6 +31,7 @@ async fn main() -> std::io::Result<()> {
scope("/api") scope("/api")
.service(get_posts) .service(get_posts)
.service(new_post) .service(new_post)
.service(post_by_id)
.service(login) .service(login)
.service(register) .service(register)
.app_data(Data::new(data.clone())) .app_data(Data::new(data.clone()))

View file

@ -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::jwt::validate_token;
use crate::ServerState; 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 actix_web::{get, post, web::Json, HttpResponse, Responder, Result};
use log::info; use log::info;
use serde::{Deserialize, Serialize}; use serde::{Deserialize, Serialize};
@ -94,3 +94,12 @@ pub async fn new_post(new_post: Json<NewPost>, state: Data<ServerState>) -> Resu
None => Ok(HttpResponse::InternalServerError().json("Error")), None => Ok(HttpResponse::InternalServerError().json("Error")),
}; };
} }
#[get("posts/{id}")]
pub async fn post_by_id(path: Path<i64>, state: Data<ServerState>) -> Result<impl Responder> {
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")),
}
}