billibox-vue/src/indexdDB/index.ts

157 lines
4.5 KiB
TypeScript

export default class BilliDB {
private DB_VERSION: number;
private DB_NAME: string;
constructor(dbName:string, dbVersion:number) {
this.DB_NAME = dbName;
this.DB_VERSION = dbVersion;
}
async getDb():Promise<IDBOpenDBRequest> {
return new Promise((resolve, reject) => {
const request = window.indexedDB.open(this.DB_NAME, this.DB_VERSION);
request.onerror = e => {
console.log("Error opening db", e);
reject("Error");
}
request.onsuccess =e => {
console.log("connect erfolgreich");
// @ts-ignore
resolve(e.target.result)
}
request.onupgradeneeded = e => {
console.log("onupgradeneeded");
// @ts-ignore
const db = e.target.result;
db.createObjectStore("inventory", {autoIncrement: false, keyPath: 'id'});
db.createObjectStore("sets", {autoIncrement: false, keyPath: 'id'});
db.createObjectStore("conditions", {autoIncrement: false, keyPath: 'key'});
db.createObjectStore("buildtypes", {autoIncrement: false, keyPath: 'key'});
db.createObjectStore("mounts", {autoIncrement: false, keyPath: 'key'});
db.createObjectStore("brands", {autoIncrement: false, keyPath: 'key'});
db.createObjectStore("manufacturers", {autoIncrement: false, keyPath: 'key'});
db.createObjectStore("medias", {autoIncrement: false, keyPath: 'key'});
}
})
}
async saveItem(item, storeId:string) {
const db = await this.getDb();
return new Promise((resolve, reject) => {
console.log("Starting Add Transaction");
// @ts-ignore
const trans = db.transaction([storeId], 'readwrite');
trans.oncomplete = (e) => {
resolve(e);
};
trans.onerror = (e) => {
console.log("on Error", e)
reject(e);
};
const store = trans.objectStore(storeId);
store.add(item);
store.onerror = (e) => {
console.log("Error on Store", e)
}
store.oncomplete = (e) => {
console.log("oncomplete on Store", e)
}
store.onsuccess = (e) => {
console.log("onsuccess on Store", e)
}
})
}
async saveItems(items, storeId:string) {
const db = await this.getDb();
return new Promise((resolve, reject) => {
console.log("Starting Add Transaction");
// @ts-ignore
const trans = db.transaction([storeId], 'readwrite');
trans.oncomplete = (e) => {
resolve(e);
};
trans.onerror = (e) => {
console.log("on Error", e)
reject(e);
};
const store = trans.objectStore(storeId);
items.forEach((item) => {
store.add(item);
})
store.onerror = (e) => {
console.log("Error on Store", e)
}
store.oncomplete = (e) => {
console.log("oncomplete on Store", e)
}
store.onsuccess = (e) => {
console.log("onsuccess on Store", e)
}
})
}
async getItems(storeId:string) {
const db = await this.getDb();
return new Promise((resolve, reject) => {
const items = [];
// @ts-ignore
const trans = db.transaction([storeId], 'readonly');
trans.oncomplete = (e) => {
console.log(`${storeId}: oncomplete`, items.length)
resolve(items);
};
trans.onerror = (e) => {
console.log("on Error", e)
reject(e);
};
const store = trans.objectStore(storeId);
store.openCursor().onsuccess = (e) => {
const cursor = e.target.result;
if(cursor) {
items.push(cursor.value);
cursor.continue();
}
}
store.onerror = (e) => {
console.log("Error on getAll", e)
}
store.oncomplete = (e) => {
console.log("oncomplete on getAll", e)
}
})
}
}