parent
07c88d9164
commit
b7755949c8
@ -0,0 +1,204 @@
|
||||
// IndexedDB Funktionen
|
||||
const dbName = 'myDB';
|
||||
const dbVersion = 1;
|
||||
let db;
|
||||
|
||||
// IndexedDB initialisieren
|
||||
function initDB() {
|
||||
return new Promise((resolve, reject) => {
|
||||
const request = indexedDB.open(dbName, dbVersion);
|
||||
|
||||
request.onupgradeneeded = function (event) {
|
||||
db = event.target.result;
|
||||
const store = db.createObjectStore('hours', {
|
||||
keyPath: 'id',
|
||||
autoIncrement: true,
|
||||
});
|
||||
|
||||
// Spalten definieren
|
||||
store.createIndex('createdate', 'createdate', { unique: false });
|
||||
store.createIndex('date', 'date', { unique: false });
|
||||
store.createIndex('duration', 'duration', { unique: false });
|
||||
store.createIndex('type', 'type', { unique: false });
|
||||
store.createIndex('status', 'status', { unique: false });
|
||||
store.createIndex('sondertext', 'sondertext', { unique: false });
|
||||
};
|
||||
|
||||
request.onsuccess = function (event) {
|
||||
db = event.target.result;
|
||||
resolve(db);
|
||||
};
|
||||
|
||||
request.onerror = function (event) {
|
||||
console.error('IndexedDB Fehler:', event.target.errorCode);
|
||||
reject(event.target.errorCode);
|
||||
};
|
||||
});
|
||||
}
|
||||
|
||||
// Neuer Eintrag in die IndexedDB
|
||||
function addEntry(data) {
|
||||
return new Promise((resolve, reject) => {
|
||||
const transaction = db.transaction(['hours'], 'readwrite');
|
||||
const store = transaction.objectStore('hours');
|
||||
|
||||
data.createdate = new Date();
|
||||
const request = store.add(data);
|
||||
|
||||
request.onsuccess = function () {
|
||||
resolve(request.result);
|
||||
};
|
||||
|
||||
request.onerror = function (event) {
|
||||
reject('Fehler beim Hinzufügen des Eintrags:', event.target.error);
|
||||
};
|
||||
});
|
||||
}
|
||||
|
||||
// Eintrag aktualisieren
|
||||
function updateEntry(id, updatedData) {
|
||||
return new Promise((resolve, reject) => {
|
||||
const transaction = db.transaction(['hours'], 'readwrite');
|
||||
const store = transaction.objectStore('hours');
|
||||
|
||||
const getRequest = store.get(id);
|
||||
|
||||
getRequest.onsuccess = function (event) {
|
||||
const data = event.target.result;
|
||||
Object.assign(data, updatedData);
|
||||
data.createdate = new Date(); // Aktualisiere das Änderungsdatum
|
||||
|
||||
const updateRequest = store.put(data);
|
||||
|
||||
updateRequest.onsuccess = function () {
|
||||
resolve(data);
|
||||
};
|
||||
|
||||
updateRequest.onerror = function (event) {
|
||||
reject('Fehler beim Aktualisieren des Eintrags:', event.target.error);
|
||||
};
|
||||
};
|
||||
|
||||
getRequest.onerror = function (event) {
|
||||
reject('Fehler beim Abrufen des Eintrags:', event.target.error);
|
||||
};
|
||||
});
|
||||
}
|
||||
|
||||
// Eintrag löschen
|
||||
function deleteEntry(id) {
|
||||
return new Promise((resolve, reject) => {
|
||||
const transaction = db.transaction(['hours'], 'readwrite');
|
||||
const store = transaction.objectStore('hours');
|
||||
|
||||
const request = store.delete(id);
|
||||
|
||||
request.onsuccess = function () {
|
||||
resolve(`Eintrag mit ID ${id} gelöscht.`);
|
||||
};
|
||||
|
||||
request.onerror = function (event) {
|
||||
reject('Fehler beim Löschen des Eintrags:', event.target.error);
|
||||
};
|
||||
});
|
||||
}
|
||||
|
||||
// Einträge abrufen
|
||||
function getAllEntries() {
|
||||
return new Promise((resolve, reject) => {
|
||||
const transaction = db.transaction(['hours'], 'readonly');
|
||||
const store = transaction.objectStore('hours');
|
||||
|
||||
const request = store.getAll();
|
||||
|
||||
request.onsuccess = function () {
|
||||
resolve(request.result);
|
||||
};
|
||||
|
||||
request.onerror = function (event) {
|
||||
reject('Fehler beim Abrufen der Einträge:', event.target.error);
|
||||
};
|
||||
});
|
||||
}
|
||||
|
||||
// Einträge nach Monat und/oder Jahr filtern
|
||||
function filterEntriesByMonthYear(month, year) {
|
||||
return new Promise((resolve, reject) => {
|
||||
const transaction = db.transaction(['hours'], 'readonly');
|
||||
const store = transaction.objectStore('hours');
|
||||
|
||||
const request = store.getAll();
|
||||
|
||||
request.onsuccess = function () {
|
||||
const allEntries = request.result;
|
||||
|
||||
// Filter nach Monat und Jahr
|
||||
const filteredEntries = allEntries.filter(entry => {
|
||||
const entryDate = new Date(entry.date); // Konvertiere das date-Feld in ein Date-Objekt
|
||||
|
||||
const matchesMonth = month ? entryDate.getMonth() + 1 === month : true; // +1 da getMonth() 0-basiert ist
|
||||
const matchesYear = year ? entryDate.getFullYear() === year : true;
|
||||
|
||||
return matchesMonth && matchesYear;
|
||||
});
|
||||
|
||||
resolve(filteredEntries);
|
||||
};
|
||||
|
||||
request.onerror = function (event) {
|
||||
reject('Fehler beim Abrufen der Einträge:', event.target.error);
|
||||
};
|
||||
});
|
||||
}
|
||||
|
||||
// Neuen Eintrag verschlüsselt speichern
|
||||
async function addEncryptedEntry(data) {
|
||||
const key = await generateKey();
|
||||
const { iv, encryptedData } = await encryptData(key, JSON.stringify(data));
|
||||
|
||||
return new Promise((resolve, reject) => {
|
||||
const transaction = db.transaction(['hours'], 'readwrite');
|
||||
const store = transaction.objectStore('hours');
|
||||
|
||||
const request = store.add({
|
||||
iv: Array.from(iv), // IV muss auch gespeichert werden
|
||||
encryptedData: Array.from(new Uint8Array(encryptedData)), // Encrypted data als Uint8Array speichern
|
||||
});
|
||||
|
||||
request.onsuccess = function () {
|
||||
resolve(request.result);
|
||||
};
|
||||
|
||||
request.onerror = function (event) {
|
||||
reject('Fehler beim Hinzufügen des verschlüsselten Eintrags:', event.target.error);
|
||||
};
|
||||
});
|
||||
}
|
||||
|
||||
// Verschlüsselten Eintrag entschlüsseln
|
||||
async function getDecryptedEntry(id) {
|
||||
const key = await generateKey();
|
||||
|
||||
return new Promise((resolve, reject) => {
|
||||
const transaction = db.transaction(['hours'], 'readonly');
|
||||
const store = transaction.objectStore('hours');
|
||||
|
||||
const request = store.get(id);
|
||||
|
||||
request.onsuccess = async function () {
|
||||
const entry = request.result;
|
||||
if (entry) {
|
||||
const iv = new Uint8Array(entry.iv);
|
||||
const encryptedData = new Uint8Array(entry.encryptedData);
|
||||
const decryptedData = await decryptData(key, iv, encryptedData);
|
||||
resolve(JSON.parse(decryptedData));
|
||||
} else {
|
||||
reject('Eintrag nicht gefunden');
|
||||
}
|
||||
};
|
||||
|
||||
request.onerror = function (event) {
|
||||
reject('Fehler beim Abrufen des verschlüsselten Eintrags:', event.target.error);
|
||||
};
|
||||
});
|
||||
}
|
||||
Loading…
Reference in new issue