fix: bind assignment events to tickets
This commit is contained in:
@@ -5271,10 +5271,12 @@ fn workspace_resource_reference_diagnostics(conn: &Connection) -> Result<Vec<Str
|
|||||||
WHERE (event.assignment_id IS NOT NULL AND NOT EXISTS (\
|
WHERE (event.assignment_id IS NOT NULL AND NOT EXISTS (\
|
||||||
SELECT 1 FROM ticket_worker_assignments AS assignment \
|
SELECT 1 FROM ticket_worker_assignments AS assignment \
|
||||||
WHERE assignment.workspace_id = event.workspace_id \
|
WHERE assignment.workspace_id = event.workspace_id \
|
||||||
|
AND assignment.ticket_id = event.ticket_id \
|
||||||
AND assignment.assignment_id = event.assignment_id)) \
|
AND assignment.assignment_id = event.assignment_id)) \
|
||||||
OR (event.previous_assignment_id IS NOT NULL AND NOT EXISTS (\
|
OR (event.previous_assignment_id IS NOT NULL AND NOT EXISTS (\
|
||||||
SELECT 1 FROM ticket_worker_assignments AS assignment \
|
SELECT 1 FROM ticket_worker_assignments AS assignment \
|
||||||
WHERE assignment.workspace_id = event.workspace_id \
|
WHERE assignment.workspace_id = event.workspace_id \
|
||||||
|
AND assignment.ticket_id = event.ticket_id \
|
||||||
AND assignment.assignment_id = event.previous_assignment_id)) LIMIT 100",
|
AND assignment.assignment_id = event.previous_assignment_id)) LIMIT 100",
|
||||||
),
|
),
|
||||||
(
|
(
|
||||||
@@ -6429,7 +6431,7 @@ CREATE INDEX IF NOT EXISTS idx_workspace_resource_human_keys_reverse
|
|||||||
// Worker retention deletion, so parent FKs would impose the wrong delete semantics. These
|
// Worker retention deletion, so parent FKs would impose the wrong delete semantics. These
|
||||||
// triggers provide the equivalent database-layer insertion boundary: every new assignment
|
// triggers provide the equivalent database-layer insertion boundary: every new assignment
|
||||||
// resolves both authorities in the same Workspace, and event references resolve a committed
|
// resolves both authorities in the same Workspace, and event references resolve a committed
|
||||||
// assignment. Operation assignment/Worker ids remain unconstrained because reservations are
|
// assignment for the same Ticket. Operation assignment/Worker ids remain unconstrained because reservations are
|
||||||
// persisted before assignment/Worker creation and expected ids may intentionally be stale.
|
// persisted before assignment/Worker creation and expected ids may intentionally be stale.
|
||||||
conn.execute_batch(
|
conn.execute_batch(
|
||||||
r#"
|
r#"
|
||||||
@@ -6470,11 +6472,13 @@ BEFORE INSERT ON ticket_worker_assignment_events
|
|||||||
WHEN (NEW.assignment_id IS NOT NULL AND NOT EXISTS (
|
WHEN (NEW.assignment_id IS NOT NULL AND NOT EXISTS (
|
||||||
SELECT 1 FROM ticket_worker_assignments AS assignment
|
SELECT 1 FROM ticket_worker_assignments AS assignment
|
||||||
WHERE assignment.workspace_id = NEW.workspace_id
|
WHERE assignment.workspace_id = NEW.workspace_id
|
||||||
|
AND assignment.ticket_id = NEW.ticket_id
|
||||||
AND assignment.assignment_id = NEW.assignment_id
|
AND assignment.assignment_id = NEW.assignment_id
|
||||||
))
|
))
|
||||||
OR (NEW.previous_assignment_id IS NOT NULL AND NOT EXISTS (
|
OR (NEW.previous_assignment_id IS NOT NULL AND NOT EXISTS (
|
||||||
SELECT 1 FROM ticket_worker_assignments AS assignment
|
SELECT 1 FROM ticket_worker_assignments AS assignment
|
||||||
WHERE assignment.workspace_id = NEW.workspace_id
|
WHERE assignment.workspace_id = NEW.workspace_id
|
||||||
|
AND assignment.ticket_id = NEW.ticket_id
|
||||||
AND assignment.assignment_id = NEW.previous_assignment_id
|
AND assignment.assignment_id = NEW.previous_assignment_id
|
||||||
))
|
))
|
||||||
BEGIN
|
BEGIN
|
||||||
@@ -8414,6 +8418,8 @@ INSERT INTO typed_tickets (
|
|||||||
('workspace-a', 'ticket-a', 'ticket-a', 'A', 'open', 'task', 'normal', '',
|
('workspace-a', 'ticket-a', 'ticket-a', 'A', 'open', 'task', 'normal', '',
|
||||||
'2026-01-01', '2026-01-01', 'planning', 1, 'repo-a', 'develop'),
|
'2026-01-01', '2026-01-01', 'planning', 1, 'repo-a', 'develop'),
|
||||||
('workspace-b', 'ticket-b', 'ticket-b', 'B', 'open', 'task', 'normal', '',
|
('workspace-b', 'ticket-b', 'ticket-b', 'B', 'open', 'task', 'normal', '',
|
||||||
|
'2026-01-01', '2026-01-01', 'planning', 1, NULL, NULL),
|
||||||
|
('workspace-b', 'ticket-b2', 'ticket-b2', 'B2', 'open', 'task', 'normal', '',
|
||||||
'2026-01-01', '2026-01-01', 'planning', 1, NULL, NULL);
|
'2026-01-01', '2026-01-01', 'planning', 1, NULL, NULL);
|
||||||
INSERT INTO objectives (
|
INSERT INTO objectives (
|
||||||
workspace_id, objective_id, title, state, body_md, created_at, updated_at
|
workspace_id, objective_id, title, state, body_md, created_at, updated_at
|
||||||
@@ -8435,6 +8441,18 @@ INSERT INTO ticket_worker_assignments (
|
|||||||
'workspace-b', 'ticket-b', 'assignment-cross-worker', 'runtime-a',
|
'workspace-b', 'ticket-b', 'assignment-cross-worker', 'runtime-a',
|
||||||
'00000000-0000-7000-8000-000000000001', 'tester', '2026-01-01'
|
'00000000-0000-7000-8000-000000000001', 'tester', '2026-01-01'
|
||||||
);
|
);
|
||||||
|
INSERT INTO ticket_worker_assignments (
|
||||||
|
workspace_id, ticket_id, assignment_id, runtime_id, worker_id, assigned_by, assigned_at
|
||||||
|
) VALUES (
|
||||||
|
'workspace-b', 'ticket-b', 'assignment-event-source', 'runtime-b',
|
||||||
|
'00000000-0000-7000-8000-000000000002', 'tester', '2026-01-01'
|
||||||
|
);
|
||||||
|
INSERT INTO ticket_worker_assignment_events (
|
||||||
|
workspace_id, ticket_id, event_id, action, assignment_id, actor, created_at
|
||||||
|
) VALUES (
|
||||||
|
'workspace-b', 'ticket-b2', 'event-cross-ticket', 'assigned',
|
||||||
|
'assignment-event-source', 'tester', '2026-01-01'
|
||||||
|
);
|
||||||
"#,
|
"#,
|
||||||
)
|
)
|
||||||
.unwrap();
|
.unwrap();
|
||||||
@@ -8454,12 +8472,19 @@ INSERT INTO ticket_worker_assignments (
|
|||||||
"{error}"
|
"{error}"
|
||||||
);
|
);
|
||||||
assert!(error.contains("assignment-cross-worker"), "{error}");
|
assert!(error.contains("assignment-cross-worker"), "{error}");
|
||||||
|
assert!(
|
||||||
|
error.contains("ticket_worker_assignment_events.assignment_id"),
|
||||||
|
"{error}"
|
||||||
|
);
|
||||||
|
assert!(error.contains("event-cross-ticket"), "{error}");
|
||||||
assert_eq!(current_schema_version(&conn).unwrap(), 38);
|
assert_eq!(current_schema_version(&conn).unwrap(), 38);
|
||||||
|
|
||||||
conn.execute("DELETE FROM typed_ticket_relations", [])
|
conn.execute("DELETE FROM typed_ticket_relations", [])
|
||||||
.unwrap();
|
.unwrap();
|
||||||
conn.execute("DELETE FROM objective_ticket_links", [])
|
conn.execute("DELETE FROM objective_ticket_links", [])
|
||||||
.unwrap();
|
.unwrap();
|
||||||
|
conn.execute("DELETE FROM ticket_worker_assignment_events", [])
|
||||||
|
.unwrap();
|
||||||
conn.execute("DELETE FROM ticket_worker_assignments", [])
|
conn.execute("DELETE FROM ticket_worker_assignments", [])
|
||||||
.unwrap();
|
.unwrap();
|
||||||
apply_migrations_through(&conn, 39).unwrap();
|
apply_migrations_through(&conn, 39).unwrap();
|
||||||
@@ -8520,7 +8545,7 @@ INSERT INTO ticket_worker_assignments (
|
|||||||
let cross_assignment_event = conn.execute(
|
let cross_assignment_event = conn.execute(
|
||||||
"INSERT INTO ticket_worker_assignment_events \
|
"INSERT INTO ticket_worker_assignment_events \
|
||||||
(workspace_id, ticket_id, event_id, action, assignment_id, actor, created_at) \
|
(workspace_id, ticket_id, event_id, action, assignment_id, actor, created_at) \
|
||||||
VALUES ('workspace-a', 'ticket-a', 'event-cross-assignment', 'assigned', \
|
VALUES ('workspace-b', 'ticket-b2', 'event-cross-assignment', 'assigned', \
|
||||||
'assignment-b', 'tester', '2026-01-01')",
|
'assignment-b', 'tester', '2026-01-01')",
|
||||||
[],
|
[],
|
||||||
);
|
);
|
||||||
@@ -8539,13 +8564,6 @@ INSERT INTO ticket_worker_assignments (
|
|||||||
)
|
)
|
||||||
.is_err()
|
.is_err()
|
||||||
);
|
);
|
||||||
conn.execute(
|
|
||||||
"INSERT INTO typed_tickets (workspace_id, ticket_id, slug, title, status, kind, priority, body, \
|
|
||||||
workflow_state, workflow_state_explicit) VALUES \
|
|
||||||
('workspace-b', 'ticket-b2', 'ticket-b2', 'B2', 'open', 'task', 'normal', '', 'planning', 1)",
|
|
||||||
[],
|
|
||||||
)
|
|
||||||
.unwrap();
|
|
||||||
conn.execute(
|
conn.execute(
|
||||||
"INSERT INTO typed_ticket_relations \
|
"INSERT INTO typed_ticket_relations \
|
||||||
(workspace_id, ticket_id, kind, target, note, author, at) \
|
(workspace_id, ticket_id, kind, target, note, author, at) \
|
||||||
|
|||||||
Reference in New Issue
Block a user