public async Task <IActionResult> AddOrUpdateEmployeeInfo([FromBody] NewUserInfoDTO newUserInfoDTO)
        {
            var loggedUser = await _userManager.GetUserAsync(User);

            try
            {
                var userDto = await _employeeService.AddUpdateUserInfo(loggedUser.Id, loggedUser.EmployeeType, newUserInfoDTO);

                return(Ok(userDto));
            }
            catch (Exception ex)
            {
                if (ex is ArgumentException || ex is AdminRoleRequiredException || ex is ValuesChangedByAnotherUserException)
                {
                    return(BadRequest(new Exception(ex.Message)));
                }

                throw;
            }
        }
Beispiel #2
0
        private async Task <Employee> addNewUserInfo(EmployeeTypeEnum loggedUserType, NewUserInfoDTO newUserInfoDTO)
        {
            if (loggedUserType == EmployeeTypeEnum.User)
            {
                throw new AdminRoleRequiredException();
            }
            var newEmployeeInfo = new Employee
            {
                UserName     = newUserInfoDTO.Email,
                FirstName    = newUserInfoDTO.FirstName,
                LastName     = newUserInfoDTO.LastName,
                Email        = newUserInfoDTO.Email,
                EmployeeType = newUserInfoDTO.Type
            };

            IdentityResult result = await _userManager.CreateAsync(newEmployeeInfo, newUserInfoDTO.NewPassword);

            if (result.Succeeded)
            {
                await _userManager.AddToRoleAsync(newEmployeeInfo, RoleUtil.GetRoleFromEmployeeType(newEmployeeInfo.EmployeeType));
            }
            else
            {
                // this will be duplicate username in this case
                throw new ArgumentException(result.Errors.FirstOrDefault().Description);
            }

            return(newEmployeeInfo);
        }
Beispiel #3
0
        private async Task <Employee> updateUserInfo(string loggedUserId, EmployeeTypeEnum loggedUserType, NewUserInfoDTO newUserInfoDTO)
        {
            if (newUserInfoDTO.Id != loggedUserId && loggedUserType == EmployeeTypeEnum.User)
            {
                throw new AdminRoleRequiredException();
            }
            var oldUserInfo = await _context.Users.FindAsync(newUserInfoDTO.Id);

            if (oldUserInfo == null)
            {
                throw new ArgumentException("User was deleted by someone else.");
            }

            if (oldUserInfo.ConcurrencyStamp != newUserInfoDTO.ConcurrencyStamp)
            {
                throw new ValuesChangedByAnotherUserException();
            }
            oldUserInfo.FirstName = newUserInfoDTO.FirstName;
            oldUserInfo.LastName  = newUserInfoDTO.LastName;
            oldUserInfo.UserName  = newUserInfoDTO.Email;
            oldUserInfo.Email     = newUserInfoDTO.Email;

            if (!string.IsNullOrEmpty(newUserInfoDTO.NewPassword))
            {
                var passwordResult = await _userManager.PasswordValidators.FirstOrDefault().ValidateAsync(_userManager, oldUserInfo, newUserInfoDTO.NewPassword);

                if (!passwordResult.Succeeded)
                {
                    throw new ArgumentException(passwordResult.Errors.FirstOrDefault()?.Description);
                }
                oldUserInfo.PasswordHash = _userManager.PasswordHasher.HashPassword(oldUserInfo, newUserInfoDTO.NewPassword);
            }

            IdentityResult result = await _userManager.UpdateAsync(oldUserInfo);

            if (result.Succeeded)
            {
                return(oldUserInfo);
            }
            else
            {
                // this will be duplicate username in this case
                throw new ArgumentException(result.Errors.FirstOrDefault().Description);
            }
        }
Beispiel #4
0
        public async Task <UserInfoDTO> AddUpdateUserInfo(string loggedUserId, EmployeeTypeEnum loggedUserType, NewUserInfoDTO newUserInfoDTO)
        {
            Employee employee = newUserInfoDTO.IsNewUser ? await addNewUserInfo(loggedUserType, newUserInfoDTO) : await updateUserInfo(loggedUserId, loggedUserType, newUserInfoDTO);

            return(DtoMapper.MapEmployeeToDTO(employee));
        }