52 lines
1.7 KiB
TypeScript
52 lines
1.7 KiB
TypeScript
/** Kullanıcı/admin API key oluşturma ve güncelleme için ortak süre kuralları */
|
||
|
||
export const MAX_API_KEY_NAME_LEN = 120;
|
||
export const MAX_EXPIRES_DAYS = 3650;
|
||
|
||
export function expiresAtFromDays(days: number): Date {
|
||
return new Date(Date.now() + days * 86_400_000);
|
||
}
|
||
|
||
/**
|
||
* Body'den süre çıkarır: yok/null/0 = süresiz; 1..MAX_EXPIRES_DAYS = o kadar gün.
|
||
* Geçersiz sayıda null döner (çağıran 400 verebilir).
|
||
*/
|
||
export function parseExpiresInDaysOptional(
|
||
raw: unknown
|
||
): { ok: true; value: number | null } | { ok: false; error: string } {
|
||
if (raw === undefined || raw === null) {
|
||
return { ok: true, value: null };
|
||
}
|
||
if (typeof raw !== "number" || !Number.isFinite(raw)) {
|
||
return { ok: false, error: "expiresInDays sayı olmalıdır." };
|
||
}
|
||
const d = Math.floor(raw);
|
||
if (d === 0) {
|
||
return { ok: true, value: null };
|
||
}
|
||
if (d < 1 || d > MAX_EXPIRES_DAYS) {
|
||
return {
|
||
ok: false,
|
||
error: `expiresInDays 0 (süresiz) veya 1–${MAX_EXPIRES_DAYS} arası olmalıdır.`,
|
||
};
|
||
}
|
||
return { ok: true, value: d };
|
||
}
|
||
|
||
/** Süresiz: daysRemaining null. Süreli: kalan tam gün sayısı (bitiş anına kadar; dolmuşsa 0). */
|
||
export function getDaysRemaining(expiresAt: Date | null | undefined): number | null {
|
||
if (expiresAt == null) return null;
|
||
const ms = expiresAt.getTime() - Date.now();
|
||
if (ms <= 0) return 0;
|
||
return Math.ceil(ms / 86_400_000);
|
||
}
|
||
|
||
/** Kullanıcı ve admin arayüzleri için kısa Türkçe ibare */
|
||
export function getExpiryRemainingLabel(expiresAt: Date | null | undefined): string {
|
||
if (expiresAt == null) return "Süresiz";
|
||
const d = getDaysRemaining(expiresAt);
|
||
if (d === 0) return "Süresi doldu";
|
||
if (d === 1) return "1 gün kaldı";
|
||
return `${d} gün kaldı`;
|
||
}
|