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