From 17046c830f963f92e2d4744b9fee9a7ce83825f6 Mon Sep 17 00:00:00 2001 From: bilalgursen Date: Mon, 21 Sep 2026 04:52:27 +0300 Subject: [PATCH] =?UTF-8?q?feat(analitik):=20giris=5Fbasarili=20sunucu=20o?= =?UTF-8?q?lay=C4=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Oturum oluşturulduğunda (databaseHooks.session.create.after) Rybbit'e sunucudan giris_basarili düşer; yontem = eposta | google | diger (better-auth uç yolundan türetilir). Huninin "link istendi → giriş yapıldı" adımı bugüne dek ölçülemiyordu. - await yok: Rybbit'in 3 sn'lik timeout'u girişi geciktirmez; sunucuOlayi hata fırlatmaz. E-posta adresi olaya girmez, yalnızca kullanıcı ID. - RYBBIT_HOST/SITE_ID/API_KEY yoksa no-op — prod .env.production'da bu üçü bugün yok (bkz. ayrı ci.yaml commit'i), eklenene dek olay düşmez. Giriş akışının davranışını değiştirmez (yalnızca yan etki ekler). Co-Authored-By: Claude Fable 5.1 --- src/lib/analitik-sunucu.ts | 4 ++-- src/lib/auth.ts | 23 +++++++++++++++++++++++ 2 files changed, 25 insertions(+), 2 deletions(-) diff --git a/src/lib/analitik-sunucu.ts b/src/lib/analitik-sunucu.ts index 0c10688..3e2b8cf 100644 --- a/src/lib/analitik-sunucu.ts +++ b/src/lib/analitik-sunucu.ts @@ -1,7 +1,7 @@ import "server-only"; /** * Rybbit'e sunucudan olay gönderimi (POST /api/track). Yalnızca sunucu - * tarafından çağrılır (lib/odeme.ts) — anahtar NEXT_PUBLIC_ değil. + * tarafından çağrılır (lib/odeme.ts, lib/auth.ts) — anahtar NEXT_PUBLIC_ değil. * * Neden sunucu tarafı: ödeme dönüşümü tarayıcıdan gönderilirse reklam * engelleyiciler ve iyzico dönüşünde kapatılan sekmeler yüzünden kaybolur. @@ -14,7 +14,7 @@ const HOST = process.env.RYBBIT_HOST; const SITE_ID = process.env.RYBBIT_SITE_ID; const API_KEY = process.env.RYBBIT_API_KEY; -export type SunucuOlayAdi = "odeme_tamamlandi"; +export type SunucuOlayAdi = "odeme_tamamlandi" | "giris_basarili"; export async function sunucuOlayi( ad: SunucuOlayAdi, diff --git a/src/lib/auth.ts b/src/lib/auth.ts index 1a1df6b..680a0eb 100644 --- a/src/lib/auth.ts +++ b/src/lib/auth.ts @@ -2,6 +2,7 @@ import "server-only"; import { betterAuth } from "better-auth"; import { drizzleAdapter } from "better-auth/adapters/drizzle"; import { magicLink } from "better-auth/plugins"; +import { sunucuOlayi } from "./analitik-sunucu"; import { appDb, schema } from "./appdb"; import { grantCredits, DENEME_KREDISI } from "./credits"; import { magicLinkEpostasi } from "./eposta"; @@ -157,6 +158,28 @@ export const auth = betterAuth({ }, }, }, + session: { + create: { + after: async (session, ctx) => { + // Huninin son adımı: oturum gerçekten açıldı. Sunucudan gider — + // reklam engelleyici ve kapanan sekme kaybettirmez. `await` YOK: + // Rybbit'in 3 sn'lik timeout'u girişi geciktirmesin (sunucuOlayi + // hata fırlatmaz). E-posta adresi özelliklere girmez. + const yol = ctx?.path ?? ""; + void sunucuOlayi("giris_basarili", { + kullaniciId: session.userId, + pathname: "/giris", + ozellikler: { + yontem: yol.startsWith("/magic-link") + ? "eposta" + : yol.startsWith("/callback") + ? "google" + : "diger", + }, + }); + }, + }, + }, }, });