post3 0.1.0

Pluggable S3-compatible object storage — core library with PostgreSQL and filesystem backends
Documentation
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)
    }
}