post3 0.1.0

Pluggable S3-compatible object storage — core library with PostgreSQL and filesystem backends
Documentation
use sqlx::{Postgres, Transaction};
use uuid::Uuid;

use crate::error::Post3Error;
use crate::models::BlockRow;

pub struct BlocksRepository;

impl BlocksRepository {
    pub async fn insert_in_tx(
        tx: &mut Transaction<'_, Postgres>,
        object_id: Uuid,
        block_index: i32,
        data: &[u8],
    ) -> Result<(), Post3Error> {
        let block_size = data.len() as i32;
        sqlx::query(
            "INSERT INTO blocks (object_id, block_index, data, block_size) \
             VALUES ($1, $2, $3, $4)",
        )
        .bind(object_id)
        .bind(block_index)
        .bind(data)
        .bind(block_size)
        .execute(&mut **tx)
        .await?;

        Ok(())
    }

    pub async fn get_all(
        db: &sqlx::PgPool,
        object_id: Uuid,
    ) -> Result<Vec<BlockRow>, Post3Error> {
        let rows = sqlx::query_as::<_, BlockRow>(
            "SELECT * FROM blocks WHERE object_id = $1 ORDER BY block_index ASC",
        )
        .bind(object_id)
        .fetch_all(db)
        .await?;

        Ok(rows)
    }
}