[codex] Fix mysql insert boundary handling (#364)

* fix mysql insert boundary handling

* fix review comment follow-ups

* fix account insert boundary regressions
This commit is contained in:
Cita
2026-04-01 14:33:45 +08:00
committed by GitHub
parent aac1307470
commit 1e0dffe543
20 changed files with 544 additions and 171 deletions
+17 -10
View File
@@ -1,5 +1,6 @@
import { and, eq, sql } from 'drizzle-orm';
import { db, schema } from '../../db/index.js';
import { insertAndGetById } from '../../db/insertHelpers.js';
import { listOAuthProviderDefinitions, type OAuthProviderDefinition } from './providers.js';
function isUniqueConstraintError(error: unknown): boolean {
@@ -26,16 +27,22 @@ export async function ensureOauthProviderSite(definition: OAuthProviderDefinitio
if (existing) return existing;
try {
return await db.insert(schema.sites).values({
name: definition.site.name,
url: definition.site.url,
platform: definition.site.platform,
status: 'active',
useSystemProxy: false,
isPinned: false,
globalWeight: 1,
sortOrder: await getNextSiteSortOrder(),
}).returning().get();
return await insertAndGetById<typeof schema.sites.$inferSelect>({
table: schema.sites,
idColumn: schema.sites.id,
values: {
name: definition.site.name,
url: definition.site.url,
platform: definition.site.platform,
status: 'active',
useSystemProxy: false,
isPinned: false,
globalWeight: 1,
sortOrder: await getNextSiteSortOrder(),
},
insertErrorMessage: `failed to create oauth provider site: ${definition.site.platform}`,
loadErrorMessage: `failed to load created oauth provider site: ${definition.site.platform}`,
});
} catch (error) {
if (!isUniqueConstraintError(error)) throw error;
const recovered = await db.select().from(schema.sites).where(and(
+21 -14
View File
@@ -1,5 +1,6 @@
import { and, desc, eq, inArray, isNull, or, sql } from 'drizzle-orm';
import { db, schema } from '../../db/index.js';
import { insertAndGetById } from '../../db/insertHelpers.js';
import { getProxyUrlFromExtraConfig, mergeAccountExtraConfig } from '../accountExtraConfig.js';
import { refreshModelsForAccount } from '../modelService.js';
import * as routeRefreshWorkflow from '../routeRefreshWorkflow.js';
@@ -255,20 +256,26 @@ async function upsertOauthAccount(input: {
};
}
const created = await db.insert(schema.accounts).values({
siteId: site.id,
username,
accessToken: input.exchange.accessToken,
apiToken: null,
checkinEnabled: false,
status: 'active',
oauthProvider: input.definition.metadata.provider,
oauthAccountKey: oauth.accountKey || oauth.accountId || null,
oauthProjectId: oauth.projectId || null,
extraConfig,
isPinned: false,
sortOrder: await getNextAccountSortOrder(),
}).returning().get();
const created = await insertAndGetById<typeof schema.accounts.$inferSelect>({
table: schema.accounts,
idColumn: schema.accounts.id,
values: {
siteId: site.id,
username,
accessToken: input.exchange.accessToken,
apiToken: null,
checkinEnabled: false,
status: 'active',
oauthProvider: input.definition.metadata.provider,
oauthAccountKey: oauth.accountKey || oauth.accountId || null,
oauthProjectId: oauth.projectId || null,
extraConfig,
isPinned: false,
sortOrder: await getNextAccountSortOrder(),
},
insertErrorMessage: `failed to create oauth account: ${input.definition.metadata.provider}`,
loadErrorMessage: `failed to load created oauth account: ${input.definition.metadata.provider}`,
});
return { account: created, site, created: true, previousAccount: null };
}