diff options
| author | WriterV2 <primary-v2@protonmail.com> | 2024-11-07 17:06:03 +0100 |
|---|---|---|
| committer | WriterV2 <primary-v2@protonmail.com> | 2024-11-07 17:06:31 +0100 |
| commit | 99fc959383d5b7b26d8e80f6257adf8b98989f41 (patch) | |
| tree | a12795706e7a0dee188ea0339656807aeda5243a /src/db/product.rs | |
| parent | 696af52b9b3a732b369a771e1f6409d8e2049ea9 (diff) | |
Feat: Add ability to add tags to story (and product in general)
Diffstat (limited to 'src/db/product.rs')
| -rw-r--r-- | src/db/product.rs | 24 |
1 files changed, 22 insertions, 2 deletions
diff --git a/src/db/product.rs b/src/db/product.rs index 5b58560..06217c0 100644 --- a/src/db/product.rs +++ b/src/db/product.rs @@ -1,10 +1,12 @@ use std::collections::HashMap; use std::time::SystemTime; -use sqlx::{Sqlite, SqlitePool, Transaction}; +use sqlx::{QueryBuilder, Sqlite, SqlitePool, Transaction}; use crate::error::AppError; +use super::producttag::ProductTag; +use super::tag::Tag; use super::ProductDatabaseHandler; #[derive(Debug, serde::Serialize, sqlx::FromRow)] @@ -17,7 +19,7 @@ pub struct Product { } impl Product { - pub async fn post(tx: &mut Transaction<'static, Sqlite>, name: String, description: String) -> Result<Product, AppError> { + pub async fn post(tx: &mut Transaction<'static, Sqlite>, name: String, description: String, tags: Vec<String>) -> Result<Product, AppError> { let now = SystemTime::now().duration_since(std::time::UNIX_EPOCH)?.as_millis() as i64; let product = sqlx::query_as!( Product, @@ -28,6 +30,24 @@ impl Product { now) .fetch_one(&mut **tx) .await?; + + if !tags.is_empty() { + let mut tags_query_builder: QueryBuilder<Sqlite> = QueryBuilder::new("INSERT INTO tag (name) "); + tags_query_builder.push_values(tags.iter(), | mut b, tag | { b.push_bind(tag); }); + tags_query_builder.push(" RETURNING id, name;"); + let added_tags: Vec<Tag> = tags_query_builder + .build_query_as::<Tag>() + .fetch_all(&mut **tx) + .await?; + + let mut producttags_query_builder: QueryBuilder<Sqlite> = QueryBuilder::new("INSERT INTO producttag (pid, tid) "); + producttags_query_builder.push_values(added_tags.iter(), | mut b, added_tag | { + b.push_bind(product.id).push_bind(added_tag.id); + }); + producttags_query_builder + .build().execute(&mut **tx).await?; + + } Ok(product) } } |
