refactor: update Dockerfile and authentication flow for improved user experience
All checks were successful
Deploy / deploy (push) Successful in 15m6s
All checks were successful
Deploy / deploy (push) Successful in 15m6s
- Updated Dockerfile to create a cache directory for Next.js runtime, ensuring proper permissions and ownership. - Enhanced the authentication flow by updating the magic link expiration time from 5 to 15 minutes, improving user experience and reducing login issues. - Added user-friendly error handling for invalid or expired magic links, providing clear feedback on the login page. - Adjusted email templates to reflect the new 15-minute validity period for magic links. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
@@ -34,6 +34,46 @@ export interface HavuzSonuc {
|
||||
|
||||
const HEDEF = 24;
|
||||
const LIMIT = 60;
|
||||
|
||||
export type DilimHedef = Record<Dilim, number>;
|
||||
|
||||
// Listenin ideal iskeleti: 5 hayal / 13 dengeli / 6 garanti = 24 tercih.
|
||||
export const IDEAL_HEDEF: DilimHedef = { hayal: 5, dengeli: 13, garanti: 6 };
|
||||
|
||||
/**
|
||||
* Havuzun gerçek dilim dağılımına uyarlanmış liste hedefi. İdeal 5/13/6'dan
|
||||
* başlar; bir dilimde yeterli aday yoksa eksik, kapasitesi kalan dilimlere
|
||||
* dağıtılır (öncelik: dengeli → garanti → hayal — omurga önce, sigorta sonra,
|
||||
* en riskli dilim en son). Havuz 24'ün altındaysa hedef havuzun tamamıdır.
|
||||
* Deterministiktir: aynı havuz her zaman aynı hedefi üretir.
|
||||
*/
|
||||
export function dilimHedefiHesapla(havuz: AdayProgram[]): DilimHedef {
|
||||
const mevcut: DilimHedef = { hayal: 0, dengeli: 0, garanti: 0 };
|
||||
for (const p of havuz) mevcut[p.dilim]++;
|
||||
|
||||
const toplamHedef = Math.min(HEDEF, havuz.length);
|
||||
const hedef: DilimHedef = {
|
||||
hayal: Math.min(IDEAL_HEDEF.hayal, mevcut.hayal),
|
||||
dengeli: Math.min(IDEAL_HEDEF.dengeli, mevcut.dengeli),
|
||||
garanti: Math.min(IDEAL_HEDEF.garanti, mevcut.garanti),
|
||||
};
|
||||
|
||||
const oncelik: Dilim[] = ["dengeli", "garanti", "hayal"];
|
||||
let eksik = toplamHedef - hedef.hayal - hedef.dengeli - hedef.garanti;
|
||||
while (eksik > 0) {
|
||||
let dagitildi = false;
|
||||
for (const d of oncelik) {
|
||||
if (eksik <= 0) break;
|
||||
if (mevcut[d] > hedef[d]) {
|
||||
hedef[d]++;
|
||||
eksik--;
|
||||
dagitildi = true;
|
||||
}
|
||||
}
|
||||
if (!dagitildi) break;
|
||||
}
|
||||
return hedef;
|
||||
}
|
||||
// Prompt'a giden nihai havuz: dilim başına aday sayısı. Arama LIMIT ile geniş
|
||||
// yapılır (filtre/gevşetme zenginliği için), filtre sonrası buraya kırpılır —
|
||||
// 20×3=60 program ≈ 8k token; 180 program 24k token tutuyor ve lokal/ücretsiz
|
||||
|
||||
Reference in New Issue
Block a user