diff --git a/crates/yaak-models/src/models.rs b/crates/yaak-models/src/models.rs index 77e76824..6997149d 100644 --- a/crates/yaak-models/src/models.rs +++ b/crates/yaak-models/src/models.rs @@ -2409,30 +2409,29 @@ impl<'de> Deserialize<'de> for AnyModel { { let value = Value::deserialize(deserializer)?; let model = value.as_object().unwrap(); + use AnyModel::*; use serde_json::from_value as fv; let model = match model.get("model") { - Some(m) if m == "cookie_jar" => AnyModel::CookieJar(fv(value).unwrap()), - Some(m) if m == "environment" => AnyModel::Environment(fv(value).unwrap()), - Some(m) if m == "folder" => AnyModel::Folder(fv(value).unwrap()), - Some(m) if m == "graphql_introspection" => { - AnyModel::GraphQlIntrospection(fv(value).unwrap()) - } - Some(m) if m == "grpc_connection" => AnyModel::GrpcConnection(fv(value).unwrap()), - Some(m) if m == "grpc_event" => AnyModel::GrpcEvent(fv(value).unwrap()), - Some(m) if m == "grpc_request" => AnyModel::GrpcRequest(fv(value).unwrap()), - Some(m) if m == "http_request" => AnyModel::HttpRequest(fv(value).unwrap()), - Some(m) if m == "http_response" => AnyModel::HttpResponse(fv(value).unwrap()), - Some(m) if m == "key_value" => AnyModel::KeyValue(fv(value).unwrap()), - Some(m) if m == "plugin" => AnyModel::Plugin(fv(value).unwrap()), - Some(m) if m == "settings" => AnyModel::Settings(fv(value).unwrap()), - Some(m) if m == "websocket_connection" => { - AnyModel::WebsocketConnection(fv(value).unwrap()) - } - Some(m) if m == "websocket_event" => AnyModel::WebsocketEvent(fv(value).unwrap()), - Some(m) if m == "websocket_request" => AnyModel::WebsocketRequest(fv(value).unwrap()), - Some(m) if m == "workspace" => AnyModel::Workspace(fv(value).unwrap()), - Some(m) if m == "workspace_meta" => AnyModel::WorkspaceMeta(fv(value).unwrap()), + Some(m) if m == "cookie_jar" => CookieJar(fv(value).unwrap()), + Some(m) if m == "environment" => Environment(fv(value).unwrap()), + Some(m) if m == "folder" => Folder(fv(value).unwrap()), + Some(m) if m == "graphql_introspection" => GraphQlIntrospection(fv(value).unwrap()), + Some(m) if m == "grpc_connection" => GrpcConnection(fv(value).unwrap()), + Some(m) if m == "grpc_event" => GrpcEvent(fv(value).unwrap()), + Some(m) if m == "grpc_request" => GrpcRequest(fv(value).unwrap()), + Some(m) if m == "http_request" => HttpRequest(fv(value).unwrap()), + Some(m) if m == "http_response" => HttpResponse(fv(value).unwrap()), + Some(m) if m == "http_response_event" => HttpResponseEvent(fv(value).unwrap()), + Some(m) if m == "key_value" => KeyValue(fv(value).unwrap()), + Some(m) if m == "plugin" => Plugin(fv(value).unwrap()), + Some(m) if m == "settings" => Settings(fv(value).unwrap()), + Some(m) if m == "sync_state" => SyncState(fv(value).unwrap()), + Some(m) if m == "websocket_connection" => WebsocketConnection(fv(value).unwrap()), + Some(m) if m == "websocket_event" => WebsocketEvent(fv(value).unwrap()), + Some(m) if m == "websocket_request" => WebsocketRequest(fv(value).unwrap()), + Some(m) if m == "workspace" => Workspace(fv(value).unwrap()), + Some(m) if m == "workspace_meta" => WorkspaceMeta(fv(value).unwrap()), Some(m) => { return Err(serde::de::Error::custom(format!( "Failed to deserialize AnyModel {}", diff --git a/crates/yaak-models/src/queries/model_changes.rs b/crates/yaak-models/src/queries/model_changes.rs index b3e44462..141796f7 100644 --- a/crates/yaak-models/src/queries/model_changes.rs +++ b/crates/yaak-models/src/queries/model_changes.rs @@ -99,6 +99,7 @@ mod tests { use crate::init_in_memory; use crate::models::Workspace; use crate::util::{ModelChangeEvent, UpdateSource}; + use serde_json::json; #[test] fn records_model_changes_for_upsert_and_delete() { @@ -240,4 +241,49 @@ mod tests { db.prune_model_changes_older_than_hours(1).expect("Failed to prune model changes"); assert_eq!(pruned, 1); } + + #[test] + fn list_model_changes_deserializes_http_response_event_payload() { + let (query_manager, _blob_manager, _rx) = init_in_memory().expect("Failed to init DB"); + let db = query_manager.connect(); + + let payload = json!({ + "model": { + "model": "http_response_event", + "id": "re_test", + "createdAt": "2026-02-16T21:01:34.809162", + "updatedAt": "2026-02-16T21:01:34.809163", + "workspaceId": "wk_test", + "responseId": "rs_test", + "event": { + "type": "info", + "message": "hello" + } + }, + "updateSource": { "type": "sync" }, + "change": { "type": "upsert", "created": false } + }); + + db.conn + .resolve() + .execute( + r#" + INSERT INTO model_changes (model, model_id, change, update_source, payload) + VALUES (?1, ?2, ?3, ?4, ?5) + "#, + params![ + "http_response_event", + "re_test", + r#"{"type":"upsert","created":false}"#, + r#"{"type":"sync"}"#, + payload.to_string(), + ], + ) + .expect("Failed to insert model change row"); + + let changes = db.list_model_changes_after(0, 10).expect("Failed to list changes"); + assert_eq!(changes.len(), 1); + assert_eq!(changes[0].payload.model.model(), "http_response_event"); + assert_eq!(changes[0].payload.model.id(), "re_test"); + } }