Refine AnyModel deserialization

This commit is contained in:
Gregory Schier
2026-02-16 13:20:36 -08:00
parent b75e9479e6
commit 9856383566
2 changed files with 66 additions and 21 deletions

View File

@@ -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 {}",

View File

@@ -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");
}
}