private async Task <bool> AddUpdateAccessLevelsAsync(IEnumerable <int> useraccesses, string userId) { List <cor_useraccess> useAccesses = new List <cor_useraccess>(); if (useraccesses.Count() > 0) { foreach (var acessLevelId in useraccesses) { var access = new cor_useraccess(); access.AccessLevelId = acessLevelId; access.UserId = userId; useAccesses.Add(access); } await _admin.AddUpdateUseraccessAsync(useAccesses); } return(true); }
public async Task <StaffRegRespObj> Handle(UpdateStaffCommand request, CancellationToken cancellationToken) { var response = new StaffRegRespObj { Status = new APIResponseStatus { IsSuccessful = false, Message = new APIResponseMessage() } }; try { var userFromRepoExist = await _userManager.Users.FirstOrDefaultAsync(x => x.UserName.Trim().ToLower() == request.UserName.Trim().ToLower()); var actionTaken = request.StaffId > 0 ? "updated" : "created"; String tempUserId = String.Empty; if (request.StaffId < 1) { if (userFromRepoExist != null) { response.Status.Message.FriendlyMessage = "Username Already assigned to a staff"; return(response); } } if (request.StaffId < 1) { if (await _userManager.Users.AnyAsync(x => x.Email.Trim().ToLower() == request.Email.Trim().ToLower())) { response.Status.Message.FriendlyMessage = "Staff email already belongs to a user"; return(response); } } IdentityResult AddUpdateAsUser = new IdentityResult(); using (var _transaction = await _dataContext.Database.BeginTransactionAsync()) { var stCode = StaffCode.Generate(_dataContext.cor_staff.Where(s => s.Deleted == false).OrderBy(d => d.StaffId).LastOrDefault()?.StaffId ?? 1); try { var stf = new cor_staff(); stf.AccessLevel = request.AccessLevel; stf.Address = request.Address; stf.CountryId = request.CountryId; stf.PhoneNumber = request.PhoneNumber; stf.Email = request.Email; stf.StateId = request.StateId; stf.DateOfBirth = request.DateOfBirth; stf.FirstName = request.FirstName; stf.MiddleName = request.MiddleName; stf.Gender = request.Gender; stf.JobTitle = request.JobTitle; stf.LastName = request.LastName; stf.Photo = request.Photo ?? null; stf.StaffCode = request.StaffId > 0 ? request.StaffCode : stCode; stf.StaffLimit = request.StaffLimit; stf.StaffOfficeId = request.StaffOfficeId; stf.StaffId = request.StaffId; stf.IsHRAdmin = request.IsHRAdmin; stf.PPEAdmin = request.PPEAdmin; stf.IsPandPAdmin = request.IsPandPAdmin; stf.IsCreditAdmin = request.IsCreditAdmin; stf.IsInvestorFundAdmin = request.IsInvestorFundAdmin; stf.IsDepositAdmin = request.IsDepositAdmin; stf.IsTreasuryAdmin = request.IsTreasuryAdmin; stf.IsExpenseManagementAdmin = request.IsExpenseManagementAdmin; stf.IsFinanceAdmin = request.IsFinanceAdmin; var staffIsCreated = await _adminRepo.AddUpdateStaffAsync(stf); if (staffIsCreated) { var user = new cor_useraccount(); user.PhoneNumber = request.PhoneNumber; user.UserName = request.UserName; user.Email = request.Email; user.IsFirstLoginAttempt = true; user.Active = true; user.Deleted = false; user.CreatedBy = "admin"; user.CreatedOn = DateTime.Now; user.StaffId = stf.StaffId; user.IsActive = request.UserStatus.Trim().ToLower() == "true"? true : false; user.LastLoginDate = DateTime.Now; if (userFromRepoExist == null) { AddUpdateAsUser = await _userManager.CreateAsync(user, "Password@1"); tempUserId = user.Id; if (!AddUpdateAsUser.Succeeded) { await _transaction.RollbackAsync(); response.Status.Message.FriendlyMessage = AddUpdateAsUser.Errors.FirstOrDefault().Description; return(response); } } else { cor_useraccount alreadExistingUser = new cor_useraccount(); alreadExistingUser = await _userManager.FindByNameAsync(userFromRepoExist.UserName); alreadExistingUser.PhoneNumber = request.PhoneNumber; alreadExistingUser.UserName = request.UserName; alreadExistingUser.Email = request.Email; alreadExistingUser.IsFirstLoginAttempt = false; alreadExistingUser.StaffId = stf.StaffId; tempUserId = alreadExistingUser.Id; AddUpdateAsUser = await _userManager.UpdateAsync(alreadExistingUser); if (!AddUpdateAsUser.Succeeded) { await _transaction.RollbackAsync(); response.Status.Message.FriendlyMessage = AddUpdateAsUser.Errors.FirstOrDefault().Description; return(response); } } if (AddUpdateAsUser.Succeeded) { if (request.UserAccessLevels.Length > 0) { List <cor_useraccess> useAccesses = new List <cor_useraccess>(); foreach (var acessLevelId in request.UserAccessLevels) { var access = new cor_useraccess(); access.AccessLevelId = acessLevelId; access.UserId = tempUserId; useAccesses.Add(access); } await _adminRepo.AddUpdateUseraccessAsync(useAccesses); } if (request.UserRoleNames.Length > 0) { if (userFromRepoExist != null) { var removed = await _userManager.RemoveFromRolesAsync(userFromRepoExist, await _userManager.GetRolesAsync(userFromRepoExist)); if (!removed.Succeeded) { await _transaction.RollbackAsync(); response.Status.Message.FriendlyMessage = removed.Errors.FirstOrDefault().Description; return(response); } var updated = await _userManager.AddToRolesAsync(userFromRepoExist, request.UserRoleNames); if (!updated.Succeeded) { await _transaction.RollbackAsync(); response.Status.Message.FriendlyMessage = updated.Errors.FirstOrDefault().Description; return(response); } } else { var UpdateUserRoles = await _userManager.AddToRolesAsync(user, request.UserRoleNames); if (!UpdateUserRoles.Succeeded) { await _transaction.RollbackAsync(); response.Status.Message.FriendlyMessage = UpdateUserRoles.Errors.FirstOrDefault().Description; return(response); } } } await SendStaffAccountDetailMail(request.Email, request.UserName, request.FirstName + " " + request.LastName, actionTaken); await _transaction.CommitAsync(); } } } catch (Exception ex) { await _transaction.RollbackAsync(); #region Log error to file var errorCode = ErrorID.Generate(4); _logger.Error($"ErrorID : {errorCode} Ex : {ex?.Message ?? ex?.InnerException?.Message} ErrorStack : {ex?.StackTrace}"); return(new StaffRegRespObj { Status = new APIResponseStatus { IsSuccessful = false, Message = new APIResponseMessage { FriendlyMessage = ex?.Message, MessageId = errorCode, TechnicalMessage = $"ErrorID : {errorCode} Ex : {ex?.Message ?? ex?.InnerException?.Message} ErrorStack : {ex?.StackTrace}" } } }); #endregion } finally { await _transaction.DisposeAsync(); } return(new StaffRegRespObj { Status = new APIResponseStatus { IsSuccessful = true, Message = new APIResponseMessage { FriendlyMessage = $"Staff Details have successfully been {actionTaken}", } } }); } } catch (Exception ex) { #region Log error to file var errorCode = ErrorID.Generate(4); _logger.Error($"ErrorID : {errorCode} Ex : {ex?.Message ?? ex?.InnerException?.Message} ErrorStack : {ex?.StackTrace}"); return(new StaffRegRespObj { Status = new APIResponseStatus { IsSuccessful = false, Message = new APIResponseMessage { FriendlyMessage = "Error occured!! Unable to process request", MessageId = errorCode, TechnicalMessage = $"ErrorID : {errorCode} Ex : {ex?.Message ?? ex?.InnerException?.Message} ErrorStack : {ex?.StackTrace}" } } }); #endregion } }