11import { DateTime } from 'luxon'
22import { BaseModel , column , SnakeCaseNamingStrategy } from '@adonisjs/lucid/orm'
3- import type { KVStoreKey , KVStoreValue } from '../../types/kv_store.js'
3+ import { KV_STORE_SCHEMA , type KVStoreKey , type KVStoreValue } from '../../types/kv_store.js'
4+ import { parseBoolean } from '../utils/misc.js'
45
56/**
67 * Generic key-value store model for storing various settings
@@ -17,7 +18,7 @@ export default class KVStore extends BaseModel {
1718 declare key : KVStoreKey
1819
1920 @column ( )
20- declare value : KVStoreValue
21+ declare value : string | null
2122
2223 @column . dateTime ( { autoCreate : true } )
2324 declare created_at : DateTime
@@ -26,26 +27,25 @@ export default class KVStore extends BaseModel {
2627 declare updated_at : DateTime
2728
2829 /**
29- * Get a setting value by key
30+ * Get a setting value by key, automatically deserializing to the correct type.
3031 */
31- static async getValue ( key : KVStoreKey ) : Promise < KVStoreValue > {
32+ static async getValue < K extends KVStoreKey > ( key : K ) : Promise < KVStoreValue < K > | null > {
3233 const setting = await this . findBy ( 'key' , key )
3334 if ( ! setting || setting . value === undefined || setting . value === null ) {
3435 return null
3536 }
36- if ( typeof setting . value === 'string' ) {
37- return setting . value
38- }
39- return String ( setting . value )
37+ const raw = String ( setting . value )
38+ return ( KV_STORE_SCHEMA [ key ] === 'boolean' ? parseBoolean ( raw ) : raw ) as KVStoreValue < K >
4039 }
4140
4241 /**
43- * Set a setting value by key (creates if not exists)
42+ * Set a setting value by key (creates if not exists), automatically serializing to string.
4443 */
45- static async setValue ( key : KVStoreKey , value : KVStoreValue ) : Promise < KVStore > {
46- const setting = await this . firstOrCreate ( { key } , { key, value } )
47- if ( setting . value !== value ) {
48- setting . value = value
44+ static async setValue < K extends KVStoreKey > ( key : K , value : KVStoreValue < K > ) : Promise < KVStore > {
45+ const serialized = String ( value )
46+ const setting = await this . firstOrCreate ( { key } , { key, value : serialized } )
47+ if ( setting . value !== serialized ) {
48+ setting . value = serialized
4949 await setting . save ( )
5050 }
5151 return setting
0 commit comments