2024-05-19 22:29:15 +02:00
import SuperJSON from "superjson" ;
import { eq } from "@homarr/db" ;
import { serverSettings } from "@homarr/db/schema/sqlite" ;
2024-05-26 17:18:25 +02:00
import { logger } from "@homarr/log" ;
import type { defaultServerSettings , ServerSettings } from "@homarr/server-settings" ;
2024-05-19 22:29:15 +02:00
import { defaultServerSettingsKeys } from "@homarr/server-settings" ;
import { z } from "@homarr/validation" ;
2024-05-26 17:18:25 +02:00
import { createTRPCRouter , protectedProcedure , publicProcedure } from "../trpc" ;
2024-05-19 22:29:15 +02:00
export const serverSettingsRouter = createTRPCRouter ( {
2024-05-26 17:18:25 +02:00
// this must be public so anonymous users also get analytics
getAnalytics : publicProcedure.query ( async ( { ctx } ) = > {
const setting = await ctx . db . query . serverSettings . findFirst ( {
where : eq ( serverSettings . settingKey , "analytics" ) ,
} ) ;
if ( ! setting ) {
logger . info (
"Server settings for analytics is currently undefined. Using default values instead. If this persists, there may be an issue with the server settings" ,
) ;
return {
enableGeneral : true ,
enableIntegrationData : false ,
enableUserData : false ,
enableWidgetData : false ,
} as ( typeof defaultServerSettings ) [ "analytics" ] ;
}
return SuperJSON . parse < ( typeof defaultServerSettings ) [ "analytics" ] > ( setting . value ) ;
} ) ,
2024-05-19 22:29:15 +02:00
getAll : protectedProcedure.query ( async ( { ctx } ) = > {
const settings = await ctx . db . query . serverSettings . findMany ( ) ;
const data = { } as ServerSettings ;
defaultServerSettingsKeys . forEach ( ( key ) = > {
2024-05-19 22:38:39 +02:00
const settingValue = settings . find ( ( setting ) = > setting . settingKey === key ) ? . value ;
2024-05-19 22:29:15 +02:00
if ( ! settingValue ) {
return ;
}
data [ key ] = SuperJSON . parse ( settingValue ) ;
} ) ;
return data ;
} ) ,
saveSettings : protectedProcedure
. input (
z . object ( {
settingsKey : z.enum ( defaultServerSettingsKeys ) ,
value : z.record ( z . string ( ) , z . unknown ( ) ) ,
} ) ,
)
. mutation ( async ( { ctx , input } ) = > {
const databaseRunResult = await ctx . db
. update ( serverSettings )
. set ( {
value : SuperJSON.stringify ( input . value ) ,
} )
. where ( eq ( serverSettings . settingKey , input . settingsKey ) ) ;
return databaseRunResult . changes === 1 ;
} ) ,
} ) ;