Add segmented GVL reference data maintenance
Dieser Commit ist enthalten in:
@@ -125,6 +125,10 @@ async function handleVendorGetMessage(message, sender) {
|
||||
return handlePurgeUnlockedEvidenceRecordsMessage();
|
||||
}
|
||||
|
||||
if (message.type === "purge_gvl_reference_data") {
|
||||
return handlePurgeGvlReferenceDataMessage();
|
||||
}
|
||||
|
||||
if (message.type === "delete_all_evidence_database") {
|
||||
return handleDeleteAllEvidenceDatabaseMessage();
|
||||
}
|
||||
@@ -1225,6 +1229,12 @@ async function handlePurgeUnlockedEvidenceRecordsMessage() {
|
||||
return purgeUnlockedEvidenceRecords(db);
|
||||
}
|
||||
|
||||
async function handlePurgeGvlReferenceDataMessage() {
|
||||
const db = await openVendorGetDb();
|
||||
|
||||
return purgeGvlReferenceData(db);
|
||||
}
|
||||
|
||||
function handleDeleteAllEvidenceDatabaseMessage() {
|
||||
return deleteVendorGetDatabase();
|
||||
}
|
||||
|
||||
@@ -33,3 +33,16 @@ const VENDORGET_EVIDENCE_STORE_NAMES = [
|
||||
VENDORGET_STORE_NAMES.gvlDataCategories,
|
||||
VENDORGET_STORE_NAMES.gvlVendorRelationships
|
||||
];
|
||||
|
||||
const VENDORGET_GVL_REFERENCE_STORE_NAMES = [
|
||||
VENDORGET_STORE_NAMES.gvlRawEvidence,
|
||||
VENDORGET_STORE_NAMES.gvlSnapshots,
|
||||
VENDORGET_STORE_NAMES.gvlSnapshotEvents,
|
||||
VENDORGET_STORE_NAMES.gvlVendors,
|
||||
VENDORGET_STORE_NAMES.gvlPurposes,
|
||||
VENDORGET_STORE_NAMES.gvlSpecialPurposes,
|
||||
VENDORGET_STORE_NAMES.gvlFeatures,
|
||||
VENDORGET_STORE_NAMES.gvlSpecialFeatures,
|
||||
VENDORGET_STORE_NAMES.gvlDataCategories,
|
||||
VENDORGET_STORE_NAMES.gvlVendorRelationships
|
||||
];
|
||||
|
||||
@@ -89,6 +89,32 @@ async function purgeUnlockedEvidenceRecords(db) {
|
||||
});
|
||||
}
|
||||
|
||||
function purgeGvlReferenceData(db) {
|
||||
return new Promise((resolve, reject) => {
|
||||
const clearedStores = {};
|
||||
const tx = db.transaction(VENDORGET_GVL_REFERENCE_STORE_NAMES, "readwrite");
|
||||
|
||||
tx.onerror = () => reject(tx.error);
|
||||
tx.onabort = () => reject(tx.error);
|
||||
tx.oncomplete = () => {
|
||||
resolve({
|
||||
success: true,
|
||||
clearedStores
|
||||
});
|
||||
};
|
||||
|
||||
for (const storeName of VENDORGET_GVL_REFERENCE_STORE_NAMES) {
|
||||
const objectStore = tx.objectStore(storeName);
|
||||
const countRequest = objectStore.count();
|
||||
|
||||
countRequest.onsuccess = () => {
|
||||
clearedStores[storeName] = countRequest.result;
|
||||
objectStore.clear();
|
||||
};
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
function buildGvlWorkspaceProtectionIndex(db) {
|
||||
return new Promise((resolve, reject) => {
|
||||
const protectedSnapshotSha256 = new Set();
|
||||
|
||||
@@ -27,6 +27,7 @@ body {
|
||||
h1,
|
||||
h2,
|
||||
h3,
|
||||
h4,
|
||||
p {
|
||||
margin: 0;
|
||||
}
|
||||
@@ -47,6 +48,11 @@ h3 {
|
||||
color: #e5edf5;
|
||||
}
|
||||
|
||||
h4 {
|
||||
font-size: 13px;
|
||||
color: #e5edf5;
|
||||
}
|
||||
|
||||
p {
|
||||
max-width: 760px;
|
||||
font-size: 13px;
|
||||
@@ -87,6 +93,15 @@ p {
|
||||
background: #1f2937;
|
||||
}
|
||||
|
||||
.segment-action {
|
||||
display: grid;
|
||||
gap: 8px;
|
||||
padding: 10px;
|
||||
border: 1px solid #475569;
|
||||
border-radius: 4px;
|
||||
background: #172033;
|
||||
}
|
||||
|
||||
.segment-status {
|
||||
width: fit-content;
|
||||
max-width: 100%;
|
||||
@@ -98,6 +113,23 @@ p {
|
||||
background: #172033;
|
||||
}
|
||||
|
||||
button {
|
||||
width: fit-content;
|
||||
max-width: 100%;
|
||||
padding: 8px 10px;
|
||||
border: 1px solid #475569;
|
||||
border-radius: 4px;
|
||||
font: inherit;
|
||||
font-size: 13px;
|
||||
color: #e5edf5;
|
||||
background: #1f2937;
|
||||
}
|
||||
|
||||
button:disabled {
|
||||
cursor: default;
|
||||
opacity: 0.65;
|
||||
}
|
||||
|
||||
.danger-panel {
|
||||
border-bottom: 0;
|
||||
}
|
||||
|
||||
@@ -12,44 +12,55 @@
|
||||
<a class="back-link" href="../dashboard/dashboard.html">Zurück zum Observe-Dashboard</a>
|
||||
<h1>Datenpflege</h1>
|
||||
<p class="section-help">
|
||||
Diese Ansicht bereitet die künftige segmentierte Verwaltung lokaler
|
||||
VG-Observe-Datenbestände vor. Aktuell werden keine Datenoperationen
|
||||
ausgeführt.
|
||||
Lokale Datenbestände verwalten und bereinigen.
|
||||
</p>
|
||||
</header>
|
||||
|
||||
<section class="panel" aria-labelledby="segments-title">
|
||||
<h2 id="segments-title">Geplante Pflegebereiche</h2>
|
||||
<h2 id="segments-title">Datenbereiche</h2>
|
||||
<div class="segment-grid">
|
||||
<article class="segment-card">
|
||||
<h3>GVL-Referenzdaten</h3>
|
||||
<p>
|
||||
Referenzdaten der Browser-Datenbank. Enthält Vendorlisten,
|
||||
Revisionen und zugehörige Referenzbestände.
|
||||
Vendorlisten, Revisionen und GVL-Referenzbestände.
|
||||
</p>
|
||||
<p class="segment-status">
|
||||
Noch keine segmentierte Datenpflege implementiert.
|
||||
<div class="segment-action">
|
||||
<h4>GVL-Referenzdaten bereinigen</h4>
|
||||
<p>
|
||||
Entfernt lokale GVL-Referenzdaten aus der Browser-Datenbank.
|
||||
Consent-Daten, Request-Beobachtungen und Analyse-Daten bleiben
|
||||
unberührt.
|
||||
</p>
|
||||
<button id="purge-gvl-reference-data-button" type="button">
|
||||
GVL-Referenzdaten bereinigen
|
||||
</button>
|
||||
</div>
|
||||
<p
|
||||
id="gvl-reference-maintenance-status"
|
||||
class="segment-status"
|
||||
aria-live="polite"
|
||||
>
|
||||
Bereit.
|
||||
</p>
|
||||
</article>
|
||||
|
||||
<article class="segment-card">
|
||||
<h3>Consent-Daten</h3>
|
||||
<p>
|
||||
Dokumentierte Consent-Zustände und zugehörige Ereignisse.
|
||||
Consent-Zustände und Ereignisse.
|
||||
</p>
|
||||
<p class="segment-status">
|
||||
Noch keine segmentierte Datenpflege implementiert.
|
||||
Noch nicht verfügbar.
|
||||
</p>
|
||||
</article>
|
||||
|
||||
<article class="segment-card">
|
||||
<h3>Analyse-Daten</h3>
|
||||
<p>
|
||||
Vorbereitete Arbeits- und Auswertungsdaten zukünftiger
|
||||
Analysefunktionen.
|
||||
Analyse- und Arbeitsdaten.
|
||||
</p>
|
||||
<p class="segment-status">
|
||||
Noch keine segmentierte Datenpflege implementiert.
|
||||
Noch nicht verfügbar.
|
||||
</p>
|
||||
</article>
|
||||
|
||||
@@ -59,7 +70,7 @@
|
||||
Reserviert für zukünftige Erweiterungen.
|
||||
</p>
|
||||
<p class="segment-status">
|
||||
Noch keine segmentierte Datenpflege implementiert.
|
||||
Noch nicht verfügbar.
|
||||
</p>
|
||||
</article>
|
||||
</div>
|
||||
@@ -68,20 +79,17 @@
|
||||
<section class="panel danger-panel" aria-labelledby="danger-title">
|
||||
<h2 id="danger-title">Gefahrenbereich</h2>
|
||||
<p class="section-help">
|
||||
Hier werden später irreversible Verwaltungsaktionen gebündelt. Diese
|
||||
Aktionen betreffen den lokalen VG-Observe-Datenbestand und erfordern
|
||||
eine ausdrückliche Sicherheitsbestätigung.
|
||||
Irreversible Aktionen für den gesamten lokalen Datenbestand.
|
||||
</p>
|
||||
<article class="danger-action" aria-label="Vorbereitete Gefahrenaktion">
|
||||
<h3>Gesamten lokalen VG-Observe-Datenbestand löschen</h3>
|
||||
<p class="segment-status">Noch nicht implementiert.</p>
|
||||
<h3>Gesamten lokalen Datenbestand löschen</h3>
|
||||
<p class="segment-status">Noch nicht verfügbar.</p>
|
||||
<p>
|
||||
Vor einer späteren Umsetzung muss klar angezeigt werden, welche
|
||||
Datenbereiche betroffen sind. Die Ausführung darf nur nach
|
||||
ausdrücklicher Sicherheitsabfrage erfolgen.
|
||||
Erfordert später eine ausdrückliche Sicherheitsbestätigung.
|
||||
</p>
|
||||
</article>
|
||||
</section>
|
||||
</main>
|
||||
<script src="data-maintenance.js"></script>
|
||||
</body>
|
||||
</html>
|
||||
|
||||
@@ -0,0 +1,69 @@
|
||||
"use strict";
|
||||
|
||||
const purgeGvlReferenceDataButton = document.getElementById(
|
||||
"purge-gvl-reference-data-button"
|
||||
);
|
||||
const gvlReferenceMaintenanceStatus = document.getElementById(
|
||||
"gvl-reference-maintenance-status"
|
||||
);
|
||||
|
||||
document.addEventListener("DOMContentLoaded", () => {
|
||||
purgeGvlReferenceDataButton?.addEventListener("click", async () => {
|
||||
await purgeGvlReferenceData();
|
||||
});
|
||||
});
|
||||
|
||||
async function purgeGvlReferenceData() {
|
||||
if (!confirm(buildGvlReferenceDataPurgeConfirmationText())) {
|
||||
renderGvlReferenceMaintenanceStatus("Abgebrochen.");
|
||||
return;
|
||||
}
|
||||
|
||||
purgeGvlReferenceDataButton.disabled = true;
|
||||
renderGvlReferenceMaintenanceStatus("GVL-Referenzdaten werden bereinigt...");
|
||||
|
||||
try {
|
||||
const result = await browser.runtime.sendMessage({
|
||||
type: "purge_gvl_reference_data"
|
||||
});
|
||||
|
||||
if (!result?.success) {
|
||||
throw new Error(result?.error ?? "purge_gvl_reference_data_failed");
|
||||
}
|
||||
|
||||
renderGvlReferenceMaintenanceStatus(
|
||||
buildGvlReferenceDataPurgeSuccessMessage(result)
|
||||
);
|
||||
} catch (error) {
|
||||
renderGvlReferenceMaintenanceStatus(
|
||||
"GVL-Referenzdaten konnten nicht bereinigt werden."
|
||||
);
|
||||
console.warn("VG-Observe GVL reference data purge failed", error);
|
||||
} finally {
|
||||
purgeGvlReferenceDataButton.disabled = false;
|
||||
}
|
||||
}
|
||||
|
||||
function buildGvlReferenceDataPurgeConfirmationText() {
|
||||
return [
|
||||
"GVL-Referenzdaten bereinigen?",
|
||||
"",
|
||||
"Betroffen: GVL-Referenzdaten der Browser-DB.",
|
||||
"Nicht betroffen: Consent-Daten, Request-Beobachtungen, Analyse-Daten.",
|
||||
"",
|
||||
"Diese Aktion entfernt lokale GVL-Referenzdaten aus der Browser-Datenbank."
|
||||
].join("\n");
|
||||
}
|
||||
|
||||
function buildGvlReferenceDataPurgeSuccessMessage(result) {
|
||||
const clearedCount = Object.values(result.clearedStores ?? {}).reduce(
|
||||
(total, count) => total + Number(count ?? 0),
|
||||
0
|
||||
);
|
||||
|
||||
return `GVL-Referenzdaten bereinigt: ${clearedCount} Records entfernt.`;
|
||||
}
|
||||
|
||||
function renderGvlReferenceMaintenanceStatus(message) {
|
||||
gvlReferenceMaintenanceStatus.textContent = message;
|
||||
}
|
||||
In neuem Issue referenzieren
Einen Benutzer sperren