Пример #1
0
        private async Task ProcessChanges(IApplication app, SyncRequestViewModel request)
        {
            if (request.Changes != null && request.Changes.Any())
            {
                var dbChanges = new List <IChange>();

                Stopwatch sw = new Stopwatch();
                sw.Start();

                // Dedup any changes with the same Record, Entity and Property
                var uniqueChanges = new Dictionary <string, SyncRequestViewModel.ChangeViewModel>();
                foreach (var change in request.Changes)
                {
                    string key = $"{change.RecordId}-{change.Entity}-{change.Property}";
                    if (uniqueChanges.TryGetValue(key, out var existingChange))
                    {
                        if (change.MillisecondsAgo < existingChange.MillisecondsAgo)
                        {
                            uniqueChanges[key] = change;
                        }
                    }
                    else
                    {
                        uniqueChanges.Add(key, change);
                    }
                }


                Logger.LogInformation($"Deduped changes in {sw.ElapsedMilliseconds}ms count: {dbChanges.Count}");
                sw.Restart();

                foreach (var change in uniqueChanges.Values)
                {
                    if (change != null)
                    {
                        DateTime modifiedUTC = requestStartTimeUTC.AddMilliseconds(-change.MillisecondsAgo);

                        var dbChange = ChangeRepository.CreateChange(app.AccountId, app.Id, change.RecordId, change.Group, change.Entity, change.Property, modifiedUTC.Ticks, change.Value);
                        dbChanges.Add(dbChange);
                    }
                }

                Logger.LogInformation($"Generated changes in {sw.ElapsedMilliseconds}ms count: {dbChanges.Count}");
                sw.Restart();

                if (dbChanges.Any())
                {
                    sw.Restart();

                    await ChangeRepository.UpsertChangesAsync(app.Id, dbChanges);

                    Logger.LogInformation($"Saved changes to database in {sw.ElapsedMilliseconds}ms count: {dbChanges.Count}");
                }

                sw.Stop();
            }
        }