From 4e2470e713c38733972b04b84272ed0b6b4db492 Mon Sep 17 00:00:00 2001 From: bilalgursen Date: Mon, 5 Oct 2026 01:03:37 +0300 Subject: [PATCH] =?UTF-8?q?fix(danisman):=20H1=20=E2=80=94=20ayn=C4=B1=20a?= =?UTF-8?q?d=C4=B1mda=20iki=20profil=5Fguncelle=20birbirini=20ezmesin?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit profilAlanYaz oku → değiştir → yaz yerine tek SQL ifadesiyle yazar (json_set / json_remove); eşzamanlı iki alan yazımı artık ikisini de tutar. Co-Authored-By: Claude Fable 5.1 --- src/lib/danisman-profil-db.ts | 36 ++++++++++++++++++++--------------- 1 file changed, 21 insertions(+), 15 deletions(-) diff --git a/src/lib/danisman-profil-db.ts b/src/lib/danisman-profil-db.ts index e92703f..8f77e33 100644 --- a/src/lib/danisman-profil-db.ts +++ b/src/lib/danisman-profil-db.ts @@ -1,7 +1,8 @@ import "server-only"; -import { eq } from "drizzle-orm"; +import { eq, sql } from "drizzle-orm"; import { appDb, schema } from "@/lib/appdb"; import { + PROFIL_ALANLARI, PROFIL_SEMASI, profilTemizle, type DanismanProfili, @@ -20,33 +21,38 @@ export async function profilGetir(userId: string): Promise { /** * Tek alanı yazar (deger null → alan silinir). Değer şemadan geçmezse hata * fırlatır; çağıran taraf (araç) bunu modele "kaydedilmedi" diye döner. + * + * Yazım tek SQL ifadesidir (json_set / json_remove): model aynı adımda iki + * alanı birden kaydedince oku → değiştir → yaz sırası birbirini eziyordu. */ export async function profilAlanYaz( userId: string, alan: ProfilAlani, deger: unknown, ): Promise { - const mevcut = await profilGetir(userId); - const yeni: Record = { ...mevcut }; + if (!PROFIL_ALANLARI.includes(alan)) throw new Error(`Bilinmeyen alan: ${alan}`); + const kolon = schema.danismanProfil.alanlar; + const yol = `$.${alan}`; + const now = new Date(); if (deger === null || deger === undefined) { - delete yeni[alan]; + await appDb + .update(schema.danismanProfil) + .set({ alanlar: sql`json_remove(${kolon}, ${yol})`, updatedAt: now }) + .where(eq(schema.danismanProfil.userId, userId)); } else { const dogrulama = PROFIL_SEMASI.shape[alan].safeParse(deger); if (!dogrulama.success) { throw new Error(`Geçersiz değer: ${alan}`); } - yeni[alan] = dogrulama.data; + await appDb + .insert(schema.danismanProfil) + .values({ userId, alanlar: { [alan]: dogrulama.data }, updatedAt: now }) + .onConflictDoUpdate({ + target: schema.danismanProfil.userId, + set: { alanlar: sql`json_set(${kolon}, ${yol}, ${dogrulama.data})`, updatedAt: now }, + }); } - const alanlar = PROFIL_SEMASI.parse(yeni); - const now = new Date(); - await appDb - .insert(schema.danismanProfil) - .values({ userId, alanlar, updatedAt: now }) - .onConflictDoUpdate({ - target: schema.danismanProfil.userId, - set: { alanlar, updatedAt: now }, - }); - return alanlar; + return profilGetir(userId); } export async function profilSil(userId: string): Promise {