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)); } }