using Microsoft.AspNetCore.Mvc;
using MyHomePage.Api.Common;
using MyHomePage.Api.Models.Dtos;
using MyHomePage.Api.Services;
namespace MyHomePage.Api.Controllers;
/// 多端同步:拉取增量变更 + 全量快照。
[ApiController]
[Route("api/sync")]
public class SyncController : ControllerBase
{
private readonly ISyncService _service;
private readonly ILogger _logger;
public SyncController(ISyncService service, ILogger logger)
{
_service = service;
_logger = logger;
}
///
/// 拉取自 之后的变更。
/// 为空或解析失败时返回全量(P34.2 防御:避免前端传 ?since=undefined 触发 400)。
///
[HttpGet("changes")]
public async Task> Changes([FromQuery] string? since)
{
DateTime? sinceDt = null;
if (!string.IsNullOrWhiteSpace(since))
{
// 严格解析(RoundtripKind 接受 ISO8601 字符串);失败则降级为全量
if (DateTime.TryParse(since, System.Globalization.CultureInfo.InvariantCulture,
System.Globalization.DateTimeStyles.RoundtripKind, out var parsed))
{
sinceDt = parsed;
}
else
{
_logger.LogWarning("Sync changes received unparseable since={Since}, fallback to full snapshot", since);
}
}
return ApiResponse.Ok(await _service.GetChangesAsync(sinceDt));
}
}