Add app config schema and shared models

This commit is contained in:
2026-08-12 21:04:15 +02:00
parent 69db1d5558
commit ef037d25fe
3 changed files with 127 additions and 0 deletions

View File

@@ -0,0 +1,53 @@
import { z } from 'zod';
import { loadEnv } from '../../core/config/env';
const boolFromEnv = (defaultValue: 'true' | 'false') =>
z
.string()
.optional()
.default(defaultValue)
.transform((v) => v === 'true');
export const AppConfigSchema = z.object({
JELLYFIN_URL: z.string(),
JELLYFIN_API_KEY: z.string(),
JELLYFIN_USER_ID: z.string(),
TMDB_API_KEY: z.string(),
LLM_ENABLED: boolFromEnv('false'),
LLM_BASE_URL: z.string().default('http://localhost:11434/v1'),
LLM_API_KEY: z.string().optional().default(''),
LLM_MODEL: z.string().default('llama3'),
RADARR_ENABLED: boolFromEnv('false'),
RADARR_URL: z.string().optional().default(''),
RADARR_API_KEY: z.string().optional().default(''),
RADARR_QUALITY_PROFILE_ID: z.coerce.number().default(1),
RADARR_ROOT_FOLDER: z.string().default('/movies'),
CRON_ENABLED: boolFromEnv('false'),
CRON_SCHEDULE: z.string().default('0 3 * * *'),
API_ENABLED: z
.string()
.optional()
.default('true')
.transform((v) => v !== 'false'),
API_PORT: z.coerce.number().default(8080),
SECRET_KEY: z.string().optional().default(''),
RECOMMEND_COUNT: z.coerce.number().default(10),
RECOMMEND_MAX_RETRY: z.coerce.number().default(3),
MIN_RATED_MOVIES: z.coerce.number().default(5),
LANGFUSE_PUBLIC_KEY: z.string(),
LANGFUSE_SECRET_KEY: z.string(),
LANGFUSE_BASE_URL: z.string(),
LANGFUSE_PROMPT_CACHE_ENABLED: boolFromEnv('true'),
});
export type AppConfig = z.infer<typeof AppConfigSchema>;
export function loadAppConfig(source: NodeJS.ProcessEnv = process.env): AppConfig {
return loadEnv(AppConfigSchema, source);
}

29
src/app/models.ts Normal file
View File

@@ -0,0 +1,29 @@
export interface Movie {
name: string;
year: number;
imdbId: string;
tmdbId: string;
genres: string[];
communityRating: number;
isFavorite: boolean;
playCount: number;
}
export interface TMDbMovie {
id: number;
title: string;
year: number;
}
export interface MovieSuggestion {
title: string;
year: number;
reason: string;
}
export interface Recommendation {
title: string;
year: number;
tmdbId: number;
reason: string;
}