Exemple #1
0
        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);
        }
Exemple #2
0
        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);
        }
Exemple #3
0
        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));
        }