public IEnumerable <ApprenticeshipApplicationDetail> GetApplicationsForValidCandidatesWithUnsetLegacyId() { var applicationsForValidCandidatesWithUnsetLegacyId = new List <ApprenticeshipApplicationDetail>(); //Message queue back off strategy is to wait 30 seconds before initial retry then 5 minutes for each subsequent retry //6 Minutes provides enough time for three attempts var outsideLikelyUpdateTime = DateTime.Now.AddMinutes(60); var applicationWithUnsetLegacyId = Collection.AsQueryable().Where(a => a.Status == ApplicationStatuses.Submitting && a.DateUpdated < outsideLikelyUpdateTime && a.LegacyApplicationId == 0); foreach (var mongoApprenticeshipApplicationDetail in applicationWithUnsetLegacyId) { var candidate = _candidateReadRepository.Get(mongoApprenticeshipApplicationDetail.CandidateId); //Exclude any applications associated with a candidate that does not yet have a valid legacy candidate id. //These candidates need updating first before any applications will go through. if (candidate.LegacyCandidateId == 0) { continue; } var apprenticeshipApplicationDetail = _mapper.Map <MongoApprenticeshipApplicationDetail, ApprenticeshipApplicationDetail>(mongoApprenticeshipApplicationDetail); _logger.Debug("Apprenticeship application {0} is associated with a valid candidate but does not have a valid legacy application id from the legacy service", apprenticeshipApplicationDetail.EntityId); applicationsForValidCandidatesWithUnsetLegacyId.Add(apprenticeshipApplicationDetail); } return(applicationsForValidCandidatesWithUnsetLegacyId); }
private bool ProcessApprenticeshipApplication(ApplicationStatusSummary applicationStatusSummary) { var apprenticeshipApplicationDetail = default(ApprenticeshipApplicationDetail); if (applicationStatusSummary.ApplicationId != Guid.Empty) { apprenticeshipApplicationDetail = _apprenticeshipApplicationReadRepository.Get(applicationStatusSummary.ApplicationId); } if (apprenticeshipApplicationDetail == null && applicationStatusSummary.LegacyApplicationId != 0) { apprenticeshipApplicationDetail = _apprenticeshipApplicationReadRepository.Get(applicationStatusSummary.LegacyApplicationId); } if (apprenticeshipApplicationDetail == null && applicationStatusSummary.LegacyCandidateId != 0) { // in some cases the application can't be found using the application IDs so use legacy candidate and vacancy IDs var candidate = _candidateReadRepository.Get(applicationStatusSummary.LegacyCandidateId); apprenticeshipApplicationDetail = _apprenticeshipApplicationReadRepository.GetForCandidate(candidate.EntityId, applicationStatusSummary.LegacyVacancyId); } if (apprenticeshipApplicationDetail == null) { return(false); // not necessarily an error as may be a traineeship } _applicationStatusUpdateStrategy.Update(apprenticeshipApplicationDetail, applicationStatusSummary); return(true); }
public Candidate GetCandidate(string username) { var candidates = _candidateReadRepository.Get(username).ToList(); if (candidates.Count == 1) { return(candidates.Single()); } var user = _userReadRepository.Get(username); return(_candidateReadRepository.Get(user.EntityId)); }
public ServiceBusMessageStates Consume(CandidateHousekeeping candidateHousekeeping) { var candidateId = candidateHousekeeping.CandidateId; _logService.Debug("Running housekeeping strategies for CandidateId: {0}", candidateId); var user = _userReadRepository.Get(candidateId); var candidate = _candidateReadRepository.Get(candidateId); if (user == null && candidate == null) { _logService.Info("No User or Candidate found for CandidateId: {0}. Likely deleted by another housekeeping sweep", candidateId); } else { foreach (var housekeepingChain in _housekeepingChains) { housekeepingChain.Handle(user, candidate); } } _logService.Debug("Housekeeping for CandidateId: {0} complete", candidateId); return(ServiceBusMessageStates.Complete); }
public Candidate AuthenticateCandidate(string username, string password) { var user = _userReadRepository.Get(username, false); if (user != null) { user.AssertState("Authenticate user", UserStatuses.Active, UserStatuses.PendingActivation, UserStatuses.Locked, UserStatuses.Dormant); if (_authenticationService.AuthenticateUser(user.EntityId, password)) { var candidate = _candidateReadRepository.Get(user.EntityId); if (user.LoginIncorrectAttempts > 0) { user.LoginIncorrectAttempts = 0; } if (user.Status == UserStatuses.Dormant) { user.Status = UserStatuses.Active; } user.LastLogin = DateTime.UtcNow; _userWriteRepository.Save(user); _serviceBus.PublishMessage(new CandidateUserUpdate(user.EntityId, CandidateUserUpdateType.Update)); return(candidate); } RegisterFailedLogin(user); } return(null); }
public void SendPasswordResetCode(string username) { var user = _userReadRepository.Get(username, false); if (user == null) { _logger.Info(string.Format("Cannot send password reset code, username not found: \"{0}\".", username)); return; } var candidate = _candidateReadRepository.Get(user.EntityId); var currentDateTime = DateTime.Now; var expiry = currentDateTime.AddDays(_passwordResetCodeExpiryDays); string passwordResetCode; if (!string.IsNullOrEmpty(user.PasswordResetCode) && (user.PasswordResetCodeExpiry > currentDateTime)) { // Reuse existing token and set new expiry date passwordResetCode = user.PasswordResetCode; } else { // generate new code and send passwordResetCode = _codeGenerator.GenerateAlphaNumeric(); } user.SetStatePasswordResetCode(passwordResetCode, expiry); _userWriteRepository.Save(user); // Send Password Reset Code SendPasswordResetCodeViaCommunicationService(candidate, user.PasswordResetCode); }
public void SendSavedSearchAlerts(Guid batchId) { var allCandidatesSavedSearchAlerts = _savedSearchAlertRepository.GetCandidatesSavedSearchAlerts(); foreach (var candidateId in allCandidatesSavedSearchAlerts.Keys) { var candidate = _candidateReadRepository.Get(candidateId); var user = _userReadRepository.Get(candidateId); var candidateSavedSearchAlerts = allCandidatesSavedSearchAlerts[candidateId]; if (candidate.AllowsCommunication() && user.IsActive()) { var communicationRequest = CommunicationRequestFactory.GetSavedSearchAlertCommunicationRequest(candidate, candidateSavedSearchAlerts); _serviceBus.PublishMessage(communicationRequest); // Update candidates saved search alerts to sent candidateSavedSearchAlerts.ToList().ForEach(dd => { dd.BatchId = batchId; _savedSearchAlertRepository.Save(dd); }); } else { // Soft delete candidates saved search status alerts by setting batch id to empty candidateSavedSearchAlerts.ToList().ForEach(dd => { dd.BatchId = Guid.Empty; _savedSearchAlertRepository.Save(dd); }); } } }
private void CreateCandidate(CreateCandidateRequest request) { try { _logger.Debug("Creating candidate Id: {0}", request.CandidateId); var user = _userReadRepository.Get(request.CandidateId); user.AssertState("Create legacy user", UserStatuses.Active, UserStatuses.Locked); var candidate = _candidateReadRepository.Get(request.CandidateId, true); if (candidate.LegacyCandidateId == 0) { _logger.Info("Sending request to create candidate in legacy system: Candidate Id: \"{0}\"", request.CandidateId); var legacyCandidateId = _legacyCandidateProvider.CreateCandidate(candidate); candidate.LegacyCandidateId = legacyCandidateId; _candidateWriteRepository.Save(candidate); _logger.Info("Candidate created in legacy system: Candidate Id: \"{0}\", Legacy Candidate Id: \"{1}\"", request.CandidateId, legacyCandidateId); } else { _logger.Warn("User has already been activated in legacy system: Candidate Id: \"{0}\"", request.CandidateId); } } catch (Exception ex) { _logger.Error(string.Format("Create candidate with id {0} request async process failed", request.CandidateId), ex); Requeue(request); } }
public void ResetForgottenPassword(string username, string passwordCode, string newPassword) { var user = _userReadRepository.Get(username); var candidate = _candidateReadRepository.Get(user.EntityId); if (user.PasswordResetCode != null && user.PasswordResetCode.Equals(passwordCode, StringComparison.CurrentCultureIgnoreCase)) { if (user.PasswordResetCodeExpiry != null && DateTime.UtcNow > user.PasswordResetCodeExpiry) { throw new CustomException("Password reset code has expired.", Interfaces.Users.ErrorCodes.UserPasswordResetCodeExpiredError); } _authenticationService.ResetUserPassword(user.EntityId, newPassword); user.SetStateActive(); user.LastLogin = DateTime.UtcNow; _userWriteRepository.Save(user); _serviceBus.PublishMessage(new CandidateUserUpdate(user.EntityId, CandidateUserUpdateType.Update)); _auditRepository.Audit(user, AuditEventTypes.UserResetPassword, user.EntityId); SendPasswordResetConfirmationMessage(candidate); } else { RegisterFailedPasswordReset(user); throw new CustomException("Password reset code \"{0}\" is invalid for user \"{1}\"", Interfaces.Users.ErrorCodes.UserPasswordResetCodeIsInvalid, passwordCode, username); } }
public ApprenticeshipApplicationDetail CreateDraft(Guid candidateId, int vacancyId) { var applicationDetail = _apprenticeshipApplicationReadRepository.GetForCandidate(candidateId, vacancyId); if (applicationDetail == null) { return(null); } if (applicationDetail.Status != ApplicationStatuses.Saved) { return(null); } var candidateDetail = _candidateReadRespository.Get(candidateId); if (candidateDetail == null) { return(null); } // Only actually update if in saved state and we have a candidate applicationDetail.Status = ApplicationStatuses.Draft; applicationDetail.CandidateDetails = candidateDetail.RegistrationDetails; applicationDetail.CandidateInformation = candidateDetail.ApplicationTemplate; applicationDetail = _apprenticeshipApplicationWriteRepository.Save(applicationDetail); _serviceBus.PublishMessage(new ApprenticeshipApplicationUpdate(applicationDetail.EntityId, ApplicationUpdateType.Update)); return(applicationDetail); }
public void CreateApplication(SubmitTraineeshipApplicationRequest request) { _logger.Debug("Creating traineeship application Id: {0}", request.ApplicationId); var applicationDetail = _apprenticeshipApplicationReadRepository.Get(request.ApplicationId, true); try { var candidate = _candidateReadRepository.Get(applicationDetail.CandidateId, true); if (candidate.LegacyCandidateId == 0) { _logger.Info( "Candidate with Id: {0} has not been created in the legacy system. Message will be requeued", applicationDetail.CandidateId); Requeue(request); } else { applicationDetail.LegacyApplicationId = _legacyApplicationProvider.CreateApplication(applicationDetail); _traineeeshipApplicationWriteRepository.Save(applicationDetail); } } catch (CustomException ex) { HandleCustomException(request, ex); } catch (Exception ex) { _logger.Error(string.Format("Submit traineeship application with Id = {0} request async process failed.", request.ApplicationId), ex); Requeue(request); } }
public IList <ApprenticeshipApplicationSummary> GetApplications(Guid candidateId) { try { // try to get the latest status of apps for the specified candidate from legacy var candidate = _candidateReadRepository.Get(candidateId); if (candidate.LegacyCandidateId != 0) { //Verify candidate exists in legacy system otherwise this call will throw and exception and log an error var submittedApplicationStatuses = _legacyApplicationStatusesProvider.GetCandidateApplicationStatuses(candidate); _applicationStatusUpdater.Update(candidate, submittedApplicationStatuses); } } catch (Exception ex) { // if fails just return apps with their current status var message = string.Format("Failed to update candidate's application statuses from legacy. CandidateId: {0}", candidateId); _logger.Error(message, ex); } return(_apprenticeshipApplicationReadRepository.GetForCandidate(candidateId)); }
public void ResendActivationCode(string username) { var user = _userReadRepository.Get(username, false); if (user == null) { throw new CustomException("Unknown username", UserErrorCodes.UnknownUserError); } user.AssertState("Resend activate code", UserStatuses.PendingActivation); var candidate = _candidateReadRepository.Get(user.EntityId); var currentDateTime = DateTime.Now; var expiry = currentDateTime.AddDays(_activationCodeExpiryDays); if (!string.IsNullOrEmpty(user.ActivationCode) && (user.ActivateCodeExpiry > currentDateTime)) { // Reuse existing token and set new expiry date user.PasswordResetCodeExpiry = expiry; } else { // generate new code and set expiry date var activationCode = _codeGenerator.GenerateAlphaNumeric(); user.SetStatePendingActivation(activationCode, expiry); } _userWriteRepository.Save(user); SendActivationCode(candidate, user.ActivationCode); }
public Candidate SaveCandidate(Candidate candidate) { var result = _candidateWriteRepository.Save(candidate); _serviceBus.PublishMessage(new CandidateUserUpdate(candidate.EntityId, CandidateUserUpdateType.Update)); var reloadedCandidate = _candidateReadRepository.Get(candidate.EntityId); var candidateApplications = _getCandidateApplicationsStrategy .GetApplications(candidate.EntityId) .Where(a => a.Status == ApplicationStatuses.Draft || a.Status == ApplicationStatuses.Saved) .ToList(); candidateApplications.ForEach(candidateApplication => { try { UpdateApprenticeshipApplicationDetail(reloadedCandidate, candidateApplication.LegacyVacancyId); } catch (Exception e) { // try updating the next one var message = string.Format( "Error while updating a draft application with the updated user personal details for user {0}", candidate.EntityId); _logger.Warn(message, e); } }); return(result); }
public Candidate AuthenticateCandidate(string username, string password) { var user = _userReadRepository.Get(username, false); if (user != null) { user.AssertState("Authenticate user", UserStatuses.Active, UserStatuses.PendingActivation, UserStatuses.Locked); if (_authenticationService.AuthenticateUser(user.EntityId, password)) { var candidate = _candidateReadRepository.Get(user.EntityId); if (user.LoginIncorrectAttempts > 0) { user.SetStateActive(); _userWriteRepository.Save(user); } return(candidate); } RegisterFailedLogin(user); } return(null); }
public void SendDailyDigests(Guid batchId) { //todo: 1.7: this should accommodate more than just expiring drafts... var candidatesDailyDigest = _expiringDraftRepository.GetCandidatesDailyDigest(); foreach (var candidateDailyDigest in candidatesDailyDigest) { var candidate = _candidateReadRepository.Get(candidateDailyDigest.Key); if (candidate.CommunicationPreferences.AllowEmail || candidate.CommunicationPreferences.AllowMobile) { var communicationMessage = CommunicationRequestFactory.GetCommunicationMessage(candidate, candidateDailyDigest.Value); _bus.PublishMessage(communicationMessage); // Update candidates expiring drafts to sent candidateDailyDigest.Value.ToList().ForEach(dd => { dd.BatchId = batchId; _expiringDraftRepository.Save(dd); }); } else { // Delete candidates expiring drafts candidateDailyDigest.Value.ToList().ForEach(_expiringDraftRepository.Delete); } } }
public void SendAccountUnlockCode(string username) { var user = _userReadRepository.Get(username); user.AssertState("Send unlock code", UserStatuses.Locked); var candidate = _candidateReadRepository.Get(user.EntityId); if (user.AccountUnlockCodeExpiry < DateTime.Now) { // Account unlock code has expired, renew it. _lockUserStrategy.LockUser(user); } var unlockCodeExpiryDays = _configurationManager.GetAppSetting <int>("UnlockCodeExpiryDays"); var firstName = candidate.RegistrationDetails.FirstName; var emailAddress = candidate.RegistrationDetails.EmailAddress; var accountUnlockCode = user.AccountUnlockCode; var expiryInDays = string.Format(unlockCodeExpiryDays == 1 ? "{0} day" : "{0} days", unlockCodeExpiryDays); var tokens = new[] { new CommunicationToken(CommunicationTokens.CandidateFirstName, firstName), new CommunicationToken(CommunicationTokens.Username, emailAddress), new CommunicationToken(CommunicationTokens.AccountUnlockCode, accountUnlockCode), new CommunicationToken(CommunicationTokens.AccountUnlockCodeExpiryDays, expiryInDays) }; _communicationService.SendMessageToCandidate( candidate.EntityId, MessageTypes.SendAccountUnlockCode, tokens); }
public void VerifyMobile(Guid candidateId, string verificationCode) { var candidate = _candidateReadRepository.Get(candidateId); if (!candidate.MobileVerificationRequired()) { var message = string.Format("The mobile number associated with candidate Id: {0} does not require verification.", candidate.EntityId); throw new CustomException(message, Domain.Entities.ErrorCodes.EntityStateError); } if (candidate.CommunicationPreferences.MobileVerificationCode == verificationCode) { candidate.CommunicationPreferences.MobileVerificationCode = string.Empty; candidate.CommunicationPreferences.MobileVerificationCodeDateCreated = null; candidate.CommunicationPreferences.VerifiedMobile = true; _candidateWriteRepository.Save(candidate); _serviceBus.PublishMessage(new CandidateUserUpdate(candidate.EntityId, CandidateUserUpdateType.Update)); _auditRepository.Audit(candidate, AuditEventTypes.CandidateVerifiedMobileNumber, candidate.EntityId); } else { var errorMessage = string.Format("Mobile verification code {0} is invalid for candidate {1} with mobile number {2}", verificationCode, candidateId, candidate.RegistrationDetails.PhoneNumber); throw new CustomException(errorMessage, Interfaces.Users.ErrorCodes.MobileCodeVerificationFailed); } }
private void SyncToCandidatesApplicationTemplate(TraineeshipApplicationDetail traineeshipApplicationDetail) { var candidate = _candidateReadRepository.Get(traineeshipApplicationDetail.CandidateId); candidate.ApplicationTemplate.Qualifications = traineeshipApplicationDetail.CandidateInformation.Qualifications; candidate.ApplicationTemplate.WorkExperience = traineeshipApplicationDetail.CandidateInformation.WorkExperience; _candidateWriteRepository.Save(candidate); }
public void WhenIGetMyMobileVerificationCode() { var email = _tokenManager.GetTokenByKey(BindingData.UserEmailAddressTokenName); var candidate = _candidateReadRepository.Get(email); if (candidate != null) { _tokenManager.SetToken(BindingData.MobileVerificationCodeTokenName, candidate.CommunicationPreferences.MobileVerificationCode); } }
private void SyncToCandidatesApplicationTemplate(ApprenticeshipApplicationDetail apprenticeshipApplicationDetail) { var candidate = _candidateReadRepository.Get(apprenticeshipApplicationDetail.CandidateId); candidate.ApplicationTemplate.AboutYou = apprenticeshipApplicationDetail.CandidateInformation.AboutYou; candidate.ApplicationTemplate.EducationHistory = apprenticeshipApplicationDetail.CandidateInformation.EducationHistory; candidate.ApplicationTemplate.Qualifications = apprenticeshipApplicationDetail.CandidateInformation.Qualifications; candidate.ApplicationTemplate.WorkExperience = apprenticeshipApplicationDetail.CandidateInformation.WorkExperience; _candidateWriteRepository.Save(candidate); }
public void SendPendingUsernameCode(Guid userId) { var user = _userReadRepository.Get(userId); if (user == null) { _logger.Info(string.Format("Cannot send pending username code, userid not found: \"{0}\".", userId)); return; } var candidate = _candidateReadRepository.Get(user.EntityId); SendPendingUsernameCodeViaCommunicationService(user, candidate); }
public TraineeshipApplicationDetail CreateApplication(Guid candidateId, int vacancyId) { var vacancyDetails = _vacancyDataProvider.GetVacancyDetails(vacancyId); if (vacancyDetails == null) { return(null); } var candidate = _candidateReadRepository.Get(candidateId); var applicationDetail = CreateApplicationDetail(candidate, vacancyDetails); return(applicationDetail); }
public void UpdateUsername(Guid userId, string verfiyCode, string password) { var user = _userAccountService.GetUser(userId); var candidate = _candidateReadRepository.Get(userId); _userAccountService.UpdateUsername(userId, verfiyCode, password); var existingCandidates = _candidateReadRepository.Get(user.PendingUsername, false); foreach (var existingCandidate in existingCandidates) { //Any candidate now associated with a null user record must have been pending activation and can be deleted. var existingUser = _userReadRepository.Get(existingCandidate.EntityId); if (existingUser == null) { _candidateWriteRepository.Delete(existingCandidate.EntityId); _serviceBus.PublishMessage(new CandidateUserUpdate(user.EntityId, CandidateUserUpdateType.Delete)); } } candidate.RegistrationDetails.EmailAddress = user.PendingUsername; _saveCandidateStrategy.SaveCandidate(candidate); _serviceBus.PublishMessage(new CandidateUserUpdate(user.EntityId, CandidateUserUpdateType.Update)); }
public void Send(Guid candidateId, IEnumerable <CommunicationToken> tokens) { var candidate = _candidateReadRepository.Get(candidateId); var application = GetApplication(tokens); var vacancy = _vacancyDataProvider.GetVacancyDetails(application.Vacancy.Id, true); var applicationTokens = new[] { new CommunicationToken(CommunicationTokens.CandidateFirstName, candidate.RegistrationDetails.FirstName), new CommunicationToken(CommunicationTokens.ApplicationVacancyTitle, vacancy.Title), new CommunicationToken(CommunicationTokens.ApplicationVacancyReference, vacancy.VacancyReference) }; _sendCandidateCommunicationStrategy.Send(candidateId, MessageTypes.ApprenticeshipApplicationSubmitted, applicationTokens); }
public override void Handle(CommunicationRequest communicationRequest) { var candidateId = GetCandidateId(communicationRequest); var user = _userReadRepository.Get(candidateId); var candidate = _candidateReadRepository.Get(candidateId); if (!ShouldCommunicateWithUser(user)) { _logService.Info("Will NOT send any messages to user '{0}' email '{1}' in state '{2}'", user.EntityId, user.Username, user.Status); return; } HandleEmailMessage(candidate, communicationRequest); HandleSmsMessage(candidate, communicationRequest); }
private void SyncToCandidatesApplicationTemplate(Guid candidateId, TraineeshipApplicationDetail traineeshipApplication) { var candidate = _candidateReadRepository.Get(candidateId); candidate.ApplicationTemplate.Qualifications = traineeshipApplication.CandidateInformation.Qualifications; candidate.ApplicationTemplate.WorkExperience = traineeshipApplication.CandidateInformation.WorkExperience; candidate.ApplicationTemplate.TrainingCourses = traineeshipApplication.CandidateInformation.TrainingCourses; if (!candidate.MonitoringInformation.DisabilityStatus.HasValue && traineeshipApplication.CandidateInformation.DisabilityStatus.HasValue) { candidate.MonitoringInformation.DisabilityStatus = traineeshipApplication.CandidateInformation.DisabilityStatus; } _candidateWriteRepository.Save(candidate); }
private void SyncToCandidateApplicationTemplate(Guid candidateId, ApprenticeshipApplicationDetail apprenticeshipApplication) { var candidate = _candidateReadRepository.Get(candidateId); candidate.ApplicationTemplate.AboutYou = apprenticeshipApplication.CandidateInformation.AboutYou; candidate.ApplicationTemplate.EducationHistory = apprenticeshipApplication.CandidateInformation.EducationHistory; candidate.ApplicationTemplate.Qualifications = apprenticeshipApplication.CandidateInformation.Qualifications; candidate.ApplicationTemplate.WorkExperience = apprenticeshipApplication.CandidateInformation.WorkExperience; candidate.ApplicationTemplate.TrainingCourses = apprenticeshipApplication.CandidateInformation.TrainingCourses; if (!candidate.MonitoringInformation.DisabilityStatus.HasValue && apprenticeshipApplication.CandidateInformation.DisabilityStatus.HasValue) { candidate.MonitoringInformation.DisabilityStatus = apprenticeshipApplication.CandidateInformation.DisabilityStatus; } _candidateWriteRepository.Save(candidate); }
public void ResetForgottenPassword(string username, string passwordCode, string newPassword) { var user = _userReadRepository.Get(username); var candidate = _candidateReadRepository.Get(user.EntityId); if (candidate.LegacyCandidateId == 0) { // Candidate record does not exist on legacy system, create it now. var legacyCandidateId = _legacyCandidateProvider.CreateCandidate(candidate); candidate.LegacyCandidateId = legacyCandidateId; _candidateWriteRepository.Save(candidate); } _resetForgottenPasswordStrategy.ResetForgottenPassword(username, passwordCode, newPassword); }
public void ActivateCandidate(string username, string activationCode) { var user = _userReadRepository.Get(username); user.AssertState("Activate user", UserStatuses.PendingActivation); var candidate = _candidateReadRepository.Get(user.EntityId); if (candidate.LegacyCandidateId == 0) { // Create candidate on legacy system before activating var legacyCandidateId = _legacyCandidateProvider.CreateCandidate(candidate); candidate.LegacyCandidateId = legacyCandidateId; _candidateWriteRepository.Save(candidate); } _registrationService.Activate(username, activationCode); }