public async Task SendProvisionerLinkAsync(string[] recipients, EnrolmentCertificateAccessToken token, string provisionerName = null) { if (!AreValidEmails(recipients)) { // TODO Log invalid email, cannot send throw new ArgumentException("Cannot send provisioner link, supplied email address(es) are invalid."); } if (token.Enrollee == null) { await _context.Entry(token).Reference(t => t.Enrollee).LoadAsync(); } // Always send a copy to the enrollee var ccEmails = new List <string>() { token.Enrollee.ContactEmail }; string subject = "New Access Request"; string viewName = string.IsNullOrEmpty(provisionerName) ? "/Views/Emails/OfficeManagerEmail.cshtml" : "/Views/Emails/VendorEmail.cshtml"; string emailBody = await _razorConverterService.RenderViewToStringAsync(viewName, new EmailParams(token, provisionerName)); await Send(PRIME_EMAIL, recipients, ccEmails, subject, emailBody, Enumerable.Empty <(string Filename, byte[] Content)>()); }
public async void testHappyPathCertificateAccess() { Enrollee enrollee = TestDb.Has(TestUtils.EnrolleeFaker.Generate()); var service = CreateWithMocks(enrollee); EnrolmentCertificateAccessToken token = await service.CreateCertificateAccessTokenAsync(enrollee); Assert.NotNull(token); EnrolmentCertificate cert = await service.GetEnrolmentCertificateAsync(token.Id); Assert.NotNull(cert); Assert.Equal(enrollee.GPID, cert.GPID); }
public async void testExpiryDate() { TimeSpan tokenLifespan = TimeSpan.FromDays(7); TimeSpan tolerance = TimeSpan.FromSeconds(1); Enrollee enrollee = TestDb.Has(TestUtils.EnrolleeFaker.Generate()); var service = CreateWithMocks(enrollee); EnrolmentCertificateAccessToken token = await service.CreateCertificateAccessTokenAsync(enrollee); Assert.NotNull(token); // Assert that the difference between the computed and actual expiry date is less than some tolerance. Assert.True((DateTimeOffset.Now.Add(tokenLifespan) - token.Expires).Duration() < tolerance); token.Expires = DateTimeOffset.Now.AddHours(-1); Assert.Null(await service.GetEnrolmentCertificateAsync(token.Id)); }
public async void testMaxViews() { int tokenMaxViews = 3; Enrollee enrollee = TestDb.Has(TestUtils.EnrolleeFaker.Generate()); var service = CreateService(); EnrolmentCertificateAccessToken token = await service.CreateCertificateAccessTokenAsync(enrollee); Assert.NotNull(token); Assert.Equal(0, token.ViewCount); for (int view = 1; view <= tokenMaxViews; view++) { Assert.NotNull(await service.GetEnrolmentCertificateAsync(token.Id)); Assert.Equal(view, token.ViewCount); } Assert.Null(await service.GetEnrolmentCertificateAsync(token.Id)); }
public async Task <EnrolmentCertificateAccessToken> CreateCertificateAccessTokenAsync(int enrolleeId) { EnrolmentCertificateAccessToken token = new EnrolmentCertificateAccessToken() { EnrolleeId = enrolleeId, ViewCount = 0, Expires = DateTimeOffset.Now.Add(EnrolmentCertificateAccessToken.Lifespan), Active = true }; _context.EnrolmentCertificateAccessTokens.Add(token); if (await _context.SaveChangesAsync() < 1) { throw new InvalidOperationException("Could not create Enrolment Certificate access token."); } return(token); }
public async Task <EnrolmentCertificateAccessToken> CreateCertificateAccessTokenAsync(Enrollee enrollee) { EnrolmentCertificateAccessToken token = new EnrolmentCertificateAccessToken() { Enrollee = enrollee, ViewCount = 0, Active = true }; _context.EnrolmentCertificateAccessTokens.Add(token); var created = await _context.SaveChangesAsync(); if (created < 1) { throw new InvalidOperationException("Could not create Enrolment Certificate access token."); } return(token); }
public async Task SendProvisionerLinkAsync(string[] recipients, EnrolmentCertificateAccessToken token, int careSettingCode) { if (!AreValidEmails(recipients)) { // TODO Log invalid email, cannot send throw new ArgumentException("Cannot send provisioner link, supplied email address(es) are invalid."); } if (token.Enrollee == null) { await _context.Entry(token).Reference(t => t.Enrollee).LoadAsync(); } // Always send a copy to the enrollee var ccEmails = new List <string>() { token.Enrollee.Email }; string subject = "New Access Request"; string viewName = null; switch (careSettingCode) { case (int)CareSettingType.CommunityPharmacy: viewName = "/Views/Emails/CommunityPharmacyManagerEmail.cshtml"; break; case (int)CareSettingType.HealthAuthority: viewName = "/Views/Emails/HealthAuthorityEmail.cshtml"; break; default: viewName = "/Views/Emails/OfficeManagerEmail.cshtml"; break; } string emailBody = await _razorConverterService.RenderViewToStringAsync(viewName, new EmailParams(token)); await Send(PRIME_EMAIL, recipients, ccEmails, subject, emailBody, Enumerable.Empty <(string Filename, byte[] Content)>()); }
private async Task UpdateTokenMetadataAsync(EnrolmentCertificateAccessToken token) { if (!token.Active) { return; } // TODO: View limit has been removed temporarily if (/*token.ViewCount >= MAX_VIEWS ||*/ DateTimeOffset.Now > token.Expires) { token.Active = false; } else { token.ViewCount++; } if (await _context.SaveChangesAsync() < 1) { throw new InvalidOperationException("Could not update Enrolment Certificate access token."); } }
public async Task SendProvisionerLinkAsync(IEnumerable <string> emails, EnrolmentCertificateAccessToken token, int careSettingCode) { var enrolleeDto = await _context.Enrollees .Where(e => e.Id == token.EnrolleeId) .Select(e => new { e.FirstName, e.LastName, e.Email }) .SingleAsync(); var viewModel = new ProvisionerAccessEmailViewModel { EnrolleeFullName = $"{enrolleeDto.FirstName} {enrolleeDto.LastName}", TokenUrl = token.FrontendUrl, ExpiresInDays = EnrolmentCertificateAccessToken.Lifespan.Days }; var email = await _emailRenderingService.RenderProvisionerLinkEmailAsync(emails, enrolleeDto.Email, (CareSettingType)careSettingCode, viewModel); await Send(email); }
public Task SendProvisionerLinkAsync(string[] recipients, EnrolmentCertificateAccessToken token, string provisionerName = null) { throw new System.NotImplementedException(); }