AI-admin: fiks provider-swap ved å droppe UNIQUE-constraint på prioritet
- Fjernet UNIQUE(alias_id, priority) — prioritet er kun for sortering - Forenklet swap-endpoint til to rene UPDATE-statements - Renummerert kjapp-providers til sekvensielle prioriteter Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
parent
7c81e80742
commit
b0d0202eb8
2 changed files with 21 additions and 25 deletions
10
migrations/0013_drop_priority_unique.sql
Normal file
10
migrations/0013_drop_priority_unique.sql
Normal file
|
|
@ -0,0 +1,10 @@
|
|||
-- 0013_drop_priority_unique.sql
|
||||
-- Fjern UNIQUE-constraint på (alias_id, priority).
|
||||
-- Prioritet brukes kun for sortering/fallback-rekkefølge, ikke som naturlig nøkkel.
|
||||
-- Constrainten hindrer atomisk swap og krever unødvendig kompleksitet.
|
||||
|
||||
BEGIN;
|
||||
|
||||
ALTER TABLE ai_model_providers DROP CONSTRAINT IF EXISTS ai_model_providers_alias_id_priority_key;
|
||||
|
||||
COMMIT;
|
||||
|
|
@ -2,43 +2,29 @@ import { json, error } from '@sveltejs/kit';
|
|||
import type { RequestHandler } from './$types';
|
||||
import { sql } from '$lib/server/db';
|
||||
|
||||
/** POST — bytt prioritet mellom to providers (atomisk) */
|
||||
/** POST — bytt prioritet mellom to providers */
|
||||
export const POST: RequestHandler = async ({ request, locals }) => {
|
||||
if (!locals.workspace || !locals.user) error(401);
|
||||
|
||||
const { id_a, id_b } = await request.json();
|
||||
if (!id_a || !id_b) error(400, 'id_a og id_b kreves');
|
||||
|
||||
// Atomisk swap via CTE — unngår UNIQUE-constraint-brudd
|
||||
const rows = await sql`
|
||||
WITH swap AS (
|
||||
SELECT
|
||||
a.id AS id_a, a.priority AS pri_a,
|
||||
b.id AS id_b, b.priority AS pri_b
|
||||
FROM ai_model_providers a, ai_model_providers b
|
||||
WHERE a.id = ${id_a}::uuid AND b.id = ${id_b}::uuid
|
||||
AND a.alias_id = b.alias_id
|
||||
),
|
||||
update_a AS (
|
||||
UPDATE ai_model_providers SET priority = -1, updated_at = now()
|
||||
WHERE id = (SELECT id_a FROM swap)
|
||||
),
|
||||
update_b AS (
|
||||
UPDATE ai_model_providers SET priority = (SELECT pri_a FROM swap), updated_at = now()
|
||||
WHERE id = (SELECT id_b FROM swap)
|
||||
)
|
||||
UPDATE ai_model_providers SET priority = (SELECT pri_b FROM swap), updated_at = now()
|
||||
WHERE id = (SELECT id_a FROM swap)
|
||||
RETURNING id
|
||||
`;
|
||||
// Hent begge providers
|
||||
const [a] = await sql`SELECT id, alias_id, priority FROM ai_model_providers WHERE id = ${id_a}::uuid`;
|
||||
const [b] = await sql`SELECT id, alias_id, priority FROM ai_model_providers WHERE id = ${id_b}::uuid`;
|
||||
|
||||
if (rows.length === 0) error(400, 'Kunne ikke bytte — sjekk at begge tilhører samme alias');
|
||||
if (!a || !b) error(404, 'Provider ikke funnet');
|
||||
if (a.alias_id !== b.alias_id) error(400, 'Providers tilhører ikke samme alias');
|
||||
|
||||
// Bytt prioriteter
|
||||
await sql`UPDATE ai_model_providers SET priority = ${b.priority}, updated_at = now() WHERE id = ${a.id}`;
|
||||
await sql`UPDATE ai_model_providers SET priority = ${a.priority}, updated_at = now() WHERE id = ${b.id}`;
|
||||
|
||||
// Returner oppdaterte providers for aliaset
|
||||
const updated = await sql`
|
||||
SELECT id, alias_id, priority, litellm_model, api_key_env, is_active, extra_params
|
||||
FROM ai_model_providers
|
||||
WHERE alias_id = (SELECT alias_id FROM ai_model_providers WHERE id = ${id_a}::uuid)
|
||||
WHERE alias_id = ${a.alias_id}
|
||||
ORDER BY priority ASC
|
||||
`;
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue