using Microsoft.AspNetCore.Mvc; using Server.WatchBody.Web.Dto; using Server.WatchBody.Web.Services; namespace Server.WatchBody.Web.Controllers; /// POST /api/v1/sync — приём пакета телефона (spec 03-sync-post). public class SyncController : Controller { private readonly SyncService _sync; public SyncController(SyncService sync) => _sync = sync; public ActionResult Sync() { int athleteId; try { athleteId = AthleteId(); } catch (InvalidOperationException) { return Error(401, "unauthorized"); } List items; try { using var reader = new StreamReader(Request.Body); items = SyncItemParser.Parse(reader.ReadToEndAsync().Result); } catch (SyncException e) { return Error(e.StatusCode, e.Message); } try { var accepted = _sync.Process(athleteId, items); return new JsonResult(new SyncResponse { Accepted = accepted }); } catch (SyncException e) { return Error(e.StatusCode, e.Code); } catch (Exception e) { // сбой БД внутри пакета: откат (TransactionScope) + 400, текст — в лог Console.Error.WriteLine($"sync error: {e}"); return Error(400, "sync_failed: " + e.Message); } } private int AthleteId() => (int)HttpContext.Items[Middleware.ApiKeyMiddleware.AthleteIdItem]!; private ActionResult Error(int statusCode, string message) { Response.StatusCode = statusCode; return new JsonResult(new ErrorResponse { Error = message }); } }