From 680867b4bb5e2708f02fc3f8c21c3563975c44c7 Mon Sep 17 00:00:00 2001 From: WriterV2 Date: Thu, 7 Nov 2024 18:35:27 +0100 Subject: Feat: Add admin API route to delete story by product id --- ...31ded4a8612d16f230448c97a8eb301948e9f3f0955763.json | 12 ++++++++++++ ...9466b2a4177bb090792b553b951f524ee6f5939f992b7a.json | 12 ++++++++++++ ...7f2c8a6c97d9d641db0e8be85f6776d34c59801329f27c.json | 12 ++++++++++++ src/db/mod.rs | 4 ++++ src/db/product.rs | 7 ++++++- src/db/story.rs | 13 +++++++++++++ src/handlers/admin.rs | 18 ++++++++++++++++++ src/handlers/mod.rs | 4 ++-- 8 files changed, 79 insertions(+), 3 deletions(-) create mode 100644 .sqlx/query-07b6199b50db665e1a31ded4a8612d16f230448c97a8eb301948e9f3f0955763.json create mode 100644 .sqlx/query-2dc5e20d5cc793cc639466b2a4177bb090792b553b951f524ee6f5939f992b7a.json create mode 100644 .sqlx/query-c924cd379b966e7ca47f2c8a6c97d9d641db0e8be85f6776d34c59801329f27c.json diff --git a/.sqlx/query-07b6199b50db665e1a31ded4a8612d16f230448c97a8eb301948e9f3f0955763.json b/.sqlx/query-07b6199b50db665e1a31ded4a8612d16f230448c97a8eb301948e9f3f0955763.json new file mode 100644 index 0000000..96a16a8 --- /dev/null +++ b/.sqlx/query-07b6199b50db665e1a31ded4a8612d16f230448c97a8eb301948e9f3f0955763.json @@ -0,0 +1,12 @@ +{ + "db_name": "SQLite", + "query": "DELETE FROM story WHERE pid = $1", + "describe": { + "columns": [], + "parameters": { + "Right": 1 + }, + "nullable": [] + }, + "hash": "07b6199b50db665e1a31ded4a8612d16f230448c97a8eb301948e9f3f0955763" +} diff --git a/.sqlx/query-2dc5e20d5cc793cc639466b2a4177bb090792b553b951f524ee6f5939f992b7a.json b/.sqlx/query-2dc5e20d5cc793cc639466b2a4177bb090792b553b951f524ee6f5939f992b7a.json new file mode 100644 index 0000000..9d2d57b --- /dev/null +++ b/.sqlx/query-2dc5e20d5cc793cc639466b2a4177bb090792b553b951f524ee6f5939f992b7a.json @@ -0,0 +1,12 @@ +{ + "db_name": "SQLite", + "query": "DELETE FROM product WHERE id = $1", + "describe": { + "columns": [], + "parameters": { + "Right": 1 + }, + "nullable": [] + }, + "hash": "2dc5e20d5cc793cc639466b2a4177bb090792b553b951f524ee6f5939f992b7a" +} diff --git a/.sqlx/query-c924cd379b966e7ca47f2c8a6c97d9d641db0e8be85f6776d34c59801329f27c.json b/.sqlx/query-c924cd379b966e7ca47f2c8a6c97d9d641db0e8be85f6776d34c59801329f27c.json new file mode 100644 index 0000000..727a89d --- /dev/null +++ b/.sqlx/query-c924cd379b966e7ca47f2c8a6c97d9d641db0e8be85f6776d34c59801329f27c.json @@ -0,0 +1,12 @@ +{ + "db_name": "SQLite", + "query": "DELETE FROM producttag WHERE pid = $1", + "describe": { + "columns": [], + "parameters": { + "Right": 1 + }, + "nullable": [] + }, + "hash": "c924cd379b966e7ca47f2c8a6c97d9d641db0e8be85f6776d34c59801329f27c" +} diff --git a/src/db/mod.rs b/src/db/mod.rs index e44c9ad..51665a3 100644 --- a/src/db/mod.rs +++ b/src/db/mod.rs @@ -25,4 +25,8 @@ pub trait ProductDatabaseHandler { ) -> Result where Self: Sized; + + async fn delete(pool: &SqlitePool, id: i64) -> Result<(), AppError> + where + Self: Sized; } diff --git a/src/db/product.rs b/src/db/product.rs index 06217c0..c21734e 100644 --- a/src/db/product.rs +++ b/src/db/product.rs @@ -5,7 +5,6 @@ use sqlx::{QueryBuilder, Sqlite, SqlitePool, Transaction}; use crate::error::AppError; -use super::producttag::ProductTag; use super::tag::Tag; use super::ProductDatabaseHandler; @@ -50,6 +49,12 @@ impl Product { } Ok(product) } + + pub async fn delete(tx: &mut Transaction<'static, Sqlite>, pid: i64) -> Result<(), AppError> { + sqlx::query!("DELETE FROM producttag WHERE pid = $1", pid).execute(&mut **tx).await?; + sqlx::query!("DELETE FROM product WHERE id = $1", pid).execute(&mut **tx).await?; + Ok(()) + } } pub trait ProductMarker { diff --git a/src/db/story.rs b/src/db/story.rs index 137c964..9e5fdb9 100644 --- a/src/db/story.rs +++ b/src/db/story.rs @@ -99,6 +99,19 @@ impl ProductDatabaseHandler for Story { Ok(story) } + + async fn delete(pool: &SqlitePool, pid: i64) -> Result<(), AppError> + where + Self: Sized, + { + let mut tx = pool.begin().await?; + sqlx::query!("DELETE FROM story WHERE pid = $1", pid) + .execute(&mut *tx) + .await?; + Product::delete(&mut tx, pid).await?; + tx.commit().await?; + Ok(()) + } } impl PageBuilder for Story { diff --git a/src/handlers/admin.rs b/src/handlers/admin.rs index 7c016dd..3d16b32 100644 --- a/src/handlers/admin.rs +++ b/src/handlers/admin.rs @@ -132,3 +132,21 @@ pub async fn upload_story( .await?; Ok((StatusCode::CREATED, Json(story)).into_response()) } + +pub async fn delete_story( + ctx: Extension, + mut multipart: Multipart, +) -> Result { + if let Some(field) = multipart.next_field().await? { + if let Some(label) = field.name() { + if label == "id" { + let pid = field.text().await?.parse::()?; + Story::delete(&ctx.pool, pid).await?; + return Ok((StatusCode::NO_CONTENT).into_response()); + } + return Ok(StatusCode::BAD_REQUEST.into_response()); + } + return Ok(StatusCode::BAD_REQUEST.into_response()); + } + Ok(StatusCode::BAD_REQUEST.into_response()) +} diff --git a/src/handlers/mod.rs b/src/handlers/mod.rs index e2063eb..14ac176 100644 --- a/src/handlers/mod.rs +++ b/src/handlers/mod.rs @@ -9,7 +9,7 @@ use sqlx::SqlitePool; use tower_http::add_extension::AddExtensionLayer; use tower_http::services::ServeDir; -use admin::{admin_healthcheck, admin_middleware, generate_token, upload_story}; +use admin::{admin_healthcheck, admin_middleware, delete_story, generate_token, upload_story}; use frontend_builder::home; use crate::db::story::Story; @@ -35,7 +35,7 @@ pub async fn router(pool: SqlitePool) -> Router { }; Router::new() - .route("/admin/story", post(upload_story)) + .route("/admin/story", post(upload_story).delete(delete_story)) .route("/admin", get(admin_healthcheck)) .layer(middleware::from_fn_with_state( state.clone(), -- cgit v1.2.3