From 99fc959383d5b7b26d8e80f6257adf8b98989f41 Mon Sep 17 00:00:00 2001 From: WriterV2 Date: Thu, 7 Nov 2024 17:06:03 +0100 Subject: Feat: Add ability to add tags to story (and product in general) --- src/db/product.rs | 24 ++++++++++++++++++++++-- 1 file changed, 22 insertions(+), 2 deletions(-) (limited to 'src/db/product.rs') 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 { + pub async fn post(tx: &mut Transaction<'static, Sqlite>, name: String, description: String, tags: Vec) -> Result { 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 = 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 = tags_query_builder + .build_query_as::() + .fetch_all(&mut **tx) + .await?; + + let mut producttags_query_builder: QueryBuilder = 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) } } -- cgit v1.2.3