Пример #1
0
 private Result ValidateRequest(Models.Requests.ManagerInfoWithCode managerInfoRequest)
 => ValidationHelper.Validate(managerInfoRequest, new ManagerInfoWithCodeValidator());
Пример #2
0
        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);
        }