fix: reject stale company profile and filter updates

This commit is contained in:
2026-09-06 13:58:25 +03:00
parent ae32382ffa
commit 9d3acac59d
8 changed files with 92 additions and 25 deletions
+26 -13
View File
@@ -202,24 +202,37 @@ export function getData(email, anahtar) {
});
}
export function getAllData(email) {
return withDb((db) => {
const rows = db.prepare('SELECT anahtar, deger FROM kullanici_verisi WHERE email=?').all(email);
const out = {};
for (const r of rows) {
try { out[r.anahtar] = JSON.parse(r.deger); } catch { /* bozuk kayıt atlanır */ }
const dataRevision = raw => raw == null ? null : crypto.createHash('sha256').update(raw).digest('hex');
export function getDataSnapshot(email) {
return withDb(db=>{
const rows=db.prepare('SELECT anahtar,deger FROM kullanici_verisi WHERE email=?').all(email);
const veri={},revisions={};
for(const row of rows){
revisions[row.anahtar]=dataRevision(row.deger);
try{veri[row.anahtar]=JSON.parse(row.deger);}catch{/* invalid data remains absent */}
}
return out;
}, {});
return {veri,revisions};
},{veri:{},revisions:{}});
}
export function getAllData(email) { return getDataSnapshot(email).veri; }
export function setData(email, anahtar, deger) {
export function setData(email, anahtar, deger, expectedRevision=undefined) {
if (!IZINLI_ANAHTARLAR.has(anahtar)) throw new Error(`Bilinmeyen veri anahtarı: ${anahtar}`);
return withDb((db) => {
db.prepare(`INSERT INTO kullanici_verisi (email, anahtar, deger, guncelleme) VALUES (?,?,?,?)
ON CONFLICT(email, anahtar) DO UPDATE SET deger=excluded.deger, guncelleme=excluded.guncelleme`)
.run(email, anahtar, JSON.stringify(deger ?? null), now());
return true;
db.exec('BEGIN IMMEDIATE');
try {
const old=db.prepare('SELECT deger FROM kullanici_verisi WHERE email=? AND anahtar=?').get(email,anahtar);
if(expectedRevision!==undefined && expectedRevision!==dataRevision(old?.deger)) {
const error=new Error('Bu kayıt başka bir sekmede veya cihazda değişti. Değişikliklerinizi bir yere kopyalayıp sayfayı yenileyin; güncel kayıt üzerinde tekrar düzenleyin.');
error.kod='VERSION_CONFLICT';throw error;
}
const raw=JSON.stringify(deger ?? null);
db.prepare(`INSERT INTO kullanici_verisi (email, anahtar, deger, guncelleme) VALUES (?,?,?,?)
ON CONFLICT(email, anahtar) DO UPDATE SET deger=excluded.deger, guncelleme=excluded.guncelleme`)
.run(email, anahtar, raw, now());
db.exec('COMMIT');
return expectedRevision===undefined ? true : dataRevision(raw);
} catch(error) {db.exec('ROLLBACK');throw error;}
}, false);
}