From 2faba0388f93d8e4fb86219eba7883b331d501ff Mon Sep 17 00:00:00 2001 From: soryu Date: Wed, 24 Dec 2025 05:45:22 +0000 Subject: Add versioning to files --- makima/src/db/models.rs | 96 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 96 insertions(+) (limited to 'makima/src/db/models.rs') diff --git a/makima/src/db/models.rs b/makima/src/db/models.rs index 8204b86..617e590 100644 --- a/makima/src/db/models.rs +++ b/makima/src/db/models.rs @@ -149,3 +149,99 @@ impl From for FileSummary { } } } + +// ============================================================================= +// Version History Types +// ============================================================================= + +/// Source of a version change +#[derive(Debug, Clone, Serialize, Deserialize, ToSchema, sqlx::Type)] +#[sqlx(type_name = "varchar")] +#[serde(rename_all = "lowercase")] +pub enum VersionSource { + #[sqlx(rename = "user")] + User, + #[sqlx(rename = "llm")] + Llm, + #[sqlx(rename = "system")] + System, +} + +impl std::fmt::Display for VersionSource { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + match self { + VersionSource::User => write!(f, "user"), + VersionSource::Llm => write!(f, "llm"), + VersionSource::System => write!(f, "system"), + } + } +} + +impl std::str::FromStr for VersionSource { + type Err = String; + + fn from_str(s: &str) -> Result { + match s.to_lowercase().as_str() { + "user" => Ok(VersionSource::User), + "llm" => Ok(VersionSource::Llm), + "system" => Ok(VersionSource::System), + _ => Err(format!("Unknown version source: {}", s)), + } + } +} + +/// Full version record from the database +#[derive(Debug, Clone, FromRow, Serialize, ToSchema)] +#[serde(rename_all = "camelCase")] +pub struct FileVersion { + pub id: Uuid, + pub file_id: Uuid, + pub version: i32, + pub name: String, + pub description: Option, + pub summary: Option, + #[sqlx(json)] + pub body: Vec, + pub source: String, + pub change_description: Option, + pub created_at: DateTime, +} + +/// Summary of a version for list views +#[derive(Debug, Clone, Serialize, ToSchema)] +#[serde(rename_all = "camelCase")] +pub struct FileVersionSummary { + pub version: i32, + pub source: String, + pub created_at: DateTime, + pub change_description: Option, +} + +impl From for FileVersionSummary { + fn from(v: FileVersion) -> Self { + Self { + version: v.version, + source: v.source, + created_at: v.created_at, + change_description: v.change_description, + } + } +} + +/// Response for version list endpoint +#[derive(Debug, Serialize, ToSchema)] +#[serde(rename_all = "camelCase")] +pub struct FileVersionListResponse { + pub versions: Vec, + pub total: i64, +} + +/// Request to restore a file to a previous version +#[derive(Debug, Deserialize, ToSchema)] +#[serde(rename_all = "camelCase")] +pub struct RestoreVersionRequest { + /// The version to restore to + pub target_version: i32, + /// The current version (for optimistic locking) + pub current_version: i32, +} -- cgit v1.2.3