public ShareApplicationsViewModel GetShareApplicationsViewModel(int vacancyReferenceNumber) { var vacancy = _vacancyPostingService.GetVacancyByReferenceNumber(vacancyReferenceNumber); var vacancyOwnerRelationship = _providerService.GetVacancyOwnerRelationship(vacancy.VacancyOwnerRelationshipId, false); // Closed vacancies can certainly have non-current vacancy parties var employer = _employerService.GetEmployer(vacancyOwnerRelationship.EmployerId, false); var ukprn = _currentUserService.GetClaimValue("ukprn"); var provider = _providerService.GetProvider(ukprn); var viewModel = new ShareApplicationsViewModel(); viewModel.EmployerName = employer.FullName; viewModel.ProviderName = provider.TradingName; viewModel.VacancyType = vacancy.VacancyType; viewModel.VacancyReferenceNumber = vacancyReferenceNumber; List <ApplicationSummary> applications = vacancy.VacancyType == VacancyType.Traineeship ? _traineeshipApplicationService.GetSubmittedApplicationSummaries(vacancy.VacancyId).Select(a => (ApplicationSummary)a).ToList() : _apprenticeshipApplicationService.GetSubmittedApplicationSummaries(vacancy.VacancyId).Select(a => (ApplicationSummary)a).ToList(); var @new = applications.Where(v => v.Status == ApplicationStatuses.Submitted).ToList(); var viewed = applications.Where(v => v.Status == ApplicationStatuses.InProgress).ToList(); var successful = applications.Where(v => v.Status == ApplicationStatuses.Successful).ToList(); var unsuccessful = applications.Where(v => v.Status == ApplicationStatuses.Unsuccessful).ToList(); viewModel.NewApplicationsCount = @new.Count; viewModel.InProgressApplicationsCount = viewed.Count; viewModel.SuccessfulApplicationsCount = successful.Count; viewModel.UnsuccessfulApplicationsCount = unsuccessful.Count; viewModel.ApplicationSummaries = _mapper.Map <List <ApplicationSummary>, List <ApplicationSummaryViewModel> >(applications.OrderBy(a => a.CandidateDetails.LastName).ToList()); return(viewModel); }
public MediatorResponse <ShareApplicationsViewModel> ShareApplications(ShareApplicationsViewModel viewModel, UrlHelper urlHelper) { var validationResult = _shareApplicationsViewModelValidator.Validate(viewModel); var newViewModel = _applicationProvider.GetShareApplicationsViewModel(viewModel.VacancyReferenceNumber); newViewModel.SelectedApplicationIds = viewModel.SelectedApplicationIds; if (!validationResult.IsValid) { return(GetMediatorResponse(ApplicationMediatorCodes.ShareApplications.FailedValidation, newViewModel, validationResult)); } var applicationLinks = new Dictionary <string, string>(); foreach (var selectedApplicationId in viewModel.SelectedApplicationIds) { var application = newViewModel.ApplicationSummaries.Single(a => a.ApplicationId == selectedApplicationId); var anonymisedApplicationLinkData = new AnonymisedApplicationLink(application.ApplicationId, _dateTimeService.TwoWeeksFromUtcNow); var encryptedLinkData = _encryptionService.Encrypt(anonymisedApplicationLinkData); var urlEncodedLinkData = HttpUtility.UrlEncode(encryptedLinkData); var routeName = newViewModel.VacancyType == VacancyType.Apprenticeship ? RecruitmentRouteNames.ViewAnonymousApprenticeshipApplication : RecruitmentRouteNames.ViewAnonymousTraineeshipApplication; var routeValues = new RouteValueDictionary(); routeValues["application"] = urlEncodedLinkData; var link = urlHelper.RouteUrl(routeName, routeValues); applicationLinks[application.ApplicantID] = link; } _applicationProvider.ShareApplications(viewModel.VacancyReferenceNumber, newViewModel.ProviderName, applicationLinks, _dateTimeService.TwoWeeksFromUtcNow, viewModel.RecipientEmailAddress); return(GetMediatorResponse(ApplicationMediatorCodes.ShareApplications.Ok, newViewModel)); }
public void TestUrlIsEncoded() { //Arrange Mock <IApplicationProvider> mockApplicationProvider = new Mock <IApplicationProvider>(); Mock <ShareApplicationsViewModelValidator> mockShareApplicationsViewModelValidator = new Mock <ShareApplicationsViewModelValidator>(); Mock <IEncryptionService <AnonymisedApplicationLink> > mockEncryptionService = new Mock <IEncryptionService <AnonymisedApplicationLink> >(); Mock <IDateTimeService> mockDateTimeService = new Mock <IDateTimeService>(); Mock <UrlHelper> mockUrlHelper = new Mock <UrlHelper>(); Mock <ValidationResult> mockValidationResult = new Mock <ValidationResult>(); var applicationGuid = Guid.NewGuid(); string applicantId = "applicantId"; var applicationSummary = new ApplicationSummaryViewModel() { ApplicationId = applicationGuid, ApplicantID = applicantId }; mockValidationResult.Setup(m => m.IsValid).Returns(true); mockShareApplicationsViewModelValidator.Setup(m => m.Validate(It.IsAny <ShareApplicationsViewModel>())) .Returns(mockValidationResult.Object); mockApplicationProvider.Setup(m => m.GetShareApplicationsViewModel(It.IsAny <int>())) .Returns(new ShareApplicationsViewModel() { VacancyType = VacancyType.Apprenticeship, ApplicationSummaries = { applicationSummary } }); //this is the unencrypted version, that we should not use mockEncryptionService.Setup(m => m.Encrypt(It.IsAny <AnonymisedApplicationLink>())).Returns("abcABC+123/123"); //this is the actual url data value mockUrlHelper.Setup(m => m.RouteUrl(It.IsAny <string>(), It.IsAny <RouteValueDictionary>())).Returns("THE_URL"); var parameters = new ShareApplicationsViewModel(); parameters.SelectedApplicationIds = new List <Guid>() { applicationGuid }; parameters.ApplicationSummaries = new List <ApplicationSummaryViewModel>() { applicationSummary }; var mediator = new ApplicationMediator(mockApplicationProvider.Object, mockShareApplicationsViewModelValidator.Object, mockEncryptionService.Object, mockDateTimeService.Object); //Act mediator.ShareApplications(parameters, mockUrlHelper.Object); //Assert mockApplicationProvider.Verify(m => m.ShareApplications(It.IsAny <int>(), It.IsAny <string>(), It.IsAny <Dictionary <string, string> >(), It.IsAny <DateTime>(), It.IsAny <string>()), Times.Once); mockApplicationProvider.Verify(m => m.ShareApplications(It.IsAny <int>(), It.IsAny <string>(), It.Is <Dictionary <string, string> >(d => d[applicantId].Equals("THE_URL")), It.IsAny <DateTime>(), It.IsAny <string>()), Times.Once); mockUrlHelper.Verify(m => m.RouteUrl(It.IsAny <string>(), It.Is <RouteValueDictionary>(rvd => rvd["application"].ToString().Contains("+"))), Times.Never); mockUrlHelper.Verify(m => m.RouteUrl(It.IsAny <string>(), It.Is <RouteValueDictionary>(rvd => rvd["application"].ToString().Contains("/"))), Times.Never); }
public ActionResult ShareApplications(ShareApplicationsViewModel viewModel) { var response = _applicationMediator.ShareApplications(viewModel, Url); switch (response.Code) { case ApplicationMediatorCodes.ShareApplications.Ok: SetUserMessage($"You have shared {response.ViewModel.SelectedApplicationIds.Count()} applications with {viewModel.RecipientEmailAddress}"); return(View(response.ViewModel)); case ApplicationMediatorCodes.ShareApplications.FailedValidation: response.ValidationResult.AddToModelStateWithSeverity(ModelState, string.Empty); return(View(response.ViewModel)); default: throw new InvalidMediatorCodeException(response.Code); } }