From d843f9ff129703afab9e4ec6dbfb74923828e400 Mon Sep 17 00:00:00 2001 From: Echo Date: Wed, 29 Apr 2026 01:45:47 +0000 Subject: [PATCH] fix: add serde rename_all to all enums for correct JSON serialization All 6 enums in pm-core/src/models.rs had #[sqlx(rename_all)] for database mapping but were missing #[serde(rename_all)] for JSON. Backend expected PascalCase (Once, Daily, etc.) but frontend sent lowercase (once, daily, etc.), causing deserialization errors like: "unknown variant once, expected Once, Daily, Weekly, Monthly" Fixed enums: - HostHealthStatus: serde(rename_all = "lowercase") - UserRole: serde(rename_all = "lowercase") - AuthProvider: serde(rename_all = "snake_case") - JobStatus: serde(rename_all = "lowercase") - JobKind: serde(rename_all = "snake_case") - WindowRecurrence: serde(rename_all = "lowercase") Frontend types already matched - no frontend changes needed. --- crates/pm-core/src/models.rs | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/crates/pm-core/src/models.rs b/crates/pm-core/src/models.rs index 1900ec7..6b6e71f 100644 --- a/crates/pm-core/src/models.rs +++ b/crates/pm-core/src/models.rs @@ -12,6 +12,7 @@ use uuid::Uuid; // ============================================================ #[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, sqlx::Type)] +#[serde(rename_all = "lowercase")] #[sqlx(type_name = "host_health_status", rename_all = "lowercase")] pub enum HostHealthStatus { Pending, @@ -32,6 +33,7 @@ impl std::fmt::Display for HostHealthStatus { } #[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, sqlx::Type)] +#[serde(rename_all = "lowercase")] #[sqlx(type_name = "user_role", rename_all = "lowercase")] pub enum UserRole { Admin, @@ -48,6 +50,7 @@ impl std::fmt::Display for UserRole { } #[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, sqlx::Type)] +#[serde(rename_all = "snake_case")] #[sqlx(type_name = "auth_provider", rename_all = "snake_case")] pub enum AuthProvider { Local, @@ -216,6 +219,7 @@ pub struct RegisterDiscoveredRequest { // ============================================================ #[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, sqlx::Type)] +#[serde(rename_all = "lowercase")] #[sqlx(type_name = "job_status", rename_all = "lowercase")] pub enum JobStatus { Queued, @@ -240,6 +244,7 @@ impl std::fmt::Display for JobStatus { } #[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, sqlx::Type)] +#[serde(rename_all = "snake_case")] #[sqlx(type_name = "job_kind", rename_all = "snake_case")] pub enum JobKind { #[sqlx(rename = "patch_apply")] @@ -324,6 +329,7 @@ pub struct PatchJobSummary { /// Recurrence type for a maintenance window. /// Mirrors the `window_recurrence` PostgreSQL ENUM. #[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, sqlx::Type)] +#[serde(rename_all = "lowercase")] #[sqlx(type_name = "window_recurrence", rename_all = "lowercase")] pub enum WindowRecurrence { /// Single one-time window (at `start_at` for `duration_minutes` minutes).