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