예제 #1
0
        /// <summary>
        /// Method for creating a user relationship to a region
        /// </summary>
        /// <param name = "user"> User </param>
        /// <param name = "data"> Data </param>
        /// <returns> </returns>
        public async Task RelateUserRegionsAsync(User user, IUserSubmit data)
        {
            var oldUserRegions = await _context.UserRegions.Where(x => x.UserId == user.Id).ToListAsync();

            var regions = await _context.Regions.Where(v => data.UserRegions.Contains(v.Id)).ToListAsync();

            foreach (var oldUserRegion in oldUserRegions)
            {
                if (!data.UserRegions.Contains(oldUserRegion.RegionId))
                {
                    _context.Remove(oldUserRegion);
                }
            }
            foreach (var region in regions)
            {
                if (oldUserRegions.All(x => x.RegionId != region.Id))
                {
                    _context.UserRegions.Add(new UserRegion
                    {
                        User     = user,
                        UserId   = user.Id,
                        Region   = region,
                        RegionId = region.Id,
                    });
                }
            }
            await _context.SaveChangesAsync();
        }
예제 #2
0
        /// <summary>
        /// Creates / updates relationships between user and activity types
        /// </summary>
        /// <param name = "user"> </param>
        /// <param name = "data"> </param>
        /// <returns> </returns>
        public async Task RelateUserActivityCategoriesAsync(User user, IUserSubmit data)
        {
            var oldActivityCategoryUsersIds =
                await _context.ActivityCategoryUsers.Where(x => x.UserId == user.Id).Select(x => x.ActivityCategoryId).Distinct().ToListAsync();

            var checkForChange = oldActivityCategoryUsersIds.Intersect(data.ActiviyCategoryIds).Count() ==
                                 oldActivityCategoryUsersIds.Count;

            if (oldActivityCategoryUsersIds.Count == 0 || !checkForChange)
            {
                if (data.IsAllActivitiesSelected)
                {
                    var allActivityIds = (await _context.ActivityCategories.Select(x => x.Id).ToListAsync())
                                         .Except(oldActivityCategoryUsersIds);

                    foreach (var id in allActivityIds)
                    {
                        _context.ActivityCategoryUsers.Add(new ActivityCategoryUser
                        {
                            ActivityCategoryId = id,
                            UserId             = user.Id
                        });
                    }
                    await _context.SaveChangesAsync();

                    return;
                }

                var allActivityCategories = await _context.ActivityCategories.ToListAsync();

                var newHierarchy = new HashSet <int>(GetFullHierarchy(data.ActiviyCategoryIds.ToList(), allActivityCategories));

                var itemIdsToDelete = oldActivityCategoryUsersIds.Where(x => !newHierarchy.Contains(x)).ToList();
                if (itemIdsToDelete.Count > 0)
                {
                    int first      = 0;
                    int step       = 1000;
                    int iterations = itemIdsToDelete.Count / step;
                    int reminder   = itemIdsToDelete.Count % step;
                    if (reminder > 0)
                    {
                        ++iterations;
                    }
                    for (int i = 0; i < iterations; i++)
                    {
                        string idsToDelete = GetIdsString(itemIdsToDelete, first, first + step < itemIdsToDelete.Count ? step : itemIdsToDelete.Count - first);
                        await _context.Database.ExecuteSqlCommandAsync($"DELETE FROM ActivityCategoryUsers WHERE ActivityCategory_Id IN ({idsToDelete})");

                        first += step;
                    }
                }

                var itemsToAdd = newHierarchy.Except(oldActivityCategoryUsersIds).Distinct().ToList();
                foreach (var id in itemsToAdd)
                {
                    await _context.ActivityCategoryUsers.AddAsync(new ActivityCategoryUser
                    {
                        ActivityCategoryId = id,
                        UserId             = user.Id
                    });
                }

                await _context.SaveChangesAsync();
            }
        }