private async Task <SyncResponseViewModel> GetChanges(IApplication app, SyncRequestViewModel request) { var response = new SyncResponseViewModel() { Groups = new List <SyncResponseViewModel.GroupViewModel>() }; if (request.Groups != null) { foreach (var group in request.Groups) { List <IChange> results = await ChangeRepository.ListChangesAsync(app.Id, group.Group, group.Tidemark); if (results != null && results.Any()) { response.Groups.Add(new SyncResponseViewModel.GroupViewModel() { Group = group.Group, Tidemark = results.Last().Id, Changes = results.Select(r => new SyncResponseViewModel.ChangeViewModel() { Modified = r.ClientModified, Value = r.RecordValue, Entity = r.Entity, RecordId = r.RecordId, Property = r.Property }).ToList() }); } } } return(response); }
private async Task <SyncResponseViewModel> GetChanges(Application app, Device device, SyncRequestViewModel request) { var response = new SyncResponseViewModel() { Groups = new List <SyncResponseViewModel.GroupViewModel>() }; Stopwatch sw = new Stopwatch(); sw.Start(); if (request.Groups != null) { foreach (var group in request.Groups) { sw.Restart(); string partition = $"{app.Id}-{group.Group}"; var queryParams = new List <object>(); string whereClause = null; if (!string.IsNullOrWhiteSpace(group.Tidemark)) { Logger.LogInformation($"Getting changes for group: {group.Group} after tidemark: {group.Tidemark}"); queryParams.Add(group.Tidemark); whereClause = "tidemark > ?"; } else { Logger.LogInformation($"Getting all changes for group: {group.Group}"); } List <Change> results = await ScaleContext.Query <Change>(partition, "change", whereClause, queryParams, orderBy : "tidemark", limit : 50); Logger.LogInformation($"Retrieved changes from database in {sw.ElapsedMilliseconds}ms count: {results.Count}"); if (results != null && results.Any()) { response.Groups.Add(new SyncResponseViewModel.GroupViewModel() { Group = group.Group, Tidemark = results.Last().Tidemark, Changes = results.Select(r => new SyncResponseViewModel.ChangeViewModel() { Modified = r.Modified, Value = r.Value, Path = r.Path }).ToList() }); } } } sw.Stop(); return(response); }
public async Task <JsonResult> Post([FromBody] SyncRequestViewModel request) { requestStartTimeUTC = DateTime.UtcNow; var response = new SyncResponseViewModel(); try { Stopwatch sw = new Stopwatch(); sw.Start(); var app = await ValidateApplication(request); Logger.LogInformation($"ValidateApplication in {sw.ElapsedMilliseconds}ms"); if (!ModelState.IsValid) { return(JsonResultWithValidationErrors(response)); } sw.Restart(); var device = await ValidateDevice(request); Logger.LogInformation($"ValidateDevice in {sw.ElapsedMilliseconds}ms"); if (!ModelState.IsValid) { return(JsonResultWithValidationErrors(response)); } sw.Restart(); await ProcessChanges(app, device, request); Logger.LogInformation($"ProcessChanges in {sw.ElapsedMilliseconds}ms"); sw.Restart(); response = await GetChanges(app, device, request); Logger.LogInformation($"GetChanges in {sw.ElapsedMilliseconds}ms"); sw.Stop(); } catch (Exception ex) { Logger.LogError($"Failed to complete Sync Post: {ex.ToString()}"); ModelState.AddModelError("", $"Unhandled exception: {ex.ToString()}"); } return(JsonResultWithValidationErrors(response)); }