Esempio n. 1
0
        private async Task SyncRemarksAsync()
        {
            Console.WriteLine("Synchronizing remarks...");
            var remarks = await _database.GetCollection <Remark>()
                          .AsQueryable()
                          .ToListAsync();

            var groups = new HashSet <Group>();

            foreach (var remark in remarks)
            {
                if (remark.Group != null)
                {
                    var group = groups.SingleOrDefault(x => x.Id == remark.Group.Id);
                    if (group == null)
                    {
                        group = await _database.GetCollection <Group>()
                                .AsQueryable()
                                .FirstOrDefaultAsync(x => x.Id == remark.Group.Id);

                        if (group == null)
                        {
                            continue;
                        }
                        groups.Add(group);
                    }
                    remark.Group.Criteria = group.Criteria;
                    remark.Group.Members  = group.Members.ToDictionary(x => x.UserId, x => x.Role);
                }
                remark.PositiveVotesCount = remark.Votes?.Count(x => x.Positive) ?? 0;
                remark.NegativeVotesCount = remark.Votes?.Count(x => !x.Positive) ?? 0;
            }

            var usersRemarks = remarks.GroupBy(x => x.Author.UserId);

            foreach (var userRemarks in usersRemarks)
            {
                await _cache.AddManyToSetAsync($"users:{userRemarks.Key}:remarks",
                                               userRemarks.Select(x => x.Id.ToString()));
            }

            var latestRemarks = remarks.OrderByDescending(x => x.CreatedAt).Take(100);

            foreach (var remark in latestRemarks)
            {
                await _cache.AddToSortedSetAsync("remarks-latest", remark.Id.ToString(), 0, limit : 100);
            }
            foreach (var remark in remarks)
            {
                await _cache.AddAsync($"remarks:{remark.Id}", remark);

                await _cache.GeoAddAsync($"remarks", remark.Location.Longitude,
                                         remark.Location.Latitude, remark.Id.ToString());
            }
            Console.WriteLine("Synchronizing remarks has completed.");
        }