Matthew Aaron Raymer
2 years ago
12 changed files with 140 additions and 39 deletions
@ -0,0 +1,7 @@ |
|||||
|
/** |
||||
|
* Generic strings that could be used throughout the app. |
||||
|
*/ |
||||
|
export enum AppString { |
||||
|
APP_NAME = "Kickstart for time", |
||||
|
VERSION = "0.1", |
||||
|
} |
@ -0,0 +1,27 @@ |
|||||
|
/** |
||||
|
* Field names used by the tables for the DB objects. |
||||
|
*/ |
||||
|
export enum Field { |
||||
|
// Setting
|
||||
|
KEY = "key", |
||||
|
VALUE = "value", |
||||
|
// Log
|
||||
|
SEVERITY = "severity", |
||||
|
LABEL = "label", |
||||
|
ERROR = "error", |
||||
|
// Accounts
|
||||
|
NAME = "name", |
||||
|
DESCRIPTION = "description", |
||||
|
ID = "id", |
||||
|
IDENTITY = "indentity", |
||||
|
CREATED_TIMESTAMP = "createdTimestamp", |
||||
|
STATUS = "status", |
||||
|
} |
||||
|
|
||||
|
export enum Severity { |
||||
|
DEBUG = "Debug", |
||||
|
INFO = "Info", |
||||
|
WARN = "Warning", |
||||
|
ERROR = "Error", |
||||
|
CRITICAL = "Critical", |
||||
|
} |
@ -0,0 +1,6 @@ |
|||||
|
/** |
||||
|
* Dexie table names used by the DexieWrapper service. |
||||
|
*/ |
||||
|
export enum AppTable { |
||||
|
ACCOUNTS = "Accounts-Table", |
||||
|
} |
@ -1,27 +0,0 @@ |
|||||
import Dexie, { Table } from "dexie"; |
|
||||
import { encrypted } from "@pvermeer/dexie-encrypted-addon"; |
|
||||
|
|
||||
export interface Account { |
|
||||
id?: number; |
|
||||
did: string; |
|
||||
kid: string; |
|
||||
kms: string; |
|
||||
meta: string; |
|
||||
privateKeyHex: string; |
|
||||
publicKeyHex: string; |
|
||||
type: string; |
|
||||
} |
|
||||
|
|
||||
export class AccountsDb extends Dexie { |
|
||||
accounts!: Table<Account>; |
|
||||
|
|
||||
constructor(secret?: string) { |
|
||||
super("KickStartDb"); |
|
||||
encrypted(this, { secretKey: secret }); |
|
||||
this.version(1).stores({ |
|
||||
accounts: "++id, privateKeyHex, publicKeyHex", // Primary key and indexed props
|
|
||||
}); |
|
||||
} |
|
||||
} |
|
||||
|
|
||||
export const db = new AccountsDb(); |
|
@ -0,0 +1,9 @@ |
|||||
|
import type { Field } from "@/constants/model"; |
||||
|
|
||||
|
export interface IDBAccount { |
||||
|
[Field.ID]?: string; |
||||
|
[Field.IDENTITY]: string; |
||||
|
[Field.NAME]: string; |
||||
|
[Field.DESCRIPTION]: string; |
||||
|
[Field.CREATED_TIMESTAMP]: number; |
||||
|
} |
@ -0,0 +1,35 @@ |
|||||
|
import Dexie, { type Table } from "dexie"; |
||||
|
import { encrypted, Encryption } from "@pvermeer/dexie-encrypted-addon"; |
||||
|
|
||||
|
import { AppString } from "@/constants/app"; |
||||
|
import { AppTable } from "../constants/table"; |
||||
|
import { Field } from "@/constants/model"; |
||||
|
import { IDBAccount } from "@/models/Account"; |
||||
|
|
||||
|
export class DexieWrapper extends Dexie { |
||||
|
[AppTable.ACCOUNTS]!: Table<IDBAccount>; |
||||
|
|
||||
|
constructor(name: string, secret: string) { |
||||
|
super(name, { autoOpen: true }); |
||||
|
encrypted(this, { secretKey: secret }); |
||||
|
this.version(1).stores({ |
||||
|
[AppTable.ACCOUNTS]: `#&${Field.ID}, $${Field.IDENTITY}`, |
||||
|
}); |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
const secret = |
||||
|
localStorage.getItem("secret") || Encryption.createRandomEncryptionKey(); |
||||
|
|
||||
|
if (localStorage.getItem("secret") == null) { |
||||
|
localStorage.setItem("secret", secret); |
||||
|
} |
||||
|
|
||||
|
console.log("secret", secret); |
||||
|
/** |
||||
|
* Preconfigured DexieWrapper |
||||
|
*/ |
||||
|
export const dexieWrapper = new DexieWrapper( |
||||
|
`${AppString.APP_NAME} v${AppString.VERSION}`, |
||||
|
secret |
||||
|
); |
@ -0,0 +1,41 @@ |
|||||
|
import type { IndexableType } from "dexie"; |
||||
|
import { AppTable } from "@/constants/table"; |
||||
|
import { Field } from "@/constants/model"; |
||||
|
import { dexieWrapper } from "@/services/DexieWrapper"; |
||||
|
import type { IDBAccount } from "@/models/Account"; |
||||
|
|
||||
|
export default function useDBAccounts() { |
||||
|
/** |
||||
|
* Gets all data from the Logs table. |
||||
|
* @returns IDBAccount[] |
||||
|
*/ |
||||
|
async function getAccountsTable(): Promise<IDBAccount[]> { |
||||
|
return await dexieWrapper.table(AppTable.ACCOUNTS).toArray(); |
||||
|
} |
||||
|
|
||||
|
/** |
||||
|
* Adds an Account to the database. |
||||
|
* @param name |
||||
|
* @param description |
||||
|
* @param identity |
||||
|
* @returns Id of new Account |
||||
|
*/ |
||||
|
async function addAccount( |
||||
|
name: string, |
||||
|
description: string, |
||||
|
identity: string |
||||
|
): Promise<IndexableType> { |
||||
|
const account: IDBAccount = { |
||||
|
[Field.CREATED_TIMESTAMP]: new Date().getTime(), |
||||
|
[Field.NAME]: name, |
||||
|
[Field.DESCRIPTION]: description, |
||||
|
[Field.IDENTITY]: identity, |
||||
|
}; |
||||
|
return await dexieWrapper.table(AppTable.ACCOUNTS).add(account); |
||||
|
} |
||||
|
|
||||
|
return { |
||||
|
getAccountsTable, |
||||
|
addAccount, |
||||
|
}; |
||||
|
} |
Loading…
Reference in new issue