mabel/src/content/site.rs

87 lines
2.2 KiB
Rust

use async_trait::async_trait;
use chrono::NaiveDateTime;
use serde::{Deserialize, Serialize};
use sqlx::FromRow;
use uuid::Uuid;
use super::{collection::CollectionData, Error};
#[derive(Deserialize, Serialize, FromRow)]
pub struct Site {
/// Site internal ID
pub id: Uuid,
/// Site owner (user)
pub owner: Uuid,
/// Site name (unique per instance, shows up in URLs)
pub name: String,
/// Site's displayed name
pub title: String,
/// Site description (like a user's bio)
pub description: Option<String>,
/// Default collection (for homepage)
pub default_collection: Option<Uuid>,
/// Times
pub created_at: NaiveDateTime,
pub modified_at: Option<NaiveDateTime>,
pub deleted_at: Option<NaiveDateTime>,
}
/// More useful version of Site for showing to users
#[derive(Serialize)]
pub struct SiteData {
pub name: String,
pub owner: String,
pub owner_display_name: Option<String>,
pub title: String,
pub description: Option<String>,
pub created_at: NaiveDateTime,
pub collections: Vec<CollectionData>,
pub default_collection: Option<Uuid>,
}
/// Data required to create a new site
#[derive(Deserialize)]
pub struct CreateSiteData {
pub name: String,
pub title: String,
pub description: Option<String>,
}
/// Data required to update a site's info
#[derive(Deserialize)]
pub struct UpdateSiteData {
pub name: Option<String>,
pub title: Option<String>,
pub description: Option<String>,
pub default_collection: Option<Uuid>,
}
#[async_trait]
pub trait SiteRepository {
/// Retrieve site info from site name/slug
async fn get_site_by_name(&self, name: &str) -> Result<SiteData, Error>;
/// Create a new instance of a site and store it
async fn create_site(&self, owner: &Uuid, options: CreateSiteData) -> Result<Uuid, Error>;
/// Update an existing site's info
async fn update_site(
&self,
owner: &Uuid,
name: &str,
options: UpdateSiteData,
) -> Result<(), Error>;
/// Delete a site
async fn delete_site(&self, owner: &Uuid, name: &str, soft_delete: bool) -> Result<(), Error>;
/// Resolve a site's name to its ID
async fn get_site_id_and_owner(&self, name: &str) -> Result<(Uuid, Uuid), Error>;
}