private Result ValidateRequest(Models.Requests.ManagerInfoWithCode managerInfoRequest) => ValidationHelper.Validate(managerInfoRequest, new ManagerInfoWithCodeValidator());
public Task <Result <Models.Responses.ManagerContext> > RegisterInvited(Models.Requests.ManagerInfoWithCode managerInfoRequest, string email) { return(CheckIdentityHashNotEmpty() .Bind(GetPendingInvitation) .Ensure(IsEmailUnique, "Manager with this email already exists") .Check(managerInvitation => ValidateRequest(managerInfoRequest)) .BindWithTransaction(_dbContext, managerInvitation => Result.Success(managerInvitation) .Bind(AddManager) .Bind(AddManagerRelation) .Tap(AcceptInvitation)) .Tap(LogSuccess) .Bind(GetMasterManager) .Bind(SendRegistrationMailToMaster) .OnFailure(LogFailed) .Map(Build)); Task <Result <Models.Responses.ManagerInvitation> > GetPendingInvitation() => _managerInvitationService.GetPendingInvitation(managerInfoRequest.InvitationCode); async Task <bool> IsEmailUnique(Models.Responses.ManagerInvitation managerInvitation) => !await _dbContext.Managers.AnyAsync(manager => manager.Email == managerInvitation.Email); async Task <Result <(Models.Responses.ManagerInvitation, Manager)> > AddManager(Models.Responses.ManagerInvitation managerInvitation) { var utcNowDate = _dateTimeProvider.UtcNow(); var manager = new Manager { IdentityHash = _managerContext.GetHash(), Email = email, FirstName = managerInfoRequest.FirstName, LastName = managerInfoRequest.LastName, Title = managerInfoRequest.Title, Position = managerInfoRequest.Position, Created = utcNowDate, Updated = utcNowDate, IsActive = true }; _dbContext.Managers.Add(manager); await _dbContext.SaveChangesAsync(); return(Result.Success((managerInvitation, manager))); } async Task <Result <ManagerContext> > AddManagerRelation((Models.Responses.ManagerInvitation, Manager) invitationData) { var(managerInvitation, manager) = invitationData; var managerRelation = await AddManagerServiceSupplierRelation(manager, ManagerPermissions.All, false, managerInvitation.ServiceSupplierId); var managerContext = CollectManagerContext(manager, managerRelation); return(Result.Success(managerContext)); } async Task AcceptInvitation() => await _managerInvitationService.Accept(managerInfoRequest.InvitationCode); void LogSuccess(ManagerContext managerContext) => _logger.LogManagerRegistrationSuccess($"Manager with the {nameof(email)} '{email}' was successfully registered and was bound to the service supplier ID:'{managerContext.ServiceSupplierId}'"); async Task <Result <(ManagerContext, Manager)> > GetMasterManager(ManagerContext managerContext) { var masterManager = await _managerContext.GetMasterManager(managerContext.ServiceSupplierId); if (masterManager.IsFailure) { return(Result.Failure <(ManagerContext, Manager)>(masterManager.Error)); } return(Result.Success((managerContext, masterManager.Value))); } async Task <Result <ManagerContext> > SendRegistrationMailToMaster((ManagerContext, Manager) registrationData) { var(managerContext, masterManager) = registrationData; var serviceSupplier = await _dbContext.ServiceSuppliers.SingleOrDefaultAsync(serviceSupplier => serviceSupplier.Id == managerContext.ServiceSupplierId); if (serviceSupplier is null) { return(Result.Failure <ManagerContext>("Service supplier not found")); } var sendResult = await _notificationService.SendRegistrationConfirmation(masterManager.Email, managerInfoRequest, serviceSupplier.Name); if (sendResult.IsFailure) { return(Result.Failure <ManagerContext>(sendResult.Error)); } return(Result.Success(managerContext)); } void LogFailed(string error) => _logger.LogManagerRegistrationFailed(error); }