public async Task <SyncPostResponse> SyncAsync([FromBody] SyncPostRequest request)
    {
        using var tracing = Tracing.Trace($"{nameof(SyncController)}.{nameof(SyncAsync)}");

        if (request is null ||
            (request.NumWorkouts <= 0 && (!request.WorkoutIds?.Any() ?? true)))
        {
            throw new HttpRequestException("Either NumWorkouts or WorkoutIds must be set", null, System.Net.HttpStatusCode.UnprocessableEntity);
        }

        SyncResult syncResult = new();

        if (request.NumWorkouts > 0)
        {
            syncResult = await _syncService.SyncAsync(request.NumWorkouts);
        }
        else
        {
            syncResult = await _syncService.SyncAsync(request.WorkoutIds, exclude : null);
        }

        return(new SyncPostResponse()
        {
            SyncSuccess = syncResult.SyncSuccess,
            PelotonDownloadSuccess = syncResult.PelotonDownloadSuccess,
            ConverToFitSuccess = syncResult.ConversionSuccess,
            UploadToGarminSuccess = syncResult.UploadToGarminSuccess,
            Errors = syncResult.Errors.Select(e => new Contracts.ErrorResponse(e)).ToList()
        });
    }
 public Task <SyncPostResponse> SyncPostAsync(SyncPostRequest syncPostRequest)
 {
     return($"{_apiUrl}/api/sync"
            .PostJsonAsync(syncPostRequest)
            .ReceiveJson <SyncPostResponse>());
 }