using MiaoJiZhang.Infrastructure.Persistence; using Microsoft.AspNetCore.Mvc; using Microsoft.EntityFrameworkCore; namespace MiaoJiZhang.Api.Controllers; /// 公开配置:前端拉取品牌信息、可用形象/性格列表(无需管理员权限) [ApiController] [Route("api/public")] public class PublicConfigController(AppDbContext db) : ControllerBase { /// 品牌配置(App 名称、Slogan、Logo) [HttpGet("brand")] public async Task Brand() { var configs = await db.AppConfigs .Where(c => c.Key.StartsWith("brand.") || c.Key.StartsWith("feature.")) .ToDictionaryAsync(c => c.Key, c => c.Value); bool Enabled(string key) => !configs.TryGetValue(key, out var value) || !value.Equals("false", StringComparison.OrdinalIgnoreCase); return Ok(new { appName = configs.GetValueOrDefault("brand.app_name", "记之"), slogan = configs.GetValueOrDefault("brand.slogan", ""), logoUrl = configs.GetValueOrDefault("brand.logo_url", ""), features = new { voice = Enabled("feature.voice_enabled"), image = Enabled("feature.ocr_enabled"), screenshot = Enabled("feature.screenshot_bookkeeping_enabled"), stickers = Enabled("feature.sticker_enabled"), aiAutoBook = Enabled("feature.ai_auto_book"), }, }); } /// 可用的 AI 形象列表(按 Key 排序) [HttpGet("avatars")] public async Task Avatars() => Ok(await db.AiAvatars.Where(a => a.IsEnabled).OrderBy(a => a.Key) .Select(a => new { a.Key, a.DefaultName, a.SpeechTic, a.ImageUrl }).ToListAsync()); /// 可用的 AI 性格列表(按 Key 排序) [HttpGet("personas")] public async Task Personas() => Ok(await db.AiPersonas.Where(p => p.IsEnabled).OrderBy(p => p.Key) .Select(p => new { p.Key, p.Name, p.Description, p.SampleLine }).ToListAsync()); }