Bohan Jiang
e4994cd431
fix(github): allow one installation to bind multiple workspaces ( #4855 )
...
Connecting the same GitHub App installation in a second workspace silently
overwrote the first workspace's binding: github_installation was
UNIQUE(installation_id) and CreateGitHubInstallation's upsert overwrote
workspace_id on conflict (#4823 ).
Widen the uniqueness key to (workspace_id, installation_id) so each workspace
keeps its own binding row, and teach the webhook/lifecycle paths to handle N
bindings per installation_id:
- CreateGitHubInstallation upserts per (workspace_id, installation_id).
- Webhook lookup lists all bindings; PR/check_suite routing uses the oldest
binding as the deterministic fallback and still routes per-repo via the
existing workspace.repos registry.
- installation.deleted/suspend drops every workspace binding and broadcasts to
each affected workspace.
- installation.created/unsuspend refreshes account metadata across all bindings.
- Add a standalone index on installation_id (the dropped unique constraint was
the only index behind the webhook lookup).
MUL-3950
Co-authored-by: J <j@multica.ai >
Co-authored-by: multica-agent <github@multica.ai >
2026-07-02 17:21:50 +08:00
..
2026-06-17 15:18:44 +02:00
2026-05-28 16:05:19 +08:00
2026-05-28 16:05:19 +08:00
2026-06-30 12:24:57 +08:00
2026-06-03 19:12:14 +08:00
2026-05-28 19:06:57 +08:00
2026-06-13 15:33:28 +08:00
2026-06-03 16:39:06 +08:00
2026-05-28 19:06:57 +08:00
2026-06-17 08:23:20 +02:00
2026-05-28 15:53:16 +08:00
2026-07-01 12:46:47 +08:00
2026-06-03 16:39:06 +08:00
2026-06-15 14:12:24 +08:00
2026-06-30 12:29:11 +08:00
2026-06-02 15:47:57 +08:00
2026-06-18 13:33:14 +08:00
2026-05-27 15:47:36 +08:00
2026-05-27 15:47:36 +08:00
2026-06-03 16:39:06 +08:00
2026-06-30 12:29:11 +08:00
2026-06-18 09:40:38 +08:00
2026-07-01 12:46:47 +08:00
2026-07-01 12:46:47 +08:00
2026-06-24 12:46:20 +08:00
2026-06-24 14:16:22 +08:00
2026-05-28 16:05:19 +08:00
2026-05-28 16:05:19 +08:00
2026-05-27 14:52:03 +08:00
2026-05-27 14:52:03 +08:00
2026-06-24 09:52:18 +08:00
2026-06-01 08:28:15 +08:00
2026-06-10 14:20:39 +08:00
2026-06-30 12:24:57 +08:00
2026-06-30 14:56:49 +08:00
2026-06-16 08:38:53 +08:00
2026-06-29 19:01:14 +08:00
2026-05-22 13:22:36 +08:00
2026-06-03 16:39:06 +08:00
2026-06-04 13:12:32 +08:00
2026-06-24 16:19:30 +08:00
2026-06-24 16:25:17 +08:00
2026-06-17 16:00:22 +08:00
2026-07-01 12:46:47 +08:00
2026-05-21 15:33:47 +08:00
2026-06-18 11:10:06 +08:00
2026-06-03 16:39:06 +08:00
2026-07-02 14:33:09 +08:00
2026-07-01 13:28:44 +08:00
2026-07-02 17:21:50 +08:00
2026-07-02 17:21:50 +08:00
2026-06-30 12:24:57 +08:00
2026-06-21 23:41:05 +08:00
2026-07-01 17:53:16 +08:00
2026-06-26 12:09:15 +08:00
2026-06-03 16:39:06 +08:00
2026-07-02 14:11:10 +08:00
2026-06-23 00:14:42 +08:00
2026-06-23 00:14:42 +08:00
2026-07-02 15:48:45 +08:00
2026-07-02 15:48:45 +08:00
2026-06-24 16:06:14 +08:00
2026-05-28 14:20:20 +08:00
2026-05-19 10:37:38 +08:00
2026-06-02 17:17:41 +08:00
2026-05-21 16:35:45 +08:00
2026-05-21 16:35:45 +08:00
2026-05-19 17:04:16 +08:00
2026-06-23 13:17:13 +08:00
2026-06-23 13:17:13 +08:00
2026-06-16 12:26:44 +08:00
2026-07-02 14:11:10 +08:00
2026-06-25 00:19:13 +08:00
2026-06-25 00:19:13 +08:00
2026-06-24 12:46:20 +08:00
2026-06-24 12:46:20 +08:00
2026-06-30 12:24:57 +08:00
2026-06-03 16:39:06 +08:00
2026-07-01 17:53:16 +08:00
2026-07-01 17:53:16 +08:00
2026-05-21 15:33:47 +08:00
2026-05-27 22:22:26 +08:00
2026-05-27 22:22:26 +08:00
2026-06-24 16:25:17 +08:00
2026-06-24 16:25:17 +08:00
2026-06-21 23:54:58 +08:00
2026-06-21 23:54:58 +08:00
2026-06-12 16:45:38 +08:00
2026-05-25 10:05:17 +08:00
2026-06-08 13:08:38 +08:00
2026-06-23 16:52:46 +08:00
2026-06-11 13:00:56 +08:00
2026-06-22 13:14:22 +08:00
2026-07-02 14:38:05 +08:00
2026-06-11 13:00:56 +08:00
2026-06-18 15:24:41 +08:00
2026-07-02 14:38:05 +08:00
2026-05-20 12:30:10 +08:00
2026-06-23 14:20:18 +08:00
2026-06-23 14:20:18 +08:00
2026-07-02 14:38:05 +08:00
2026-06-18 11:10:06 +08:00
2026-07-02 14:38:05 +08:00
2026-05-21 15:33:47 +08:00
2026-06-23 16:52:46 +08:00
2026-05-18 15:45:06 +08:00
2026-06-11 13:00:56 +08:00
2026-06-30 14:46:46 +08:00
2026-06-30 14:46:46 +08:00
2026-06-11 13:00:56 +08:00
2026-05-22 12:22:07 +08:00
2026-06-01 15:19:42 +08:00
2026-06-22 13:34:06 +08:00
2026-06-30 14:46:46 +08:00
2026-06-29 14:09:34 +08:00
2026-06-29 14:09:34 +08:00
2026-06-26 16:01:33 +08:00
2026-06-26 16:01:33 +08:00
2026-06-26 16:01:33 +08:00
2026-06-30 14:56:49 +08:00
2026-06-26 16:01:33 +08:00
2026-06-02 13:03:15 +08:00
2026-06-30 12:24:57 +08:00
2026-06-30 12:24:57 +08:00
2026-05-28 15:53:16 +08:00
2026-06-30 12:24:57 +08:00
2026-06-02 14:29:29 +08:00
2026-05-21 15:33:47 +08:00
2026-05-18 14:59:40 +08:00
2026-06-30 12:29:11 +08:00
2026-06-25 01:29:20 +08:00
2026-06-24 12:46:20 +08:00
2026-06-24 12:46:20 +08:00
2026-06-13 01:22:45 +08:00