Enforce API key quota within the database transaction

This commit is contained in:
2026-09-06 10:40:45 +03:00
parent 1c0b48655e
commit 1a62a876e6
5 changed files with 63 additions and 11 deletions
+22 -7
View File
@@ -224,13 +224,28 @@ export function setData(email, anahtar, deger) {
const sha256 = (s) => crypto.createHash('sha256').update(String(s)).digest('hex');
/** Yeni anahtar üretir. Ham değer YALNIZCA bir kez döner, saklanmaz. */
export function createApiKey(email, ad) {
const ham = 'ih_live_' + crypto.randomBytes(24).toString('base64url');
const id = crypto.randomUUID();
withDb((db) => db.prepare(
'INSERT INTO api_anahtarlari (id,email,ad,onek,hash,olusturma) VALUES (?,?,?,?,?,?)'
).run(id, email, ad || 'API Anahtarı', ham.slice(0, 12), sha256(ham), now()));
return { id, ad: ad || 'API Anahtarı', onek: ham.slice(0, 12), anahtar: ham, olusturma: now() };
export function createApiKey(email, ad, { limit = null } = {}) {
if (ad != null && typeof ad !== 'string') throw new Error('Anahtar adı metin olmalı.');
const name = ad?.trim() || 'API Anahtarı';
if (name.length > 120) throw new Error('Anahtar adı en fazla 120 karakter olabilir.');
if (limit !== null && (!Number.isInteger(limit) || limit < 0)) throw new Error('Geçersiz anahtar kotası.');
return withDb((db) => {
db.exec('BEGIN IMMEDIATE');
try {
const count = db.prepare('SELECT COUNT(*) n FROM api_anahtarlari WHERE email=? AND iptal=0').get(email).n;
if (limit !== null && count >= limit) {
const error = new Error(`Planınızda en fazla ${limit} API anahtarı oluşturabilirsiniz. Kullanılmayan bir anahtarı iptal edin veya Planlar sekmesini kontrol edin.`);
error.kod = 'KOTA_ASILDI';
throw error;
}
const ham = 'ih_live_' + crypto.randomBytes(24).toString('base64url');
const id = crypto.randomUUID(), olusturma = now();
db.prepare('INSERT INTO api_anahtarlari (id,email,ad,onek,hash,olusturma) VALUES (?,?,?,?,?,?)')
.run(id, email, name, ham.slice(0, 12), sha256(ham), olusturma);
db.exec('COMMIT');
return { id, ad:name, onek:ham.slice(0,12), anahtar:ham, olusturma };
} catch (error) { db.exec('ROLLBACK'); throw error; }
});
}
export function listApiKeys(email) {