Individual post api endpoint
This commit is contained in:
parent
6bef5ada4d
commit
9c60ae2000
3 changed files with 21 additions and 3 deletions
|
@ -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);
|
||||||
|
|
|
@ -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()))
|
||||||
|
|
|
@ -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")),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in a new issue