/// <inheritdoc />
        public async Task <ConfirmVerificationCodeResultModel> ConfirmCodeAsync(string verificationCode)
        {
            if (string.IsNullOrEmpty(verificationCode))
            {
                throw new ArgumentNullException(nameof(verificationCode));
            }

            string verificationCodeValue;

            try
            {
                verificationCodeValue = verificationCode.Base64ToString();
            }
            catch (FormatException)
            {
                _log.Warning($"Verification code {verificationCode} format error (must be base64 string)");
                return(new ConfirmVerificationCodeResultModel
                {
                    IsVerified = false,
                    Error = VerificationCodeError.VerificationCodeDoesNotExist
                });
            }

            var existingEntity = await _emailVerificationCodeRepository.GetByValueAsync(verificationCodeValue);

            if (existingEntity == null)
            {
                _log.Warning($"Verification code {verificationCodeValue} not found in the system");
                return(new ConfirmVerificationCodeResultModel
                {
                    Error = VerificationCodeError.VerificationCodeDoesNotExist
                });
            }

            if (existingEntity.IsVerified)
            {
                _log.Info($"Verification code {verificationCodeValue} already verified when trying to confirm");
                return(new ConfirmVerificationCodeResultModel
                {
                    Error = VerificationCodeError.AlreadyVerified,
                    IsVerified = true
                });
            }

            if (verificationCodeValue != existingEntity.VerificationCode)
            {
                _log.Warning($"VerificationCode {verificationCodeValue} does not match the stored verification code");
                return(new ConfirmVerificationCodeResultModel {
                    Error = VerificationCodeError.VerificationCodeMismatch
                });
            }

            if (existingEntity.ExpireDate < DateTime.UtcNow)
            {
                _log.Warning($"VerificationCode {verificationCodeValue} has expired");
                return(new ConfirmVerificationCodeResultModel {
                    Error = VerificationCodeError.VerificationCodeExpired
                });
            }

            await Task.WhenAll(_emailVerificationCodeRepository.SetAsVerifiedAsync(verificationCodeValue))
            .ContinueWith(_ =>
                          _codeVerifiedEventPublisher.PublishAsync(new AdminEmailVerifiedEvent
            {
                AdminId   = existingEntity.AdminId,
                TimeStamp = DateTime.UtcNow
            }));

            var admin = await _adminUserService.GetByIdAsync(existingEntity.AdminId);

            var partnersPermissions = admin.Profile.Permissions.FirstOrDefault(x => x.Type == PartnerPermissionsName);

            //check if it is program partner
            if (partnersPermissions != null && partnersPermissions.Level == PermissionLevel.PartnerEdit)
            {
                await _notificationsService.NotifyPartnerAdminWelcomeAsync(admin.Profile.AdminUserId, admin.Profile.Email);
            }

            return(new ConfirmVerificationCodeResultModel {
                IsVerified = true
            });
        }
        /// <inheritdoc />
        public async Task <ConfirmVerificationCodeResultModel> ConfirmCodeAsync(string verificationCode)
        {
            if (string.IsNullOrEmpty(verificationCode))
            {
                throw new ArgumentNullException(nameof(verificationCode));
            }

            string verificationCodeValue;

            try
            {
                verificationCodeValue = verificationCode.Base64ToString();
            }
            catch (FormatException)
            {
                _log.Warning($"Verification code {verificationCode} format error (must be base64 string)");
                return(new ConfirmVerificationCodeResultModel
                {
                    IsVerified = false,
                    Error = VerificationCodeError.VerificationCodeDoesNotExist
                });
            }

            var existingEntity = await _emailVerificationCodeRepository.GetByValueAsync(verificationCodeValue);

            if (existingEntity == null)
            {
                _log.Warning($"Verification code {verificationCodeValue} not found in the system");
                return(new ConfirmVerificationCodeResultModel
                {
                    Error = VerificationCodeError.VerificationCodeDoesNotExist
                });
            }

            if (existingEntity.IsVerified)
            {
                _log.Info($"Verification code {verificationCodeValue} already verified when trying to confirm");
                return(new ConfirmVerificationCodeResultModel
                {
                    Error = VerificationCodeError.AlreadyVerified,
                    IsVerified = true
                });
            }

            if (verificationCodeValue != existingEntity.VerificationCode)
            {
                _log.Warning($"VerificationCode {verificationCodeValue} does not match the stored verification code");
                return(new ConfirmVerificationCodeResultModel {
                    Error = VerificationCodeError.VerificationCodeMismatch
                });
            }

            if (existingEntity.ExpireDate < DateTime.UtcNow)
            {
                _log.Warning($"VerificationCode {verificationCodeValue} has expired");
                return(new ConfirmVerificationCodeResultModel {
                    Error = VerificationCodeError.VerificationCodeExpired
                });
            }

            await Task.WhenAll(_emailVerificationCodeRepository.SetAsVerifiedAsync(verificationCodeValue))
            .ContinueWith(_ =>
                          _codeVerifiedEventPublisher.PublishAsync(new AdminEmailVerifiedEvent
            {
                AdminId   = existingEntity.AdminId,
                TimeStamp = DateTime.UtcNow
            }));

            return(new ConfirmVerificationCodeResultModel {
                IsVerified = true
            });
        }
Ejemplo n.º 3
0
        /// <inheritdoc />
        public async Task <ConfirmVerificationCodeResultModel> ConfirmCodeAsync(string verificationCode)
        {
            if (string.IsNullOrEmpty(verificationCode))
            {
                throw new ArgumentNullException(nameof(verificationCode));
            }

            string verificationCodeValue;

            try
            {
                verificationCodeValue = verificationCode.Base64ToString();
            }
            catch (FormatException)
            {
                _log.Warning($"Verification code {verificationCode} format error (must be base64 string)");
                return(new ConfirmVerificationCodeResultModel
                {
                    IsVerified = false, Error = VerificationCodeError.VerificationCodeDoesNotExist
                });
            }

            var existingEntity = await _emailVerificationCodeRepository.GetByValueAsync(verificationCodeValue);

            if (existingEntity == null)
            {
                _log.Warning($"Verification code {verificationCodeValue} not found in the system");
                return(new ConfirmVerificationCodeResultModel
                {
                    Error = VerificationCodeError.VerificationCodeDoesNotExist
                });
            }

            if (existingEntity.IsVerified)
            {
                _log.Info($"Verification code {verificationCodeValue} already verified when trying to confirm");
                return(new ConfirmVerificationCodeResultModel
                {
                    Error = VerificationCodeError.AlreadyVerified, IsVerified = true
                });
            }

            if (verificationCodeValue != existingEntity.VerificationCode)
            {
                _log.Warning($"VerificationCode {verificationCodeValue} does not match the stored verification code");
                return(new ConfirmVerificationCodeResultModel {
                    Error = VerificationCodeError.VerificationCodeMismatch
                });
            }

            if (existingEntity.ExpireDate < DateTime.UtcNow)
            {
                _log.Warning($"VerificationCode {verificationCodeValue} has expired");
                return(new ConfirmVerificationCodeResultModel {
                    Error = VerificationCodeError.VerificationCodeExpired
                });
            }

            await Task.WhenAll(
                _emailVerificationCodeRepository.SetAsVerifiedAsync(verificationCodeValue),
                _callRateLimiterService.ClearAllCallRecordsForEmailVerificationAsync(existingEntity.CustomerId))
            .ContinueWith(_ =>
                          _codeVerifiedEventPublisher.PublishAsync(new EmailCodeVerifiedEvent
            {
                CustomerId = existingEntity.CustomerId, TimeStamp = DateTime.UtcNow
            }));

            await _emailEventPublisher.PublishAsync(new EmailMessageEvent
            {
                CustomerId         = existingEntity.CustomerId,
                MessageTemplateId  = _verificationThankYouEmailTemplateId,
                SubjectTemplateId  = _verificationThankYouEmailSubjectTemplateId,
                TemplateParameters = new Dictionary <string, string>(),
                Source             = $"{AppEnvironment.Name} - {AppEnvironment.Version}"
            });

            _log.Info(message: "Successfully generated Verification Thank You Email for customer",
                      context: existingEntity.CustomerId);

            return(new ConfirmVerificationCodeResultModel {
                IsVerified = true
            });
        }