using BoardApp.Config; namespace BoardApp.Services; public sealed class UserScenarioService { public const int StaytimeMin = 5; public const int StaytimeMax = 86400; private readonly BoardConfigLoader _cfg; public UserScenarioService(BoardConfigLoader cfg) { _cfg = cfg; } private static bool IsValidStaytime(int n) => n >= StaytimeMin && n <= StaytimeMax; private Dictionary PagesById() { var cfg = _cfg.LoadPagesConfig(); var map = new Dictionary(StringComparer.Ordinal); foreach (var p in cfg.Pages) { map[p.Id] = p; } return map; } private static void EnsureUser(UserScenariosConfig cfg, string username) { if (!cfg.Users.ContainsKey(username)) { cfg.Users[username] = new UserScenariosUser { Scenarios = new List() }; } } private static string NewScenarioId() => $"u_{DateTimeOffset.UtcNow.ToUnixTimeMilliseconds()}_{Guid.NewGuid().ToString("N")[..8]}"; public List ListUserScenarios(string username) { var cfg = _cfg.LoadUserScenariosConfig(); return cfg.Users.TryGetValue(username, out var u) ? (u.Scenarios ?? new List()) : new List(); } public (bool Ok, string? Error) DeleteUserScenario(string username, string scenarioId) { var cfg = _cfg.LoadUserScenariosConfig(); EnsureUser(cfg, username); var before = cfg.Users[username].Scenarios.Count; cfg.Users[username].Scenarios = cfg.Users[username].Scenarios .Where(s => !string.Equals(s.Id, scenarioId, StringComparison.Ordinal)) .ToList(); if (cfg.Users[username].Scenarios.Count == before) { return (false, "未找到该场景"); } _cfg.WriteUserScenariosConfig(cfg); return (true, null); } public (bool Ok, UserScenario? Scenario, string? Error) CreateUserScenario( string username, string name, List pageRefs) { var nm = (name ?? "").Trim(); if (nm.Length == 0) return (false, null, "场景名称不能为空"); if (pageRefs is null || pageRefs.Count == 0) return (false, null, "至少选择 1 个 page"); var pages = PagesById(); foreach (var r in pageRefs) { if (r is null || string.IsNullOrWhiteSpace(r.PageId) || !pages.ContainsKey(r.PageId)) { return (false, null, $"pageId 不存在:{r?.PageId ?? ""}"); } if (!IsValidStaytime(r.Staytime)) { return (false, null, $"停留时间须为 {StaytimeMin}~{StaytimeMax} 的整数(秒)"); } } var cfg = _cfg.LoadUserScenariosConfig(); EnsureUser(cfg, username); var exists = cfg.Users[username].Scenarios.Any(s => string.Equals(s.Name, nm, StringComparison.Ordinal)); if (exists) return (false, null, "该用户下已存在同名场景"); var firstPage = pages[pageRefs[0].PageId]; var scenario = new UserScenario { Id = NewScenarioId(), Name = nm, Image = firstPage.Image ?? "", Pages = pageRefs, CreatedAtMs = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds() }; cfg.Users[username].Scenarios.Insert(0, scenario); _cfg.WriteUserScenariosConfig(cfg); return (true, scenario, null); } }