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, 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(()) } }