Skip to content

Commit

Permalink
Merge pull request #23 from IliyanIlievPH/21
Browse files Browse the repository at this point in the history
Send partner welcome email after email verification
  • Loading branch information
starkmsu committed Jun 11, 2020
2 parents 4f1a6f0 + 7bc7d4f commit a78643b
Show file tree
Hide file tree
Showing 8 changed files with 51 additions and 29 deletions.
4 changes: 2 additions & 2 deletions settings.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -44,8 +44,8 @@ AdminManagementService:
settings-key: AdminManagementService-PartnerAdminWelcomeEmail-EmailTemplateId
SubjectTemplateId:
settings-key: AdminManagementService-PartnerAdminWelcomeEmail-SubjectTemplateId
VerificationLinkPath:
settings-key: AdminManagementService-PartnerAdminWelcomeEmail-VerificationLinkPath
PartnersLinkPath:
settings-key: AdminManagementService-PartnerAdminWelcomeEmail-PartnersLinkPath

SessionsService:
ServiceUrl:
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ namespace MAVN.Service.AdminManagement.Domain.Services
public interface INotificationsService
{
Task NotifyAdminCreatedAsync(AdminCreatedEmailDto model);
Task NotifyPartnerAdminWelcomeAsync(AdminCreatedEmailDto model);
Task NotifyPartnerAdminWelcomeAsync(string userId, string email);
Task NotifyAdminPasswordResetAsync(string adminUserId, string email, string login, string password, string name);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -27,8 +27,6 @@ namespace MAVN.Service.AdminManagement.DomainServices
{
public class AdminUserService : IAdminUserService
{
private const string PartnerPermissionsName = "ProgramPartners";

private readonly IAdminUsersRepository _adminUsersRepository;
private readonly INotificationsService _notificationsService;
private readonly ICredentialsClient _credentialsClient;
Expand Down Expand Up @@ -273,7 +271,7 @@ public async Task<RegistrationResultModel> RegisterAsync(RegistrationRequestDto

#endregion

await SendNotification(model, adminId, emailVerificationCode, model.Permissions);
await SendAdminCreatedNotification(model, adminId, emailVerificationCode, model.Permissions);

_log.Info(message: "Successfully generated AdminCreatedEmail", context: adminId);

Expand Down Expand Up @@ -378,7 +376,7 @@ public async Task<List<Permission>> GetPermissionsAsync(string adminId)
return permissions;
}

private async Task SendNotification(RegistrationRequestDto model, string adminId, string emailVerificationCode, IReadOnlyList<Permission> permissions)
private async Task SendAdminCreatedNotification(RegistrationRequestDto model, string adminId, string emailVerificationCode, IReadOnlyList<Permission> permissions)
{
var adminCreatedDto = new AdminCreatedEmailDto
{
Expand All @@ -390,13 +388,7 @@ private async Task SendNotification(RegistrationRequestDto model, string adminId
Localization = model.Localization
};

var partnersPermissions = permissions.FirstOrDefault(x => x.Type == PartnerPermissionsName);

//check if it is program partner
if (partnersPermissions != null && partnersPermissions.Level == PermissionLevel.PartnerEdit)
await _notificationsService.NotifyPartnerAdminWelcomeAsync(adminCreatedDto);
else
await _notificationsService.NotifyAdminCreatedAsync(adminCreatedDto);
await _notificationsService.NotifyAdminCreatedAsync(adminCreatedDto);
}

private async Task<IReadOnlyList<AdminUser>> LoadSensitiveDataAsync(
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
using System;
using System.Linq;
using System.Threading.Tasks;
using Common;
using Common.Log;
Expand All @@ -13,17 +14,25 @@ namespace MAVN.Service.AdminManagement.DomainServices
{
public class EmailVerificationService : IEmailVerificationService
{
private const string PartnerPermissionsName = "ProgramPartners";

private readonly IEmailVerificationCodeRepository _emailVerificationCodeRepository;
private readonly IRabbitPublisher<AdminEmailVerifiedEvent> _codeVerifiedEventPublisher;
private readonly INotificationsService _notificationsService;
private readonly IAdminUserService _adminUserService;
private readonly ILog _log;

public EmailVerificationService(
IEmailVerificationCodeRepository emailVerificationCodeRepository,
IRabbitPublisher<AdminEmailVerifiedEvent> codeVerifiedEventPublisher,
INotificationsService notificationsService,
IAdminUserService adminUserService,
ILogFactory logFactory)
{
_emailVerificationCodeRepository = emailVerificationCodeRepository;
_codeVerifiedEventPublisher = codeVerifiedEventPublisher;
_notificationsService = notificationsService;
_adminUserService = adminUserService;
_log = logFactory.CreateLog(this);
}

Expand Down Expand Up @@ -88,6 +97,14 @@ await Task.WhenAll(_emailVerificationCodeRepository.SetAsVerifiedAsync(verificat
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 };
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ public class NotificationsService : INotificationsService
private readonly string _adminPasswordResetEmailSubjectTemplateId;
private readonly string _partnerAdminWelcomeEmailTemplateId;
private readonly string _partnerAdminWelcomeEmailSubjectTemplateId;
private readonly string _partnerAdminCreatedVerificationLinkPath;
private readonly string _partnerAdminWelcomeLinkPath;

public NotificationsService(
IRabbitPublisher<EmailMessageEvent> emailsPublisher,
Expand All @@ -32,7 +32,7 @@ public class NotificationsService : INotificationsService
string adminPasswordResetEmailSubjectTemplateId,
string partnerAdminWelcomeEmailTemplateId,
string partnerAdminWelcomeEmailSubjectTemplateId,
string partnerAdminCreatedVerificationLinkPath)
string partnerAdminWelcomeLinkPath)
{
_emailsPublisher = emailsPublisher;
_backOfficeUrl = backOfficeUrl;
Expand All @@ -43,7 +43,7 @@ public class NotificationsService : INotificationsService
_adminPasswordResetEmailSubjectTemplateId = adminPasswordResetEmailSubjectTemplateId;
_partnerAdminWelcomeEmailTemplateId = partnerAdminWelcomeEmailTemplateId;
_partnerAdminWelcomeEmailSubjectTemplateId = partnerAdminWelcomeEmailSubjectTemplateId;
_partnerAdminCreatedVerificationLinkPath = partnerAdminCreatedVerificationLinkPath;
_partnerAdminWelcomeLinkPath = partnerAdminWelcomeLinkPath;
}

public async Task NotifyAdminCreatedAsync(AdminCreatedEmailDto model)
Expand All @@ -64,21 +64,14 @@ public async Task NotifyAdminCreatedAsync(AdminCreatedEmailDto model)
_adminCreatedEmailSubjectTemplateId);
}

public async Task NotifyPartnerAdminWelcomeAsync(AdminCreatedEmailDto model)
public async Task NotifyPartnerAdminWelcomeAsync(string userId, string email)
{
var url = GetLocalizedPath(_backOfficeUrl, model.Localization);

var values = new Dictionary<string, string>
{
{nameof(model.Name), model.Name},
{"BackOfficeUrl", url},
{"PartnersUrl", url + _partnerAdminCreatedVerificationLinkPath.TrimStart('/').Replace("{0}", model.EmailVerificationCode)},
{"Login", model.Email},
{nameof(model.Password), model.Password},
{nameof(model.Localization), model.Localization.ToString()}
{"PartnersUrl", _backOfficeUrl + _partnerAdminWelcomeLinkPath.TrimStart('/')},
};

await SendEmailAsync(model.AdminUserId, model.Email, values, _partnerAdminWelcomeEmailTemplateId,
await SendEmailAsync(userId, email, values, _partnerAdminWelcomeEmailTemplateId,
_partnerAdminWelcomeEmailSubjectTemplateId);
}

Expand Down
2 changes: 1 addition & 1 deletion src/MAVN.Service.AdminManagement/Modules/ServiceModule.cs
Original file line number Diff line number Diff line change
Expand Up @@ -89,7 +89,7 @@ protected override void Load(ContainerBuilder builder)
.WithParameter("adminPasswordResetEmailSubjectTemplateId", _appSettings.CurrentValue.AdminManagementService.PasswordResetEmail.SubjectTemplateId)
.WithParameter("partnerAdminWelcomeEmailTemplateId", _appSettings.CurrentValue.AdminManagementService.PartnerAdminWelcomeEmail.EmailTemplateId)
.WithParameter("partnerAdminWelcomeEmailSubjectTemplateId", _appSettings.CurrentValue.AdminManagementService.PartnerAdminWelcomeEmail.SubjectTemplateId)
.WithParameter("partnerAdminCreatedVerificationLinkPath", _appSettings.CurrentValue.AdminManagementService.PartnerAdminWelcomeEmail.VerificationLinkPath)
.WithParameter("partnerAdminWelcomeLinkPath", _appSettings.CurrentValue.AdminManagementService.PartnerAdminWelcomeEmail.PartnersLinkPath)
.SingleInstance();

builder.RegisterType<StartupManager>()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,6 @@ public class PartnerAdminWelcomeEmail
{
public string EmailTemplateId { set; get; }
public string SubjectTemplateId { set; get; }
public string VerificationLinkPath { set; get; }
public string PartnersLinkPath { set; get; }
}
}
Original file line number Diff line number Diff line change
@@ -1,10 +1,12 @@
using System;
using System.Collections.Generic;
using System.Threading.Tasks;
using Common;
using Lykke.Logs;
using Lykke.Logs.Loggers.LykkeConsole;
using MAVN.Service.AdminManagement.Contract.Events;
using MAVN.Service.AdminManagement.Domain.Enums;
using MAVN.Service.AdminManagement.Domain.Models;
using MAVN.Service.AdminManagement.Domain.Models.Verification;
using MAVN.Service.AdminManagement.Domain.Repositories;
using MAVN.Service.AdminManagement.Domain.Services;
Expand All @@ -15,6 +17,9 @@ namespace MAVN.Service.AdminManagement.DomainServices.Tests
{
public class EmailVerificationServiceTests
{
private readonly Mock<IAdminUserService> _adminUserServiceMock = new Mock<IAdminUserService>();
private readonly Mock<INotificationsService> _notificationsServiceMock = new Mock<INotificationsService>();

[Fact]
public async Task UserTriesToConfirmEmail_WithNewAdmin_Successfully()
{
Expand All @@ -35,6 +40,9 @@ public async Task UserTriesToConfirmEmail_WithNewAdmin_Successfully()
verificationEmailRepository
.Setup(x => x.CreateOrUpdateAsync(It.IsAny<string>(), It.IsAny<string>()))
.ReturnsAsync((IVerificationCode)null);

_adminUserServiceMock.Setup(x => x.GetByIdAsync(It.IsAny<string>()))
.ReturnsAsync(new AdminUserResult {Profile = new AdminUser {Permissions = new List<Permission>()}});

var publisherCodeVerified = new Mock<IRabbitPublisher<AdminEmailVerifiedEvent>>();

Expand All @@ -44,6 +52,8 @@ public async Task UserTriesToConfirmEmail_WithNewAdmin_Successfully()
emailVerificationService = new EmailVerificationService(
verificationEmailRepository.Object,
publisherCodeVerified.Object,
_notificationsServiceMock.Object,
_adminUserServiceMock.Object,
logFactory
);
}
Expand Down Expand Up @@ -81,6 +91,8 @@ public async Task UserTriesToConfirmEmail_WithAdminThatDoesNotExists_AdminNotExi
emailVerificationService = new EmailVerificationService(
verificationEmailRepository.Object,
publisherCodeVerified.Object,
_notificationsServiceMock.Object,
_adminUserServiceMock.Object,
logFactory
);
}
Expand Down Expand Up @@ -114,6 +126,8 @@ public async Task UserTriesToConfirmEmail_WithVerificationCodeThatNotExistsInThe
emailVerificationService = new EmailVerificationService(
verificationEmailRepository.Object,
publisherCodeVerified.Object,
_notificationsServiceMock.Object,
_adminUserServiceMock.Object,
logFactory
);
}
Expand Down Expand Up @@ -155,6 +169,8 @@ public async Task UserTriesToConfirmEmail_WithVerificationCodeThatHasAlreadyExpi
emailVerificationService = new EmailVerificationService(
verificationEmailRepository.Object,
publisherCodeVerified.Object,
_notificationsServiceMock.Object,
_adminUserServiceMock.Object,
logFactory
);
}
Expand Down Expand Up @@ -190,6 +206,8 @@ public async Task UserTriesToConfirmEmail_WithAdminThatIsAlreadyVerified_Already
emailVerificationService = new EmailVerificationService(
verificationEmailRepository.Object,
publisherCodeVerified.Object,
_notificationsServiceMock.Object,
_adminUserServiceMock.Object,
logFactory
);
}
Expand Down Expand Up @@ -229,6 +247,8 @@ public async Task UserTriesToConfirmEmail_WithVerificationCodeThatNotExistsInThe
emailVerificationService = new EmailVerificationService(
verificationEmailRepository.Object,
publisherCodeVerified.Object,
_notificationsServiceMock.Object,
_adminUserServiceMock.Object,
logFactory
);
}
Expand Down

0 comments on commit a78643b

Please sign in to comment.