コード例 #1
0
        public async Task <IdentityResult> Handle(Command request, CancellationToken cancellationToken)
        {
            var user = await _userManager.FindByIdAsync(request.Id);

            var allUserRoles = await _context.UserRoles.Where(x => x.UserId == request.Id)
                               .Join(_context.Roles, ur => ur.RoleId, r => r.Id, (ur, r) => new { r.Id, r.Name })
                               .ToListAsync(cancellationToken);

            List <string> rolesToRemove = allUserRoles.Where(x => !request.RolesId.Contains(x.Id)).Select(x => x.Name).ToList();

            List <string> rolesId = allUserRoles.Select(x => x.Id).ToList();

            List <string> rolesToAddIds = request.RolesId.Where(x => !rolesId.Contains(x)).ToList();

            List <string> rolesToAddNames = await _context.Roles.Where(x => rolesToAddIds.Contains(x.Id))
                                            .Select(x => x.Name).ToListAsync(cancellationToken);

            foreach (string roleName in rolesToRemove)
            {
                await _userManager.RemoveFromRoleAsync(user, roleName);
            }

            foreach (string roleName in rolesToAddNames)
            {
                await _userManager.AddToRoleAsync(user, roleName);
            }
            user = UserAggregate.FromState(user).Update(request).State;

            IdentityResult updateResult = await _userManager.UpdateAsync(user);

            return(updateResult);
        }