mabel/src/database/collection.rs

58 lines
1.4 KiB
Rust

use async_trait::async_trait;
use std::vec;
use uuid::Uuid;
use crate::content::{
collection::{CollectionData, CollectionRepository, DEFAULT_COLLECTIONS},
Error,
};
use super::Database;
#[async_trait]
impl CollectionRepository for Database {
async fn list_collections(&self, site: &Uuid) -> Result<Vec<CollectionData>, Error> {
Ok(sqlx::query_as!(
CollectionData,
r#"SELECT id, slug, name, parent FROM collections WHERE site = $1"#,
site
)
.fetch_all(&self.pool)
.await?)
}
async fn create_default_collections(&self, site: &Uuid) -> Result<(), Error> {
let mut tx = self.pool.begin().await?;
let mut uuids = vec![];
for (slug, name) in DEFAULT_COLLECTIONS {
let record = sqlx::query!(
r#"INSERT INTO collections (id, site, slug, name)
VALUES ($1, $2, $3, $4)
RETURNING id"#,
Uuid::now_v7(),
site,
slug,
name
)
.fetch_one(&mut tx)
.await?;
uuids.push(record.id);
}
sqlx::query!(
r#"UPDATE sites
SET default_collection = $1
WHERE id = $2"#,
uuids[0],
site
)
.execute(&mut tx)
.await?;
tx.commit().await?;
Ok(())
}
}