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<string, PageDef> PagesById()
|
{
|
var cfg = _cfg.LoadPagesConfig();
|
var map = new Dictionary<string, PageDef>(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<UserScenario>() };
|
}
|
}
|
|
private static string NewScenarioId()
|
=> $"u_{DateTimeOffset.UtcNow.ToUnixTimeMilliseconds()}_{Guid.NewGuid().ToString("N")[..8]}";
|
|
public List<UserScenario> ListUserScenarios(string username)
|
{
|
var cfg = _cfg.LoadUserScenariosConfig();
|
return cfg.Users.TryGetValue(username, out var u) ? (u.Scenarios ?? new List<UserScenario>()) : new List<UserScenario>();
|
}
|
|
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<ScenarioPageRef> 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);
|
}
|
}
|
|