using DRS9.Dashboard.Application.DTOs;
using DRS9.Dashboard.Application.Services;
using Microsoft.AspNetCore.Mvc;
namespace DRS9.Dashboard.Server.Controllers;
///
/// 轮播显示控制器 - 供设备客户端使用
///
[Route("rotator")]
public class RotatorViewerController : Controller
{
private readonly RotatorItemService _rotatorItemService;
private readonly IHttpContextAccessor _httpContextAccessor;
private readonly ILogger _logger;
public RotatorViewerController(
RotatorItemService rotatorItemService,
IHttpContextAccessor httpContextAccessor,
ILogger logger)
{
_rotatorItemService = rotatorItemService;
_httpContextAccessor = httpContextAccessor;
_logger = logger;
}
///
/// 获取指定应用的轮播配置 (JSON)
///
[HttpGet("{applicationId}/config.json")]
public async Task GetConfig(int applicationId)
{
try
{
var items = await _rotatorItemService.GetByApplicationIdAsync(applicationId);
// 只返回启用的项目
var enabledItems = items.Where(i => i.IsEnabled).OrderBy(i => i.Order).ToList();
var config = new
{
urls = enabledItems.Select(i => GetAbsoluteUrl(i.Url)).ToList(),
switchIntervals = enabledItems.Select(i => i.Duration).ToList()
};
return Json(config);
}
catch (Exception ex)
{
_logger.LogError(ex, "获取轮播配置失败: ApplicationId={ApplicationId}", applicationId);
return Json(new { urls = new List(), switchIntervals = new List() });
}
}
///
/// 显示轮播页面
///
[HttpGet("{applicationId}")]
public IActionResult ViewRotator(int applicationId)
{
return View(applicationId);
}
private string GetAbsoluteUrl(string relativeOrAbsoluteUrl)
{
if (string.IsNullOrWhiteSpace(relativeOrAbsoluteUrl))
return string.Empty;
// 如果已经是绝对 URL,直接返回
if (relativeOrAbsoluteUrl.StartsWith("http://", StringComparison.OrdinalIgnoreCase) ||
relativeOrAbsoluteUrl.StartsWith("https://", StringComparison.OrdinalIgnoreCase))
{
return relativeOrAbsoluteUrl;
}
// 转换为绝对 URL
var request = _httpContextAccessor.HttpContext?.Request;
if (request != null)
{
var baseUrl = $"{request.Scheme}://{request.Host}";
return relativeOrAbsoluteUrl.StartsWith("/") ? baseUrl + relativeOrAbsoluteUrl : baseUrl + "/" + relativeOrAbsoluteUrl;
}
return relativeOrAbsoluteUrl;
}
}