Q102: several remote accounts of a toolkit are each adopted, none folded into another
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
1 parent
4a6641fd49
commit
0ebe0febdb
2 files changed
+28
-5
No files matched your search
@@ -106,6 +106,7 @@ export class ComposioConnectionService {
|
|||||||
}
|
}
|
||||||
const tracked = this.trackedIds(orgId);
|
const tracked = this.trackedIds(orgId);
|
||||||
const toolkitsHere = new Set(localRows.filter((row) => liveIds.has(row.id)).map((row) => row.toolkit_slug));
|
const toolkitsHere = new Set(localRows.filter((row) => liveIds.has(row.id)).map((row) => row.toolkit_slug));
|
||||||
|
const adoptable = new Map<string, ComposioConnectedAccount[]>();
|
||||||
for (const account of accounts) {
|
for (const account of accounts) {
|
||||||
if (!account.toolkitSlug) continue;
|
if (!account.toolkitSlug) continue;
|
||||||
if (tracked.has(account.id)) {
|
if (tracked.has(account.id)) {
|
||||||
@@ -115,11 +116,18 @@ export class ComposioConnectionService {
|
|||||||
}
|
}
|
||||||
// Only a toolkit with no account here is adopted; other untracked accounts (a waiting reconnect, an orphan) never join.
|
// Only a toolkit with no account here is adopted; other untracked accounts (a waiting reconnect, an orphan) never join.
|
||||||
if (toolkitsHere.has(account.toolkitSlug)) continue;
|
if (toolkitsHere.has(account.toolkitSlug)) continue;
|
||||||
toolkitsHere.add(account.toolkitSlug);
|
adoptable.set(account.toolkitSlug, [...(adoptable.get(account.toolkitSlug) ?? []), account]);
|
||||||
this.db.prepare(`
|
}
|
||||||
insert into connector_accounts(id, org_id, toolkit_slug, toolkit_name, label, auth_config_id, status, created_at, updated_at)
|
for (const [slug, found] of adoptable) {
|
||||||
values (?, ?, ?, ?, ?, ?, ?, ?, ?)
|
for (const account of found) {
|
||||||
`).run(account.id, orgId, account.toolkitSlug, connectorDisplayName(account.toolkitSlug), DEFAULT_ACCOUNT_LABEL, account.authConfigId, account.status, account.createdAt || now, now);
|
// A lone account is "main"; several each keep their own id as label, so none stands in for another.
|
||||||
|
const label = found.length === 1 ? DEFAULT_ACCOUNT_LABEL : normalizeAccountLabel(account.id);
|
||||||
|
this.db.prepare(`
|
||||||
|
insert into connector_accounts(id, org_id, toolkit_slug, toolkit_name, label, auth_config_id, status, created_at, updated_at)
|
||||||
|
values (?, ?, ?, ?, ?, ?, ?, ?, ?)
|
||||||
|
`).run(account.id, orgId, slug, connectorDisplayName(slug), label, account.authConfigId, account.status, account.createdAt || now, now);
|
||||||
|
}
|
||||||
|
console.info(`[connectors] adopted ${found.length} ${slug} account(s) made outside the app`);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -123,6 +123,21 @@ describe("reconnecting a connector keeps the working account until the new one i
|
|||||||
h.connection.close();
|
h.connection.close();
|
||||||
});
|
});
|
||||||
|
|
||||||
|
test("several accounts made outside the app for one toolkit are each adopted, none folded into another", async () => {
|
||||||
|
const h = await connectedCompany();
|
||||||
|
for (const id of ["ca_slack_b", "ca_slack_a"]) remote.set(id, { id, toolkitSlug: "slack", status: "ACTIVE", authConfigId: "ac_slack", createdAt: new Date().toISOString() });
|
||||||
|
remote.set("ca_notion", { id: "ca_notion", toolkitSlug: "notion", status: "ACTIVE", authConfigId: "ac_notion", createdAt: new Date().toISOString() });
|
||||||
|
await h.service.refreshAccounts(h.orgId);
|
||||||
|
const rows = h.connection.db.prepare("select id, toolkit_slug as toolkit, label from connector_accounts where org_id = ? order by toolkit_slug, label").all(h.orgId);
|
||||||
|
expect(rows).toEqual([
|
||||||
|
{ id: h.oldId, toolkit: "github", label: "main" },
|
||||||
|
{ id: "ca_notion", toolkit: "notion", label: "main" },
|
||||||
|
{ id: "ca_slack_a", toolkit: "slack", label: "ca_slack_a" },
|
||||||
|
{ id: "ca_slack_b", toolkit: "slack", label: "ca_slack_b" },
|
||||||
|
]);
|
||||||
|
h.connection.close();
|
||||||
|
});
|
||||||
|
|
||||||
test("a reconnect that cannot start touches nothing", async () => {
|
test("a reconnect that cannot start touches nothing", async () => {
|
||||||
const h = await connectedCompany();
|
const h = await connectedCompany();
|
||||||
failCreate = true;
|
failCreate = true;
|
||||||
|
|||||||
Reference in new issue
Block a user