using Microsoft.AspNetCore.Mvc; using MyHomePage.Api.Common; using MyHomePage.Api.Models.Dtos; using MyHomePage.Api.Services; namespace MyHomePage.Api.Controllers; /// /// 360 在线壁纸代理(P34): /// - GET /api/wallpaper/categories 拉全部分类(24h 缓存) /// - GET /api/wallpaper/random 按视口分辨率返回 1 张随机图 /// - POST /api/wallpaper/refresh 立即刷新分类池子并返回 1 张新随机图 /// [ApiController] [Route("api/wallpaper")] public class WallpaperController : ControllerBase { private readonly WallpaperService _wallpaper; private readonly ILogger _logger; public WallpaperController(WallpaperService wallpaper, ILogger logger) { _wallpaper = wallpaper; _logger = logger; } /// 全部分类列表(24h 缓存)。失败返回空集合(前端展示「暂无可用分类」)。 [HttpGet("categories")] public async Task>> GetCategories(CancellationToken ct) { var cats = await _wallpaper.GetCategoriesAsync(ct); return ApiResponse>.Ok(cats); } /// /// 按分类 + 视口分辨率返回 1 张随机壁纸 URL。 /// 查询参数:cid(可空,例 "36")、w(视口宽 px,默认 1920)、h(视口高 px,默认 1080)。 /// [HttpGet("random")] public async Task> GetRandom( [FromQuery] string? cid, [FromQuery] int? w, [FromQuery] int? h, CancellationToken ct) { var (width, height) = SanitizeViewport(w, h); var result = await _wallpaper.GetRandomAsync(cid ?? "", width, height, ct); if (result is null) throw new BusinessException("暂无可用壁纸(分类可能无效或 360 接口暂不可达)", 404); return ApiResponse.Ok(result); } /// /// 立即刷新指定分类的池子(清缓存重新拉 200 张),并立即返回 1 张新随机图。 /// 即主人要求的「立即切换」按钮后端入口。 /// [HttpPost("refresh")] public async Task> Refresh( [FromQuery] string? cid, [FromQuery] int? w, [FromQuery] int? h, CancellationToken ct) { var (width, height) = SanitizeViewport(w, h); var result = await _wallpaper.RefreshAsync(cid ?? "", width, height, ct); if (result is null) throw new BusinessException("暂无可用壁纸(分类可能无效或 360 接口暂不可达)", 404); _logger.LogInformation("Wallpaper manual refresh: cid={Cid} {W}x{H}", cid ?? "", width, height); return ApiResponse.Ok(result); } /// 把客户端上报的 w/h 限制在合理范围(避免异常大数把 360 路径撑爆) private static (int w, int h) SanitizeViewport(int? w, int? h) { // 默认 1920x1080 = PC 桌面 var width = w is > 0 and < 8000 ? w.Value : 1920; var height = h is > 0 and < 8000 ? h.Value : 1080; return (width, height); } }