use sqlx::{PgPool, Postgres, Transaction};
use std::collections::HashMap;
use uuid::Uuid;
use crate::error::Post3Error;
use crate::models::MetadataEntry;
pub struct MultipartMetadataRepository;
impl MultipartMetadataRepository {
pub async fn insert_batch_in_tx(
tx: &mut Transaction<'_, Postgres>,
upload_id: Uuid,
metadata: &HashMap<String, String>,
) -> Result<(), Post3Error> {
for (key, value) in metadata {
sqlx::query(
"INSERT INTO multipart_upload_metadata (upload_id, meta_key, meta_value) \
VALUES ($1, $2, $3)",
)
.bind(upload_id)
.bind(key)
.bind(value)
.execute(&mut **tx)
.await?;
}
Ok(())
}
pub async fn get_all(
db: &PgPool,
upload_id: Uuid,
) -> Result<HashMap<String, String>, Post3Error> {
let rows = sqlx::query_as::<_, MetadataEntry>(
"SELECT id, upload_id AS object_id, meta_key, meta_value \
FROM multipart_upload_metadata WHERE upload_id = $1",
)
.bind(upload_id)
.fetch_all(db)
.await?;
let map = rows
.into_iter()
.map(|e| (e.meta_key, e.meta_value))
.collect();
Ok(map)
}
}