Delete post route
This commit is contained in:
parent
ea25fa9489
commit
70ba521aa5
3 changed files with 67 additions and 5 deletions
|
@ -0,0 +1,15 @@
|
||||||
|
{
|
||||||
|
"db_name": "PostgreSQL",
|
||||||
|
"query": "DELETE FROM posts WHERE id = $1 AND user_id = (SELECT id FROM users WHERE username = $2)",
|
||||||
|
"describe": {
|
||||||
|
"columns": [],
|
||||||
|
"parameters": {
|
||||||
|
"Left": [
|
||||||
|
"Int8",
|
||||||
|
"Text"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"nullable": []
|
||||||
|
},
|
||||||
|
"hash": "149c876947c5df3c5397a9aab0534c55acfc9521301399c47fcf5466bc2d58bc"
|
||||||
|
}
|
|
@ -19,7 +19,7 @@ use state::CaptchaState;
|
||||||
use state::ServerState;
|
use state::ServerState;
|
||||||
use util::hex_string;
|
use util::hex_string;
|
||||||
|
|
||||||
use crate::routes::{engage_post, get_engagements};
|
use crate::routes::{delete_post, engage_post, get_engagements};
|
||||||
|
|
||||||
#[actix_web::main]
|
#[actix_web::main]
|
||||||
async fn main() -> std::io::Result<()> {
|
async fn main() -> std::io::Result<()> {
|
||||||
|
@ -66,6 +66,7 @@ async fn main() -> std::io::Result<()> {
|
||||||
scope("/api")
|
scope("/api")
|
||||||
.service(get_posts)
|
.service(get_posts)
|
||||||
.service(new_post)
|
.service(new_post)
|
||||||
|
.service(delete_post)
|
||||||
.service(new_comment)
|
.service(new_comment)
|
||||||
.service(get_comments)
|
.service(get_comments)
|
||||||
.service(engage_post)
|
.service(engage_post)
|
||||||
|
|
|
@ -4,7 +4,7 @@ use crate::types::{NewPost, PostQueryParams};
|
||||||
use crate::ServerState;
|
use crate::ServerState;
|
||||||
|
|
||||||
use actix_web::web::{Data, Path, Query};
|
use actix_web::web::{Data, Path, Query};
|
||||||
use actix_web::HttpRequest;
|
use actix_web::{delete, HttpRequest};
|
||||||
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;
|
||||||
|
|
||||||
|
@ -102,9 +102,12 @@ pub async fn engage_post(
|
||||||
}
|
}
|
||||||
|
|
||||||
// Get engagement count
|
// Get engagement count
|
||||||
let q = sqlx::query!("SELECT COUNT(*) FROM engagements WHERE post_id = $1", post_id)
|
let q = sqlx::query!(
|
||||||
.fetch_one(&state.pool)
|
"SELECT COUNT(*) FROM engagements WHERE post_id = $1",
|
||||||
.await;
|
post_id
|
||||||
|
)
|
||||||
|
.fetch_one(&state.pool)
|
||||||
|
.await;
|
||||||
|
|
||||||
match q {
|
match q {
|
||||||
Ok(count) => Ok(HttpResponse::Ok().json(count.count)),
|
Ok(count) => Ok(HttpResponse::Ok().json(count.count)),
|
||||||
|
@ -115,6 +118,49 @@ pub async fn engage_post(
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[delete("/posts/{id}")]
|
||||||
|
pub async fn delete_post(
|
||||||
|
path: Path<i64>,
|
||||||
|
state: Data<ServerState>,
|
||||||
|
auth: Data<Authentication>,
|
||||||
|
req: HttpRequest,
|
||||||
|
) -> Result<impl Responder> {
|
||||||
|
let post_id = path.into_inner();
|
||||||
|
let token = req
|
||||||
|
.headers()
|
||||||
|
.get("Authorization")
|
||||||
|
.unwrap()
|
||||||
|
.to_str()
|
||||||
|
.unwrap();
|
||||||
|
|
||||||
|
// Remove the Bearer prefix
|
||||||
|
let token = token.replace("Bearer ", "");
|
||||||
|
let claims = auth.decode(&token);
|
||||||
|
|
||||||
|
if let Err(e) = claims {
|
||||||
|
info!("Error validating token: {}", e);
|
||||||
|
return Ok(HttpResponse::BadRequest().json("Error"));
|
||||||
|
}
|
||||||
|
|
||||||
|
let username = claims.unwrap().sub;
|
||||||
|
|
||||||
|
let q = sqlx::query!(
|
||||||
|
"DELETE FROM posts WHERE id = $1 AND user_id = (SELECT id FROM users WHERE username = $2)",
|
||||||
|
post_id,
|
||||||
|
username
|
||||||
|
)
|
||||||
|
.execute(&state.pool)
|
||||||
|
.await;
|
||||||
|
|
||||||
|
match q {
|
||||||
|
Ok(_) => Ok(HttpResponse::Ok().json("Deleted")),
|
||||||
|
Err(e) => {
|
||||||
|
info!("Error deleting post: {}", e);
|
||||||
|
Ok(HttpResponse::InternalServerError().json("Error"))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
#[get("/posts/{id}/engage")]
|
#[get("/posts/{id}/engage")]
|
||||||
pub async fn get_engagements(path: Path<i64>, state: Data<ServerState>) -> Result<impl Responder> {
|
pub async fn get_engagements(path: Path<i64>, state: Data<ServerState>) -> Result<impl Responder> {
|
||||||
let id = path.into_inner();
|
let id = path.into_inner();
|
||||||
|
|
Loading…
Reference in a new issue