From 75bbdfc56e1a6158aebebc515f877d3ad8ac617c Mon Sep 17 00:00:00 2001 From: Hare Date: Thu, 24 Sep 2026 04:38:23 +0900 Subject: [PATCH] fix: migrate legacy ticket target key evidence --- crates/workspace-server/src/store.rs | 45 +++++++++++++++++++++------- 1 file changed, 35 insertions(+), 10 deletions(-) diff --git a/crates/workspace-server/src/store.rs b/crates/workspace-server/src/store.rs index 5b41cb671..1f9859ba7 100644 --- a/crates/workspace-server/src/store.rs +++ b/crates/workspace-server/src/store.rs @@ -11646,16 +11646,21 @@ fn apply_ticket_targets_and_workdir_capabilities_schema(conn: &Connection) -> Re let legacy_event_targets = { let mut statement = db.prepare( "SELECT attribute.workspace_id, attribute.ticket_id, attribute.event_index, - repository.repository_key, selector.value + COALESCE(repository_by_id.repository_key, + repository_by_key.repository_key), + selector.value FROM typed_ticket_event_attributes AS attribute LEFT JOIN typed_ticket_event_attributes AS selector ON selector.workspace_id = attribute.workspace_id AND selector.ticket_id = attribute.ticket_id AND selector.event_index = attribute.event_index AND selector.key = 'ref_selector' - LEFT JOIN repositories AS repository - ON repository.workspace_id = attribute.workspace_id - AND repository.repository_id = attribute.value + LEFT JOIN repositories AS repository_by_id + ON repository_by_id.workspace_id = attribute.workspace_id + AND repository_by_id.repository_id = attribute.value + LEFT JOIN repositories AS repository_by_key + ON repository_by_key.workspace_id = attribute.workspace_id + AND repository_by_key.repository_key = attribute.value WHERE attribute.key = 'repository_id' ORDER BY attribute.workspace_id, attribute.ticket_id, attribute.event_index", )?; @@ -13642,15 +13647,18 @@ mod tests { INSERT INTO typed_ticket_events( workspace_id, ticket_id, event_index, kind, author, at, status, from_state, to_state, reason, state_field, heading, body - ) VALUES ( - 'workspace-a', 'ticket-a', 0, 'state_changed', 'user', '1', NULL, - 'planning', 'ready', NULL, 'state', 'State changed', '' - ); + ) VALUES + ('workspace-a', 'ticket-a', 0, 'state_changed', 'user', '1', NULL, + 'planning', 'ready', NULL, 'state', 'State changed', ''), + ('workspace-a', 'ticket-a', 1, 'state_changed', 'user', '2', NULL, + 'ready', 'planning', NULL, 'state', 'State changed', ''); INSERT INTO typed_ticket_event_attributes( workspace_id, ticket_id, event_index, key, value ) VALUES ('workspace-a', 'ticket-a', 0, 'repository_id', 'repo-main'), - ('workspace-a', 'ticket-a', 0, 'ref_selector', 'develop'); + ('workspace-a', 'ticket-a', 0, 'ref_selector', 'develop'), + ('workspace-a', 'ticket-a', 1, 'repository_id', 'main'), + ('workspace-a', 'ticket-a', 1, 'ref_selector', 'feature/key-evidence'); INSERT INTO worker_registry( workspace_id, worker_id, runtime_id, display_name, profile, retention_state, transcript_ref, session_ref, summary_ref, diagnostics_ref, created_at, updated_at @@ -13726,11 +13734,28 @@ mod tests { "access": "read_write" }]) ); + let key_target_evidence: String = conn + .query_row( + "SELECT value FROM typed_ticket_event_attributes + WHERE workspace_id = 'workspace-a' AND ticket_id = 'ticket-a' + AND event_index = 1 AND key = 'targets'", + [], + |row| row.get(0), + ) + .unwrap(); + assert_eq!( + serde_json::from_str::(&key_target_evidence).unwrap(), + serde_json::json!([{ + "repository_key": "main", + "ref_selector": "feature/key-evidence", + "access": "read_write" + }]) + ); assert_eq!( conn.query_row( "SELECT COUNT(*) FROM typed_ticket_event_attributes WHERE workspace_id = 'workspace-a' AND ticket_id = 'ticket-a' - AND event_index = 0 AND key IN ('repository_id', 'ref_selector')", + AND key IN ('repository_id', 'ref_selector')", [], |row| row.get::<_, i64>(0), )