use serde::{Deserialize, Serialize};
#[derive(Clone, Copy, Debug, PartialEq, Eq, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
pub enum ModuleKind {
Core,
Proprietary,
Community,
Imported,
}
#[derive(Clone, Debug, Serialize, Deserialize)]
pub struct NavEntry {
pub path: String,
pub label: String,
pub icon: String,
}
#[derive(Clone, Debug, Serialize)]
pub struct ModuleManifest {
pub id: String,
pub name: String,
pub version: String,
pub publisher: String,
pub kind: ModuleKind,
pub description: String,
pub nav: Vec<NavEntry>,
pub mount: MountKind,
#[serde(skip_serializing_if = "Option::is_none")]
pub health: Option<String>,
}
#[derive(Clone, Copy, Debug, PartialEq, Eq, Serialize)]
#[serde(rename_all = "snake_case")]
pub enum MountKind {
Bundled,
Iframe,
Headless,
}
impl ModuleManifest {
pub fn new(
id: &str,
name: &str,
version: &str,
publisher: &str,
kind: ModuleKind,
description: &str,
nav: Vec<NavEntry>,
) -> Self {
Self {
id: id.to_string(),
name: name.to_string(),
version: version.to_string(),
publisher: publisher.to_string(),
kind,
description: description.to_string(),
nav,
mount: MountKind::Bundled,
health: None,
}
}
}
impl NavEntry {
pub fn new(path: &str, label: &str, icon: &str) -> Self {
Self {
path: path.to_string(),
label: label.to_string(),
icon: icon.to_string(),
}
}
}
#[derive(Clone, Debug, Deserialize)]
pub struct ModuleRegisterRequest {
pub id: String,
pub name: String,
#[serde(default)]
pub version: String,
#[serde(default)]
pub publisher: String,
#[serde(default)]
pub description: String,
pub base_url: String,
#[serde(default)]
pub nav: Vec<NavEntry>,
#[serde(default)]
pub subscribes: Option<Vec<String>>,
#[serde(default)]
pub role: Option<String>,
}
#[derive(Clone, Debug, sqlx::FromRow)]
pub struct ModuleRegistration {
pub id: String,
pub name: String,
pub version: String,
pub publisher: String,
pub description: String,
pub base_url: String,
pub nav: sqlx::types::Json<Vec<NavEntry>>,
pub subscribes: sqlx::types::Json<Vec<String>>,
pub role: String,
pub api_key_id: Option<String>,
pub webhook_id: Option<String>,
pub health: String,
pub health_checked_at: Option<chrono::DateTime<chrono::Utc>>,
pub created_at: chrono::DateTime<chrono::Utc>,
pub updated_at: chrono::DateTime<chrono::Utc>,
}
impl ModuleRegistration {
pub fn to_manifest(&self) -> ModuleManifest {
ModuleManifest {
id: self.id.clone(),
name: self.name.clone(),
version: self.version.clone(),
publisher: self.publisher.clone(),
kind: ModuleKind::Imported,
description: self.description.clone(),
nav: self.nav.0.clone(),
mount: MountKind::Iframe,
health: Some(self.health.clone()),
}
}
}
#[derive(Clone, Debug, Serialize)]
pub struct ModuleDetail {
pub id: String,
pub name: String,
pub version: String,
pub publisher: String,
pub description: String,
pub base_url: String,
pub nav: Vec<NavEntry>,
pub subscribes: Vec<String>,
pub role: String,
pub api_key_id: Option<String>,
pub webhook_id: Option<String>,
pub health: String,
pub health_checked_at: Option<chrono::DateTime<chrono::Utc>>,
pub created_at: chrono::DateTime<chrono::Utc>,
}
impl From<&ModuleRegistration> for ModuleDetail {
fn from(r: &ModuleRegistration) -> Self {
ModuleDetail {
id: r.id.clone(),
name: r.name.clone(),
version: r.version.clone(),
publisher: r.publisher.clone(),
description: r.description.clone(),
base_url: r.base_url.clone(),
nav: r.nav.0.clone(),
subscribes: r.subscribes.0.clone(),
role: r.role.clone(),
api_key_id: r.api_key_id.clone(),
webhook_id: r.webhook_id.clone(),
health: r.health.clone(),
health_checked_at: r.health_checked_at,
created_at: r.created_at,
}
}
}
#[derive(Clone, Debug, Serialize)]
pub struct ModuleRegistered {
pub module: ModuleDetail,
pub api_key: String,
pub webhook_secret: String,
}