diff --git a/Slack.Automation/Promact.Core.Repository/Client/Client.cs b/Slack.Automation/Promact.Core.Repository/Client/Client.cs index 2d083fbe..6f734653 100644 --- a/Slack.Automation/Promact.Core.Repository/Client/Client.cs +++ b/Slack.Automation/Promact.Core.Repository/Client/Client.cs @@ -10,11 +10,12 @@ using Promact.Erp.Util.StringConstants; using System; using System.Collections.Generic; -using System.Net.Http; using System.Threading.Tasks; using Promact.Core.Repository.EmailServiceTemplateRepository; using Promact.Erp.Util.HttpClient; using Promact.Erp.DomainModel.DataRepository; +using System.Linq; +using Promact.Core.Repository.MailSettingDetailsByProjectAndModule; namespace Promact.Core.Repository.Client { @@ -31,6 +32,7 @@ public class Client : IClient private readonly IEmailServiceTemplateRepository _emailTemplateRepository; private readonly IRepository _incomingWebHook; private readonly ApplicationUserManager _userManager; + private readonly IMailSettingDetailsByProjectAndModuleRepository _mailSettingDetails; #endregion #region Constructor @@ -38,7 +40,7 @@ public class Client : IClient IEmailService emailService, IAttachmentRepository attachmentRepository, IHttpClientService httpClientService, IEnvironmentVariableRepository envVariableRepository, ISlackUserRepository slackUserRepository, IEmailServiceTemplateRepository emailTemplateRepository, IRepository incomingWebHook, - ApplicationUserManager userManager) + ApplicationUserManager userManager, IMailSettingDetailsByProjectAndModuleRepository mailSettingDetails) { _stringConstant = stringConstant; _oauthCallRepository = oauthCallRepository; @@ -50,6 +52,7 @@ public class Client : IClient _emailTemplateRepository = emailTemplateRepository; _incomingWebHook = incomingWebHook; _userManager = userManager; + _mailSettingDetails = mailSettingDetails; } #endregion @@ -124,11 +127,12 @@ public async Task SendSickLeaveMessageToUserIncomingWebhookAsync(LeaveRequest le if (incomingWebHook != null) await _httpClientService.PostAsync(incomingWebHook.IncomingWebHookUrl, slashIncomingWebhookJsonText, _stringConstant.JsonContentString); EmailApplication email = new EmailApplication(); + email.To = new List(); // creating email templates corresponding to leave applied email.Body = _emailTemplateRepository.EmailServiceTemplateSickLeave(leaveRequest); email.From = managementEmail; email.Subject = _stringConstant.EmailSubject; - email.To = user.Email; + email.To.Add(user.Email); _emailService.Send(email); } #endregion @@ -143,16 +147,25 @@ public async Task SendSickLeaveMessageToUserIncomingWebhookAsync(LeaveRequest le /// Attachment to be send to team leader and management private async Task GetAttachmentAndSendToTLAndManagementAsync(string userId, LeaveRequest leaveRequest, string accessToken, List attachment) { - var teamLeaders = await _oauthCallRepository.GetTeamLeaderUserIdAsync(userId, accessToken); - var management = await _oauthCallRepository.GetManagementUserNameAsync(accessToken); - var userDetail = await _oauthCallRepository.GetUserByUserIdAsync(userId, accessToken); - foreach (var user in management) + EmailApplication email = new EmailApplication(); + email.To = new List(); + email.CC = new List(); + var listOfprojectRelatedToUser = (await _oauthCallRepository.GetListOfProjectsEnrollmentOfUserByUserIdAsync(userId, accessToken)).Select(x => x.Id).ToList(); + foreach (var projectId in listOfprojectRelatedToUser) { - teamLeaders.Add(user); + var mailsetting = await _mailSettingDetails.GetMailSettingAsync(projectId, _stringConstant.LeaveModule, userId); + email.To.AddRange(mailsetting.To); + email.CC.AddRange(mailsetting.CC); } - foreach (var teamLeader in teamLeaders) + email.To = email.To.Distinct().ToList(); + email.CC = email.CC.Distinct().ToList(); + var teamLeaderIds = (await _oauthCallRepository.GetTeamLeaderUserIdAsync(userId, accessToken)).Select(x=>x.Id).ToList(); + var managementIds = (await _oauthCallRepository.GetManagementUserNameAsync(accessToken)).Select(x=>x.Id); + var userEmail = (await _userManager.FindByIdAsync(userId)).Email; + teamLeaderIds.AddRange(managementIds); + foreach (var teamLeaderId in teamLeaderIds) { - var user = await _userManager.FindByIdAsync(teamLeader.Id); + var user = await _userManager.FindByIdAsync(teamLeaderId); var slackUser = await _slackUserRepository.GetByIdAsync(user.SlackUserId); var incomingWebHook = await _incomingWebHook.FirstOrDefaultAsync(x => x.UserId == user.SlackUserId); //Creating an object of SlashIncomingWebhook as this format of value required while responsing to slack @@ -160,7 +173,9 @@ private async Task GetAttachmentAndSendToTLAndManagementAsync(string userId, Lea var slashIncomingWebhookJsonText = JsonConvert.SerializeObject(slashIncomingWebhookText); if (incomingWebHook != null) await _httpClientService.PostAsync(incomingWebHook.IncomingWebHookUrl, slashIncomingWebhookJsonText, _stringConstant.JsonContentString); - EmailApplication email = new EmailApplication(); + } + if (email.To.Any()) + { if (leaveRequest.EndDate != null) { // creating email templates corresponding to leave applied for casual leave @@ -171,9 +186,8 @@ private async Task GetAttachmentAndSendToTLAndManagementAsync(string userId, Lea // creating email templates corresponding to leave applied for casual leave email.Body = _emailTemplateRepository.EmailServiceTemplateSickLeave(leaveRequest); } - email.From = userDetail.Email; + email.From = userEmail; email.Subject = _stringConstant.EmailSubject; - email.To = teamLeader.Email; _emailService.Send(email); } } diff --git a/Slack.Automation/Promact.Core.Repository/MailSettingDetailsByProjectAndModule/IMailSettingDetailsByProjectAndModuleRepository.cs b/Slack.Automation/Promact.Core.Repository/MailSettingDetailsByProjectAndModule/IMailSettingDetailsByProjectAndModuleRepository.cs new file mode 100644 index 00000000..6ff16e86 --- /dev/null +++ b/Slack.Automation/Promact.Core.Repository/MailSettingDetailsByProjectAndModule/IMailSettingDetailsByProjectAndModuleRepository.cs @@ -0,0 +1,18 @@ +using Promact.Erp.DomainModel.ApplicationClass; +using System.Collections.Generic; +using System.Threading.Tasks; + +namespace Promact.Core.Repository.MailSettingDetailsByProjectAndModule +{ + public interface IMailSettingDetailsByProjectAndModuleRepository + { + /// + /// Method used to get mail setting for a module by projectId + /// + /// project Id + /// mail setting module + /// user's user Id + /// mail setting details + Task GetMailSettingAsync(int projectId, string module, string userId); + } +} diff --git a/Slack.Automation/Promact.Core.Repository/MailSettingDetailsByProjectAndModule/MailSettingDetailsByProjectAndModuleRepository.cs b/Slack.Automation/Promact.Core.Repository/MailSettingDetailsByProjectAndModule/MailSettingDetailsByProjectAndModuleRepository.cs new file mode 100644 index 00000000..5c24acb7 --- /dev/null +++ b/Slack.Automation/Promact.Core.Repository/MailSettingDetailsByProjectAndModule/MailSettingDetailsByProjectAndModuleRepository.cs @@ -0,0 +1,124 @@ +using Promact.Core.Repository.AttachmentRepository; +using Promact.Core.Repository.OauthCallsRepository; +using Promact.Erp.DomainModel.ApplicationClass; +using Promact.Erp.DomainModel.DataRepository; +using Promact.Erp.DomainModel.Models; +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; + +namespace Promact.Core.Repository.MailSettingDetailsByProjectAndModule +{ + public class MailSettingDetailsByProjectAndModuleRepository : IMailSettingDetailsByProjectAndModuleRepository + { + #region Private Variables + private readonly IRepository _mailSettingDataRepository; + private readonly IRepository _mailSettingMappingDataRepository; + private readonly IRepository _groupEmailMappingDataRepository; + private readonly IRepository _groupDataRepository; + private readonly IOauthCallsRepository _oauthCallRepository; + private readonly IAttachmentRepository _attachmentRepository; + private readonly ApplicationUserManager _userManager; + #endregion + + #region Constructor + public MailSettingDetailsByProjectAndModuleRepository(IRepository mailSettingDataRepository, + IRepository mailSettingMappingDataRepository, IRepository groupEmailMappingDataRepository, + IRepository groupDataRepository, IOauthCallsRepository oauthCallRepository, IAttachmentRepository attachmentRepository, + ApplicationUserManager userManager) + { + _mailSettingDataRepository = mailSettingDataRepository; + _mailSettingMappingDataRepository = mailSettingMappingDataRepository; + _groupEmailMappingDataRepository = groupEmailMappingDataRepository; + _groupDataRepository = groupDataRepository; + _oauthCallRepository = oauthCallRepository; + _attachmentRepository = attachmentRepository; + _userManager = userManager; + } + #endregion + + #region Public Method + /// + /// Method used to get mail setting for a module by projectId + /// + /// project Id + /// mail setting module + /// user's user Id + /// mail setting details + public async Task GetMailSettingAsync(int projectId, string module, string userId) + { + MailSettingAC mailSetting = new MailSettingAC(); + mailSetting.To = new List(); + mailSetting.CC = new List(); + // check mail setting for module and project is exist or not + if (_mailSettingDataRepository.Any(x => x.ProjectId == projectId && x.Module == module)) + { + var mailSettingDetails = await _mailSettingDataRepository.FirstOrDefaultAsync(x => x.ProjectId == projectId && x.SendMail && x.Module == module); + if (mailSettingDetails != null) + { + mailSetting.Id = mailSettingDetails.Id; + mailSetting.Module = mailSettingDetails.Module; + mailSetting.ProjectId = mailSettingDetails.ProjectId; + mailSetting.SendMail = mailSettingDetails.SendMail; + mailSetting.To = await GetListOfEmailByMailSettingAsync(true, mailSettingDetails.Id, userId, projectId); + mailSetting.CC = await GetListOfEmailByMailSettingAsync(false, mailSettingDetails.Id, userId, projectId); + } + } + return mailSetting; + } + #endregion + + #region Private Method + /// + /// Method to get list of emails for a mail setting + /// + /// is To or CC + /// mail setting Id + /// user's user Id + /// project Id + /// + private async Task> GetListOfEmailByMailSettingAsync(bool isTo, int mailSettingId, string userId, int projectId) + { + List emails = new List(); + var mailSettingMappings = (await _mailSettingMappingDataRepository.FetchAsync(x => x.MailSettingId == mailSettingId && x.IsTo == isTo)).ToList(); + if (mailSettingMappings.Any()) + { + foreach (var mailSetingMapping in mailSettingMappings) + { + // if mail setting have email + if (!string.IsNullOrEmpty(mailSetingMapping.Email)) + emails.Add(mailSetingMapping.Email); + // if mail setting have mapping of group + else + { + // to get name of group + var groupName = (await _groupDataRepository.FirstAsync(x => x.Id == mailSetingMapping.GroupId)).Name; + // to get access token of user + var accessToken = await _attachmentRepository.UserAccessTokenAsync((await _userManager.FindByIdAsync(userId)).UserName); + switch (groupName) + { + // Dynamic group - Team Leader + case "Team Leader": + emails.AddRange((await _oauthCallRepository.GetTeamLeaderUserIdAsync(userId, accessToken)).Select(x => x.Email)); + break; + // Dynamic group - Management + case "Management": + emails.AddRange((await _groupEmailMappingDataRepository.FetchAsync(x => x.GroupId == mailSetingMapping.GroupId)).Select(x => x.Email)); + break; + // Dynamic group - Team Members + case "Team Members": + emails.AddRange((await _oauthCallRepository.GetAllTeamMemberByProjectIdAsync(projectId, accessToken)).Select(x => x.Email)); + break; + // Static group + default: + emails.AddRange((await _groupEmailMappingDataRepository.FetchAsync(x => x.GroupId == mailSetingMapping.GroupId)).Select(x => x.Email)); + break; + } + } + } + } + return emails; + } + #endregion + } +} diff --git a/Slack.Automation/Promact.Core.Repository/MailSettingRepository/MailSettingRepository.cs b/Slack.Automation/Promact.Core.Repository/MailSettingRepository/MailSettingRepository.cs index 43ec44f7..8d653158 100644 --- a/Slack.Automation/Promact.Core.Repository/MailSettingRepository/MailSettingRepository.cs +++ b/Slack.Automation/Promact.Core.Repository/MailSettingRepository/MailSettingRepository.cs @@ -41,6 +41,7 @@ public class MailSettingRepository : IMailSettingRepository /// list of project public async Task> GetAllProjectAsync() { + // returns list of project which are active return ((await _oauthCallRepository.GetAllProjectsAsync()).FindAll(x => x.IsActive)); } @@ -53,31 +54,15 @@ public async Task> GetAllProjectAsync() public async Task GetMailSettingDetailsByProjectIdAsync(int projectId, string module) { MailSettingAC mailSetting = new MailSettingAC(); + // check mail setting for project and module is exist or not var mailSettingDetails = await _mailSettingDataRepository.FirstOrDefaultAsync(x => x.ProjectId == projectId && x.Module == module); if (mailSettingDetails != null) { - List listOfTo = new List(); - List listOfCC = new List(); mailSetting = _mapper.Map(mailSettingDetails); - var mailSettingMappingList = (await _mailSettingMappingDataRepository.FetchAsync(x => x.MailSettingId == mailSettingDetails.Id)).ToList(); - var listOfMailSettingTo = mailSettingMappingList.FindAll(x => x.IsTo); - var listOfMailSettingCC = mailSettingMappingList.FindAll(x => !x.IsTo); - foreach (var to in listOfMailSettingTo) - { - if (to.GroupId == null) - listOfTo.Add(to.Email); - else - listOfTo.Add((await _groupDataRepository.FirstAsync(x => x.Id == to.GroupId)).Name); - } - foreach (var cc in listOfMailSettingCC) - { - if (cc.GroupId == null) - listOfCC.Add(cc.Email); - else - listOfCC.Add((await _groupDataRepository.FirstAsync(x => x.Id == cc.GroupId)).Name); - } - mailSetting.To = listOfTo; - mailSetting.CC = listOfCC; + // get list of To + mailSetting.To = await GetListOfEmailByMailSettingAsync(true, mailSetting.Id); + // get list of CC + mailSetting.CC = await GetListOfEmailByMailSettingAsync(false, mailSetting.Id); } return mailSetting; } @@ -92,18 +77,10 @@ public async Task AddMailSettingAsync(MailSettingAC mailSettingAC) mailSetting.CreatedOn = DateTime.UtcNow; _mailSettingDataRepository.Insert(mailSetting); await _mailSettingDataRepository.SaveChangesAsync(); - foreach (var to in mailSettingAC.To) - { - var mailSettingMapping = await MailSettingMappingGeneratorAsync(to, true, mailSetting.Id); - mailSettingMapping.CreatedOn = DateTime.UtcNow; - _mailSettingMappingDataRepository.Insert(mailSettingMapping); - } - foreach (var cc in mailSettingAC.CC) - { - var mailSettingMapping = await MailSettingMappingGeneratorAsync(cc, false, mailSetting.Id); - mailSettingMapping.CreatedOn = DateTime.UtcNow; - _mailSettingMappingDataRepository.Insert(mailSettingMapping); - } + // add list of To + await AddMailSettingMappingAsync(mailSettingAC.To, true, mailSetting.Id, DateTime.UtcNow); + // add list of CC + await AddMailSettingMappingAsync(mailSettingAC.CC, false, mailSetting.Id, DateTime.UtcNow); await _mailSettingMappingDataRepository.SaveChangesAsync(); } @@ -113,7 +90,8 @@ public async Task AddMailSettingAsync(MailSettingAC mailSettingAC) /// list of group public async Task> GetListOfGroupsNameAsync() { - return (await _groupDataRepository.GetAll().ToListAsync()).Select(x=>x.Name).ToList(); + // return list of group name + return (await _groupDataRepository.GetAll().ToListAsync()).Select(x => x.Name).ToList(); } /// @@ -122,26 +100,20 @@ public async Task> GetListOfGroupsNameAsync() /// mail setting details public async Task UpdateMailSettingAsync(MailSettingAC mailSettingAC) { + // mail setting details to be updated var previousMailSetting = await _mailSettingDataRepository.FirstAsync(x => x.Id == mailSettingAC.Id); + // mail setting mapping created date, to be updated var previousMailSettingMappingCreatedDateTime = (await _mailSettingMappingDataRepository.FirstAsync(x => x.MailSettingId == mailSettingAC.Id)).CreatedOn; previousMailSetting.SendMail = mailSettingAC.SendMail; previousMailSetting.UpdatedDate = DateTime.UtcNow; _mailSettingDataRepository.Update(previousMailSetting); await _mailSettingDataRepository.SaveChangesAsync(); - if (_mailSettingMappingDataRepository.Any(x => x.MailSettingId == mailSettingAC.Id)) - _mailSettingMappingDataRepository.RemoveRange(x => x.MailSettingId == mailSettingAC.Id); - foreach (var to in mailSettingAC.To) - { - var mailSettingMapping = await MailSettingMappingGeneratorAsync(to, true, mailSettingAC.Id); - mailSettingMapping.CreatedOn = previousMailSettingMappingCreatedDateTime; - _mailSettingMappingDataRepository.Insert(mailSettingMapping); - } - foreach (var cc in mailSettingAC.CC) - { - var mailSettingMapping = await MailSettingMappingGeneratorAsync(cc, false, mailSettingAC.Id); - mailSettingMapping.CreatedOn = previousMailSettingMappingCreatedDateTime; - _mailSettingMappingDataRepository.Insert(mailSettingMapping); - } + // removed all previous mail setting mapping + _mailSettingMappingDataRepository.RemoveRange(x => x.MailSettingId == mailSettingAC.Id); + // add list of To + await AddMailSettingMappingAsync(mailSettingAC.To, true, previousMailSetting.Id, previousMailSettingMappingCreatedDateTime); + // add list of CC + await AddMailSettingMappingAsync(mailSettingAC.CC, false, previousMailSetting.Id, previousMailSettingMappingCreatedDateTime); await _mailSettingMappingDataRepository.SaveChangesAsync(); } #endregion @@ -159,12 +131,53 @@ private async Task MailSettingMappingGeneratorAsync(string t MailSettingMapping mailSettingMapping = new MailSettingMapping(); mailSettingMapping.MailSettingId = mailSettingId; mailSettingMapping.IsTo = isTo; + // check whether mail setting for To or CC is group type or not if (_groupDataRepository.Any(x => x.Name == type)) mailSettingMapping.GroupId = (await _groupDataRepository.FirstAsync(x => x.Name == type)).Id; else mailSettingMapping.Email = type; return mailSettingMapping; } + + /// + /// Method to insert list of mail setting mapping + /// + /// list of email + /// boolean value is To + /// mail setting Id + /// created on date + /// + private async Task AddMailSettingMappingAsync(List listOfMailSettingEmail, bool isTo, int mailSettingId, DateTime createdOn) + { + foreach (var email in listOfMailSettingEmail) + { + var mailSettingMapping = await MailSettingMappingGeneratorAsync(email, isTo, mailSettingId); + mailSettingMapping.CreatedOn = createdOn; + _mailSettingMappingDataRepository.Insert(mailSettingMapping); + } + } + + /// + /// Method to get list of email by mail setting + /// + /// boolean value of isTo + /// mail setting Id + /// + private async Task> GetListOfEmailByMailSettingAsync(bool isTo, int mailSettingId) + { + List listOfEmail = new List(); + var listOfMailSetting = (await _mailSettingMappingDataRepository.FetchAsync(x => x.MailSettingId == mailSettingId)).ToList(); + listOfMailSetting = listOfMailSetting.FindAll(x => x.IsTo == isTo); + foreach (var to in listOfMailSetting) + { + // check if group Id is null or not, if not null then its group details else email address + if (to.GroupId == null) + listOfEmail.Add(to.Email); + else + listOfEmail.Add((await _groupDataRepository.FirstAsync(x => x.Id == to.GroupId)).Name); + } + return listOfEmail; + } #endregion } } diff --git a/Slack.Automation/Promact.Core.Repository/OauthCallsRepository/IOauthCallsRepository.cs b/Slack.Automation/Promact.Core.Repository/OauthCallsRepository/IOauthCallsRepository.cs index ea9e1978..b437c4a7 100644 --- a/Slack.Automation/Promact.Core.Repository/OauthCallsRepository/IOauthCallsRepository.cs +++ b/Slack.Automation/Promact.Core.Repository/OauthCallsRepository/IOauthCallsRepository.cs @@ -68,5 +68,21 @@ public interface IOauthCallsRepository /// user's access token from Promact OAuth Server /// true if user has admin role else false Task UserIsAdminAsync(string userId, string accessToken); + + /// + /// Method to get list of projects from oauth-server for an user + /// + /// userId of user + /// user's access token from Promact OAuth Server + /// + Task> GetListOfProjectsEnrollmentOfUserByUserIdAsync(string userId, string accessToken); + + /// + /// Method to get list of team member by project Id + /// + /// project Id + /// access token + /// + Task> GetAllTeamMemberByProjectIdAsync(int projectId, string accessToken); } } \ No newline at end of file diff --git a/Slack.Automation/Promact.Core.Repository/OauthCallsRepository/OauthCallsRepository.cs b/Slack.Automation/Promact.Core.Repository/OauthCallsRepository/OauthCallsRepository.cs index c191751a..1fd8e4c1 100644 --- a/Slack.Automation/Promact.Core.Repository/OauthCallsRepository/OauthCallsRepository.cs +++ b/Slack.Automation/Promact.Core.Repository/OauthCallsRepository/OauthCallsRepository.cs @@ -159,6 +159,42 @@ public async Task UserIsAdminAsync(string userId, string accessToken) } return result; } + + /// + /// Method to get list of projects from oauth-server for an user + /// + /// userId of user + /// user's access token from Promact OAuth Server + /// + public async Task> GetListOfProjectsEnrollmentOfUserByUserIdAsync(string userId, string accessToken) + { + List projects = new List(); + var requestUrl = string.Format(_stringConstant.FirstAndSecondIndexStringFormat, _stringConstant.UserDetailsUrl, userId); + var response = await _httpClientService.GetAsync(_stringConstant.ProjectUrl, requestUrl, accessToken); + if(response != null) + { + projects = JsonConvert.DeserializeObject>(response); + } + return projects; + } + + /// + /// Method to get list of team member by project Id + /// + /// project Id + /// access token + /// + public async Task> GetAllTeamMemberByProjectIdAsync(int projectId, string accessToken) + { + List teamMembers = new List(); + var requestUrl = string.Format(_stringConstant.FirstAndSecondIndexStringFormat, _stringConstant.UserDetailsUrl, projectId); + var response = await _httpClientService.GetAsync(_stringConstant.ProjectUrl, requestUrl, accessToken); + if(response != null) + { + teamMembers = JsonConvert.DeserializeObject>(response); + } + return teamMembers; + } #endregion } } \ No newline at end of file diff --git a/Slack.Automation/Promact.Core.Repository/Promact.Core.Repository.csproj b/Slack.Automation/Promact.Core.Repository/Promact.Core.Repository.csproj index 3d01a6f1..2634929c 100644 --- a/Slack.Automation/Promact.Core.Repository/Promact.Core.Repository.csproj +++ b/Slack.Automation/Promact.Core.Repository/Promact.Core.Repository.csproj @@ -165,6 +165,8 @@ + + diff --git a/Slack.Automation/Promact.Core.Repository/SlackRepository/SlackRepository.cs b/Slack.Automation/Promact.Core.Repository/SlackRepository/SlackRepository.cs index 4617bc6b..223aaeb7 100644 --- a/Slack.Automation/Promact.Core.Repository/SlackRepository/SlackRepository.cs +++ b/Slack.Automation/Promact.Core.Repository/SlackRepository/SlackRepository.cs @@ -91,9 +91,10 @@ public async Task UpdateLeaveAsync(SlashChatUpdateResponse leaveResponse) await _clientRepository.UpdateMessageAsync(incomingWebHook.IncomingWebHookUrl, replyText); // Used to send email to the user about leave updation EmailApplication email = new EmailApplication(); + email.To = new List(); email.Body = _emailTemplateRepository.EmailServiceTemplateLeaveUpdate(leave); email.From = updaterUser.Email; - email.To = user.Email; + email.To.Add(user.Email); email.Subject = string.Format(_stringConstant.LeaveUpdateEmailStringFormat, _stringConstant.Leave, leave.Status); replyText = string.Format(_stringConstant.ReplyTextForUpdateLeave, leave.Status, slackUser.Name, leave.FromDate.ToShortDateString(), leave.EndDate.Value.ToShortDateString(), leave.Reason, diff --git a/Slack.Automation/Promact.Core.Repository/TaskMailRepository/TaskMailRepository.cs b/Slack.Automation/Promact.Core.Repository/TaskMailRepository/TaskMailRepository.cs index 0d2d401e..24918c43 100644 --- a/Slack.Automation/Promact.Core.Repository/TaskMailRepository/TaskMailRepository.cs +++ b/Slack.Automation/Promact.Core.Repository/TaskMailRepository/TaskMailRepository.cs @@ -11,6 +11,8 @@ using Promact.Erp.Util.StringConstants; using Promact.Core.Repository.EmailServiceTemplateRepository; using Autofac.Extras.NLog; +using Promact.Core.Repository.MailSettingDetailsByProjectAndModule; +using System.Collections.Generic; namespace Promact.Core.Repository.TaskMailRepository { @@ -28,6 +30,8 @@ public class TaskMailRepository : ITaskMailRepository private readonly IStringConstantRepository _stringConstant; private readonly IEmailServiceTemplateRepository _emailServiceTemplate; private readonly ILogger _logger; + private readonly IRepository _mailSettingDataRepository; + private readonly IMailSettingDetailsByProjectAndModuleRepository _mailSettingDetails; #endregion #region Constructor @@ -35,7 +39,8 @@ public class TaskMailRepository : ITaskMailRepository IOauthCallsRepository oauthCallsRepository, IRepository taskMailDetailRepository, IAttachmentRepository attachmentRepository, IRepository userRepository, IEmailService emailService, IBotQuestionRepository botQuestionRepository, ApplicationUserManager userManager, - IEmailServiceTemplateRepository emailServiceTemplate, ILogger logger) + IEmailServiceTemplateRepository emailServiceTemplate, ILogger logger, IRepository mailSettingDataRepository, + IMailSettingDetailsByProjectAndModuleRepository mailSettingDetails) { _taskMailRepository = taskMailRepository; _stringConstant = stringConstant; @@ -48,6 +53,8 @@ public class TaskMailRepository : ITaskMailRepository _userManager = userManager; _emailServiceTemplate = emailServiceTemplate; _logger = logger; + _mailSettingDataRepository = mailSettingDataRepository; + _mailSettingDetails = mailSettingDetails; } #endregion @@ -137,7 +144,7 @@ public async Task QuestionAndAnswerAsync(string answer, string userId) { // getting next question to be asked to user var nextQuestion = await NextQuestionForTaskMailAsync(previousQuestion.OrderNumber); - _logger.Info("Previous question ordernumber : " +previousQuestion.OrderNumber); + _logger.Info("Previous question ordernumber : " + previousQuestion.OrderNumber); switch (previousQuestion.OrderNumber) { #region Your Task @@ -301,23 +308,26 @@ public async Task QuestionAndAnswerAsync(string answer, string userId) case SendEmailConfirmation.yes: { EmailApplication email = new EmailApplication(); + email.To = new List(); + email.CC = new List(); + var listOfprojectRelatedToUser = (await _oauthCallsRepository.GetListOfProjectsEnrollmentOfUserByUserIdAsync(userAndTaskMailDetailsWithAccessToken.User.Id, userAndTaskMailDetailsWithAccessToken.AccessToken)).Select(x => x.Id).ToList(); + foreach (var projectId in listOfprojectRelatedToUser) + { + var mailsetting = await _mailSettingDetails.GetMailSettingAsync(projectId, _stringConstant.TaskModule, userAndTaskMailDetailsWithAccessToken.User.Id); + email.To.AddRange(mailsetting.To); + email.CC.AddRange(mailsetting.CC); + } + email.To = email.To.Distinct().ToList(); + email.CC = email.CC.Distinct().ToList(); email.From = userAndTaskMailDetailsWithAccessToken.User.Email; email.Subject = _stringConstant.TaskMailSubject; // transforming task mail details to template page and getting as string email.Body = _emailServiceTemplate.EmailServiceTemplateTaskMail(userAndTaskMailDetailsWithAccessToken.TaskList); // if previous question was confirm send email of task and it was not null/wrong value then answer will send email and reply back with thank you and task mail stopped taskDetails.QuestionId = nextQuestion.Id; - // getting team leader list - var teamLeaders = await _oauthCallsRepository.GetTeamLeaderUserIdAsync(userAndTaskMailDetailsWithAccessToken.User.Id, userAndTaskMailDetailsWithAccessToken.AccessToken); - // getting managemnt list - var managements = await _oauthCallsRepository.GetManagementUserNameAsync(userAndTaskMailDetailsWithAccessToken.AccessToken); - teamLeaders.AddRange(managements); - foreach (var teamLeader in teamLeaders) - { - email.To = teamLeader.Email; - // Email send + // Email send + if (email.To.Any()) _emailService.Send(email); - } } break; case SendEmailConfirmation.no: diff --git a/Slack.Automation/Promact.Core.Test/AutofacConfig.cs b/Slack.Automation/Promact.Core.Test/AutofacConfig.cs index 97f0ccdb..fb74b078 100644 --- a/Slack.Automation/Promact.Core.Test/AutofacConfig.cs +++ b/Slack.Automation/Promact.Core.Test/AutofacConfig.cs @@ -34,6 +34,7 @@ using Promact.Core.Repository.BaseRepository; using Promact.Core.Repository.TaskMailReportRepository; using Promact.Core.Repository.MailSettingRepository; +using Promact.Core.Repository.MailSettingDetailsByProjectAndModule; namespace Promact.Core.Test { @@ -73,6 +74,7 @@ public static IComponentContext RegisterDependancies() builder.RegisterType().As(); builder.RegisterType().As(); builder.RegisterType().As(); + builder.RegisterType().As(); var emailServiceMock = new Mock(); var emailServiceMockObject = emailServiceMock.Object; builder.RegisterInstance(emailServiceMock).As>(); diff --git a/Slack.Automation/Promact.Core.Test/MailSettingDetailsByProjectAndModuleTest.cs b/Slack.Automation/Promact.Core.Test/MailSettingDetailsByProjectAndModuleTest.cs new file mode 100644 index 00000000..6829dd50 --- /dev/null +++ b/Slack.Automation/Promact.Core.Test/MailSettingDetailsByProjectAndModuleTest.cs @@ -0,0 +1,230 @@ +using Autofac; +using Microsoft.AspNet.Identity; +using Moq; +using Promact.Core.Repository.MailSettingDetailsByProjectAndModule; +using Promact.Core.Repository.ServiceRepository; +using Promact.Erp.DomainModel.DataRepository; +using Promact.Erp.DomainModel.Models; +using Promact.Erp.Util.StringConstants; +using System; +using System.Collections.Generic; +using System.Security.Claims; +using System.Threading.Tasks; +using System.Web; +using Xunit; + +namespace Promact.Core.Test +{ + public class MailSettingDetailsByProjectAndModuleTest + { + #region Private Variables + private readonly IComponentContext _componentContext; + private readonly IMailSettingDetailsByProjectAndModuleRepository _mailSettingDetailsRepository; + private readonly IRepository _mailSettingDataRepository; + private readonly IRepository _mailSettingMappingDataRepository; + private readonly IRepository _groupDataRepository; + private readonly IRepository _groupEmailMappingDataRepository; + private readonly IStringConstantRepository _stringConstant; + private readonly ApplicationUserManager _userManager; + private readonly Mock _mockHttpContextBase; + private readonly Mock _mockServiceRepository; + MailSetting mailSetting = new MailSetting(); + MailSettingMapping mailSettingMapping = new MailSettingMapping(); + Group group = new Group(); + GroupEmailMapping groupEmailMapping = new GroupEmailMapping(); + #endregion + + #region Constructor + public MailSettingDetailsByProjectAndModuleTest() + { + _componentContext = AutofacConfig.RegisterDependancies(); + _mailSettingDataRepository = _componentContext.Resolve>(); + _mailSettingMappingDataRepository = _componentContext.Resolve>(); + _groupDataRepository = _componentContext.Resolve>(); + _groupEmailMappingDataRepository = _componentContext.Resolve>(); + _stringConstant = _componentContext.Resolve(); + _mailSettingDetailsRepository = _componentContext.Resolve(); + _userManager = _componentContext.Resolve(); + _mockHttpContextBase = _componentContext.Resolve>(); + _mockServiceRepository = _componentContext.Resolve>(); + Initialize(); + } + #endregion + + #region Test Cases + /// + /// Test for isTo true with static email Id + /// + [Fact, Trait("Category", "Required")] + public async Task GetMailSettingEmailIsToAsync() + { + await AddGroup(); + await AddMailSetting(); + var result = await _mailSettingDetailsRepository.GetMailSettingAsync(1, _stringConstant.TaskModule, _stringConstant.StringIdForTest); + Assert.True(result.SendMail); + } + + /// + /// Test for isTo true with group + /// + [Fact, Trait("Category", "Required")] + public async Task GetMailSettingForGroupIsToAsync() + { + await CreateUserAndMockingHttpContextToReturnAccessTokenAsync(); + await AddGroup(); + mailSettingMapping.Email = null; + mailSettingMapping.GroupId = group.Id; + await AddMailSetting(); + var result = await _mailSettingDetailsRepository.GetMailSettingAsync(1, _stringConstant.TaskModule, _stringConstant.StringIdForTest); + Assert.True(result.SendMail); + } + + /// + /// Test for isTo true with static email Id + /// + [Fact, Trait("Category", "Required")] + public async Task GetMailSettingEmailIsToFalseAsync() + { + await AddGroup(); + mailSettingMapping.IsTo = false; + await AddMailSetting(); + var result = await _mailSettingDetailsRepository.GetMailSettingAsync(1, _stringConstant.TaskModule, _stringConstant.StringIdForTest); + Assert.True(result.SendMail); + } + + /// + /// Test for isTo true with group + /// + [Fact, Trait("Category", "Required")] + public async Task GetMailSettingForGroupIsToFalseAsync() + { + await CreateUserAndMockingHttpContextToReturnAccessTokenAsync(); + await AddGroup(); + mailSettingMapping.IsTo = false; + mailSettingMapping.Email = null; + mailSettingMapping.GroupId = group.Id; + await AddMailSetting(); + var result = await _mailSettingDetailsRepository.GetMailSettingAsync(1, _stringConstant.TaskModule, _stringConstant.StringIdForTest); + Assert.True(result.SendMail); + } + + /// + /// Test for isTo true with group + /// + [Fact, Trait("Category", "Required")] + public async Task GetMailSettingForGroupIsToManagementAsync() + { + await CreateUserAndMockingHttpContextToReturnAccessTokenAsync(); + group.Name = _stringConstant.Management; + await AddGroup(); + mailSettingMapping.Email = null; + mailSettingMapping.GroupId = group.Id; + await AddMailSetting(); + var result = await _mailSettingDetailsRepository.GetMailSettingAsync(1, _stringConstant.TaskModule, _stringConstant.StringIdForTest); + Assert.True(result.SendMail); + } + + + /// + /// Test for isTo true with group + /// + [Fact, Trait("Category", "Required")] + public async Task GetMailSettingForGroupIsToTeamMemberAsync() + { + await CreateUserAndMockingHttpContextToReturnAccessTokenAsync(); + group.Name = "Team Members"; + await AddGroup(); + mailSettingMapping.Email = null; + mailSettingMapping.GroupId = group.Id; + await AddMailSetting(); + var result = await _mailSettingDetailsRepository.GetMailSettingAsync(1, _stringConstant.TaskModule, _stringConstant.StringIdForTest); + Assert.True(result.SendMail); + } + + /// + /// Test for isTo true with group + /// + [Fact, Trait("Category", "Required")] + public async Task GetMailSettingForGroupIsToDefaultAsync() + { + await CreateUserAndMockingHttpContextToReturnAccessTokenAsync(); + group.Name = _stringConstant.Email; + await AddGroup(); + mailSettingMapping.Email = null; + mailSettingMapping.GroupId = group.Id; + await AddMailSetting(); + var result = await _mailSettingDetailsRepository.GetMailSettingAsync(1, _stringConstant.TaskModule, _stringConstant.StringIdForTest); + Assert.True(result.SendMail); + } + #endregion + + #region Private Methods + /// + /// Initialization + /// + private void Initialize() + { + mailSetting.CreatedOn = DateTime.UtcNow; + mailSetting.Module = _stringConstant.TaskModule; + mailSetting.ProjectId = 1; + mailSetting.SendMail = true; + mailSettingMapping.CreatedOn = DateTime.UtcNow; + mailSettingMapping.Email = _stringConstant.EmailForTest; + mailSettingMapping.IsTo = true; + group.CreatedOn = DateTime.UtcNow; + group.Name = "Team Leader"; + group.Type = 1; + groupEmailMapping.CreatedOn = DateTime.UtcNow; + groupEmailMapping.Email = _stringConstant.Email; + } + + /// + /// Method to add mail setting + /// + private async Task AddMailSetting() + { + _mailSettingDataRepository.Insert(mailSetting); + await _mailSettingDataRepository.SaveChangesAsync(); + mailSettingMapping.MailSettingId = mailSetting.Id; + _mailSettingMappingDataRepository.Insert(mailSettingMapping); + await _mailSettingMappingDataRepository.SaveChangesAsync(); + } + + /// + /// Method to add group + /// + private async Task AddGroup() + { + _groupDataRepository.Insert(group); + await _groupDataRepository.SaveChangesAsync(); + groupEmailMapping.GroupId = group.Id; + _groupEmailMappingDataRepository.Insert(groupEmailMapping); + await _groupEmailMappingDataRepository.SaveChangesAsync(); + } + + /// + /// Private method to create a user add login info and mocking of Identity and return access token + /// + private async Task CreateUserAndMockingHttpContextToReturnAccessTokenAsync() + { + var user = new ApplicationUser() + { + Id = _stringConstant.StringIdForTest, + UserName = _stringConstant.EmailForTest, + Email = _stringConstant.EmailForTest + }; + await _userManager.CreateAsync(user); + UserLoginInfo info = new UserLoginInfo(_stringConstant.PromactStringName, _stringConstant.AccessTokenForTest); + await _userManager.AddLoginAsync(user.Id, info); + Claim claim = new Claim(_stringConstant.Sub, _stringConstant.StringIdForTest); + var mockClaims = new Mock(); + IList claims = new List(); + claims.Add(claim); + mockClaims.Setup(x => x.Claims).Returns(claims); + _mockHttpContextBase.Setup(x => x.User.Identity).Returns(mockClaims.Object); + var accessToken = Task.FromResult(_stringConstant.AccessTokenForTest); + _mockServiceRepository.Setup(x => x.GerAccessTokenByRefreshToken(It.IsAny())).Returns(accessToken); + } + #endregion + } +} diff --git a/Slack.Automation/Promact.Core.Test/OauthCallsRepositoryTest.cs b/Slack.Automation/Promact.Core.Test/OauthCallsRepositoryTest.cs index de5745ba..2c13644b 100644 --- a/Slack.Automation/Promact.Core.Test/OauthCallsRepositoryTest.cs +++ b/Slack.Automation/Promact.Core.Test/OauthCallsRepositoryTest.cs @@ -308,6 +308,9 @@ public async Task GetProjectDetailsTrueAsync() Assert.Equal(2, project.ApplicationUsers.Count); } + /// + /// Method to check the CurrentUserIsAdminAsync + /// [Fact, Trait("Category", "Required")] public async Task CurrentUserIsAdminAsync() { @@ -318,6 +321,9 @@ public async Task CurrentUserIsAdminAsync() Assert.Equal(true, result); } + /// + /// Method to check the CurrentUserIsAdminAsync for false + /// [Fact, Trait("Category", "Required")] public async Task CurrentUserIsAdminForFalseAsync() { @@ -325,6 +331,35 @@ public async Task CurrentUserIsAdminForFalseAsync() var result = await _oauthCallHttpContextRepository.CurrentUserIsAdminAsync(); Assert.Equal(false, result); } + + /// + /// Method to check GetListOfProjectsEnrollmentOfUserByUserIdAsync + /// + /// + [Fact, Trait("Category", "Required")] + public async Task GetListOfProjectsEnrollmentOfUserByUserIdAsync() + { + var responseProjects = Task.FromResult(_stringConstant.ProjectDetailsForAdminFromOauth); + var requestUrl = string.Format(_stringConstant.FirstAndSecondIndexStringFormat, _stringConstant.UserDetailsUrl, _stringConstant.StringIdForTest); + _mockHttpClient.Setup(x => x.GetAsync(_stringConstant.ProjectUrl, requestUrl, _stringConstant.AccessTokenForTest)).Returns(responseProjects); + var result = await _oauthCallsRepository.GetListOfProjectsEnrollmentOfUserByUserIdAsync(_stringConstant.StringIdForTest, _stringConstant.AccessTokenForTest); + Assert.NotEqual(result.Count, 0); + } + + /// + /// Method to check GetAllTeamMemberByProjectIdAsync + /// + /// + [Fact, Trait("Category", "Required")] + public async Task GetAllTeamMemberByProjectIdAsync() + { + var responseProjects = Task.FromResult(_stringConstant.ManagementDetailsFromOauthServer); + var requestUrl = string.Format(_stringConstant.FirstAndSecondIndexStringFormat, _stringConstant.UserDetailsUrl, 1); + _mockHttpClient.Setup(x => x.GetAsync(_stringConstant.ProjectUrl, requestUrl, _stringConstant.AccessTokenForTest)).Returns(responseProjects); + var result = await _oauthCallsRepository.GetAllTeamMemberByProjectIdAsync(1, _stringConstant.AccessTokenForTest); + Assert.NotEqual(result.Count, 0); + _mockHttpClient.Verify(x => x.GetAsync(_stringConstant.ProjectUrl, requestUrl, _stringConstant.AccessTokenForTest), Times.Once); + } #endregion #region Private Method diff --git a/Slack.Automation/Promact.Core.Test/Promact.Core.Test.csproj b/Slack.Automation/Promact.Core.Test/Promact.Core.Test.csproj index 3004b11b..2fa2ba3b 100644 --- a/Slack.Automation/Promact.Core.Test/Promact.Core.Test.csproj +++ b/Slack.Automation/Promact.Core.Test/Promact.Core.Test.csproj @@ -163,6 +163,7 @@ + diff --git a/Slack.Automation/Promact.Core.Test/SlackRepositoryTest.cs b/Slack.Automation/Promact.Core.Test/SlackRepositoryTest.cs index 419c625c..17cc1739 100644 --- a/Slack.Automation/Promact.Core.Test/SlackRepositoryTest.cs +++ b/Slack.Automation/Promact.Core.Test/SlackRepositoryTest.cs @@ -57,6 +57,14 @@ public class SlackRepositoryTest private readonly IRepository _incomingWebHookRepository; private ApplicationUser updaterUser = new ApplicationUser(); private readonly Mock _mockServiceRepository; + private readonly IRepository _mailSettingDataRepository; + private readonly IRepository _mailSettingMappingDataRepository; + private readonly IRepository _groupDataRepository; + private readonly IRepository _groupEmailMappingDataRepository; + MailSetting mailSetting = new MailSetting(); + MailSettingMapping mailSettingMapping = new MailSettingMapping(); + Group group = new Group(); + GroupEmailMapping groupEmailMapping = new GroupEmailMapping(); #endregion #region Constructor @@ -76,6 +84,10 @@ public SlackRepositoryTest() _mockEmail = _componentContext.Resolve>(); _incomingWebHookRepository = _componentContext.Resolve>(); _mockServiceRepository = _componentContext.Resolve>(); + _mailSettingDataRepository = _componentContext.Resolve>(); + _mailSettingMappingDataRepository = _componentContext.Resolve>(); + _groupDataRepository = _componentContext.Resolve>(); + _groupEmailMappingDataRepository = _componentContext.Resolve>(); Initialize(); } #endregion @@ -87,6 +99,13 @@ public SlackRepositoryTest() [Fact, Trait("Category", "Required")] public async Task LeaveApplyForCLAsync() { + await AddGroup(); + await AddMailSetting(); + List listOfProject = new List(); + listOfProject.Add(new ProjectAc() { Id = 1 }); + var responseProjects = Task.FromResult(JsonConvert.SerializeObject(listOfProject)); + var requestUrl = string.Format(_stringConstant.FirstAndSecondIndexStringFormat, _stringConstant.UserDetailsUrl, _stringConstant.StringIdForTest); + _mockHttpClient.Setup(x => x.GetAsync(_stringConstant.ProjectUrl, requestUrl, _stringConstant.AccessTokenForTest)).Returns(responseProjects); slackLeave.ResponseUrl = _stringConstant.IncomingWebHookUrl; await AddThreeUserIncomingWebHookAsync(); await AddUser(); @@ -156,7 +175,8 @@ public async Task UpdateLeaveAsync() EmailApplication email = new EmailApplication(); email.Body = _emailTemplateRepository.EmailServiceTemplateLeaveUpdate(leave); email.From = _stringConstant.TeamLeaderEmailForTest; - email.To = _stringConstant.EmailForTest; + email.To = new List(); + email.To.Add(_stringConstant.EmailForTest); email.Subject = string.Format(_stringConstant.LeaveUpdateEmailStringFormat, _stringConstant.Leave, leave.Status); _mockEmail.Setup(x => x.Send(email)); await _slackRepository.UpdateLeaveAsync(leaveResponse); @@ -200,7 +220,8 @@ public async Task UpdateLeaveRejectedAsync() EmailApplication email = new EmailApplication(); email.Body = _emailTemplateRepository.EmailServiceTemplateLeaveUpdate(leave); email.From = _stringConstant.TeamLeaderEmailForTest; - email.To = _stringConstant.EmailForTest; + email.To = new List(); + email.To.Add(_stringConstant.EmailForTest); email.Subject = string.Format(_stringConstant.LeaveUpdateEmailStringFormat, _stringConstant.Leave, leave.Status); _mockEmail.Setup(x => x.Send(email)); await _slackRepository.UpdateLeaveAsync(leaveResponse); @@ -456,6 +477,13 @@ public async Task SlackLeaveHelpAsync() [Fact, Trait("Category", "Required")] public async Task LeaveApplyForSLAsync() { + await AddGroup(); + await AddMailSetting(); + List listOfProject = new List(); + listOfProject.Add(new ProjectAc() { Id = 1 }); + var responseProjects = Task.FromResult(JsonConvert.SerializeObject(listOfProject)); + var requestUrl = string.Format(_stringConstant.FirstAndSecondIndexStringFormat, _stringConstant.UserDetailsUrl, _stringConstant.StringIdForTest); + _mockHttpClient.Setup(x => x.GetAsync(_stringConstant.ProjectUrl, requestUrl, _stringConstant.AccessTokenForTest)).Returns(responseProjects); slackLeave.ResponseUrl = _stringConstant.IncomingWebHookUrl; await AddThreeUserIncomingWebHookAsync(); await AddUser(); @@ -777,6 +805,13 @@ public async Task SlackLeaveBalanceWrongAsync() [Fact, Trait("Category", "Required")] public async Task LeaveApplyForCLForEmailErrorAsync() { + await AddGroup(); + await AddMailSetting(); + List listOfProject = new List(); + listOfProject.Add(new ProjectAc() { Id = 1 }); + var responseProjects = Task.FromResult(JsonConvert.SerializeObject(listOfProject)); + var requestUrl = string.Format(_stringConstant.FirstAndSecondIndexStringFormat, _stringConstant.UserDetailsUrl, _stringConstant.StringIdForTest); + _mockHttpClient.Setup(x => x.GetAsync(_stringConstant.ProjectUrl, requestUrl, _stringConstant.AccessTokenForTest)).Returns(responseProjects); await AddThreeUserIncomingWebHookAsync(); SmtpException ex = new SmtpException(); await AddUser(); @@ -1096,7 +1131,8 @@ public async Task UpdateLeaveSMTPExceptionAsync() EmailApplication email = new EmailApplication(); email.Body = _emailTemplateRepository.EmailServiceTemplateLeaveUpdate(leave); email.From = _stringConstant.TeamLeaderEmailForTest; - email.To = _stringConstant.EmailForTest; + email.To = new List(); + email.To.Add(_stringConstant.EmailForTest); email.Subject = string.Format(_stringConstant.LeaveUpdateEmailStringFormat, _stringConstant.Leave, leave.Status); _mockEmail.Setup(x => x.Send(It.IsAny())).Throws(ex); await _slackRepository.UpdateLeaveAsync(leaveResponse); @@ -1193,6 +1229,19 @@ public void Initialize() var accessTokenForTest = Task.FromResult(_stringConstant.AccessTokenForTest); _mockServiceRepository.Setup(x => x.GerAccessTokenByRefreshToken(_stringConstant.AccessTokenForTest)).Returns(accessTokenForTest); + + mailSetting.CreatedOn = DateTime.UtcNow; + mailSetting.Module = _stringConstant.LeaveModule; + mailSetting.ProjectId = 1; + mailSetting.SendMail = true; + mailSettingMapping.CreatedOn = DateTime.UtcNow; + mailSettingMapping.Email = _stringConstant.EmailForTest; + mailSettingMapping.IsTo = true; + group.CreatedOn = DateTime.UtcNow; + group.Name = _stringConstant.TeamLeader; + group.Type = 1; + groupEmailMapping.CreatedOn = DateTime.UtcNow; + groupEmailMapping.Email = _stringConstant.Email; } #endregion @@ -1305,7 +1354,8 @@ private void MockingEmailService(string body) { email.Body = body; email.Subject = _stringConstant.EmailSubject; - email.To = _stringConstant.TeamLeaderEmailForTest; + email.To = new List(); + email.To.Add(_stringConstant.TeamLeaderEmailForTest); _mockEmail.Setup(x => x.Send(It.IsAny())); } @@ -1335,6 +1385,30 @@ private async Task AddThreeUserIncomingWebHookAsync() _incomingWebHookRepository.Insert(thirdUserIncomingWebHook); await _incomingWebHookRepository.SaveChangesAsync(); } + + /// + /// Method to add mail setting + /// + private async Task AddMailSetting() + { + _mailSettingDataRepository.Insert(mailSetting); + await _mailSettingDataRepository.SaveChangesAsync(); + mailSettingMapping.MailSettingId = mailSetting.Id; + _mailSettingMappingDataRepository.Insert(mailSettingMapping); + await _mailSettingMappingDataRepository.SaveChangesAsync(); + } + + /// + /// Method to add group + /// + private async Task AddGroup() + { + _groupDataRepository.Insert(group); + await _groupDataRepository.SaveChangesAsync(); + groupEmailMapping.GroupId = group.Id; + _groupEmailMappingDataRepository.Insert(groupEmailMapping); + await _groupEmailMappingDataRepository.SaveChangesAsync(); + } #endregion } } diff --git a/Slack.Automation/Promact.Core.Test/TaskMailRepositoryTest.cs b/Slack.Automation/Promact.Core.Test/TaskMailRepositoryTest.cs index 12b5e718..a802b8b8 100644 --- a/Slack.Automation/Promact.Core.Test/TaskMailRepositoryTest.cs +++ b/Slack.Automation/Promact.Core.Test/TaskMailRepositoryTest.cs @@ -1068,7 +1068,6 @@ private void LoggerMocking() /// /// Private method to create a user add login info and mocking of Identity and return access token /// - /// private async Task CreateUserAndMockingHttpContextToReturnAccessToken() { var user = new ApplicationUser() diff --git a/Slack.Automation/Promact.Erp.DomainModel/ApplicationClass/EmailApplication.cs b/Slack.Automation/Promact.Erp.DomainModel/ApplicationClass/EmailApplication.cs index 0c127244..d1d42775 100644 --- a/Slack.Automation/Promact.Erp.DomainModel/ApplicationClass/EmailApplication.cs +++ b/Slack.Automation/Promact.Erp.DomainModel/ApplicationClass/EmailApplication.cs @@ -26,6 +26,11 @@ public class EmailApplication /// /// Email to /// - public string To { get; set; } + public List To { get; set; } + + /// + /// Email cc + /// + public List CC { get; set; } } } diff --git a/Slack.Automation/Promact.Erp.Util/Email/EmailService.cs b/Slack.Automation/Promact.Erp.Util/Email/EmailService.cs index 44ceef9b..d02ad114 100644 --- a/Slack.Automation/Promact.Erp.Util/Email/EmailService.cs +++ b/Slack.Automation/Promact.Erp.Util/Email/EmailService.cs @@ -24,6 +24,7 @@ public EmailService(IEnvironmentVariableRepository envVariableRepository, ILogge #endregion + #region Public Method /// /// Method used to send e-mails /// @@ -36,7 +37,16 @@ public void Send(EmailApplication email) _logger.Debug("Email send from : " + email.From); message.From = new MailAddress(email.From); _logger.Debug("Email send to : " + email.To); - message.To.Add(new MailAddress(email.To)); + foreach (var to in email.To) + { + _logger.Debug("Email send to : " + to); + message.To.Add(new MailAddress(to)); + } + foreach (var cc in email.CC) + { + _logger.Debug("Email send cc : " + cc); + message.CC.Add(new MailAddress(cc)); + } _logger.Debug("Email send subject : " + email.Subject); message.Subject = email.Subject; _logger.Debug("Email send body is null : " + string.IsNullOrEmpty(email.Body)); @@ -66,6 +76,7 @@ public void Send(EmailApplication email) throw ex; } } + #endregion } } diff --git a/Slack.Automation/Promact.Erp.Web/App_Start/AutofacConfig.cs b/Slack.Automation/Promact.Erp.Web/App_Start/AutofacConfig.cs index e73822b2..37b96264 100644 --- a/Slack.Automation/Promact.Erp.Web/App_Start/AutofacConfig.cs +++ b/Slack.Automation/Promact.Erp.Web/App_Start/AutofacConfig.cs @@ -13,6 +13,7 @@ using Promact.Core.Repository.ExternalLoginRepository; using Promact.Core.Repository.LeaveReportRepository; using Promact.Core.Repository.LeaveRequestRepository; +using Promact.Core.Repository.MailSettingDetailsByProjectAndModule; using Promact.Core.Repository.MailSettingRepository; using Promact.Core.Repository.OauthCallsRepository; using Promact.Core.Repository.ScrumReportRepository; @@ -24,7 +25,7 @@ using Promact.Core.Repository.TaskMailReportRepository; using Promact.Core.Repository.TaskMailRepository; using Promact.Erp.Core; -using Promact.Erp.Core.Controllers; +using Promact.Erp.Core.Controllers; using Promact.Erp.DomainModel.Context; using Promact.Erp.DomainModel.DataRepository; using Promact.Erp.DomainModel.Models; @@ -91,6 +92,7 @@ public static IComponentContext RegisterDependancies() builder.RegisterType().As(); builder.RegisterType().As(); builder.RegisterType().As(); + builder.RegisterType().As(); builder.RegisterModule(); builder.RegisterModule(); builder.RegisterModule(); diff --git a/Slack.Automation/Promact.Erp.Web/Promact.Erp.Web.csproj b/Slack.Automation/Promact.Erp.Web/Promact.Erp.Web.csproj index 71d6baed..e9e746b2 100644 --- a/Slack.Automation/Promact.Erp.Web/Promact.Erp.Web.csproj +++ b/Slack.Automation/Promact.Erp.Web/Promact.Erp.Web.csproj @@ -1221,7 +1221,6 @@ - @@ -1234,7 +1233,6 @@ - @@ -1242,7 +1240,6 @@ - diff --git a/Slack.Automation/Promact.Erp.Web/app/app.component.spec.ts b/Slack.Automation/Promact.Erp.Web/app/app.component.spec.ts index cdeaceb2..a7933384 100644 --- a/Slack.Automation/Promact.Erp.Web/app/app.component.spec.ts +++ b/Slack.Automation/Promact.Erp.Web/app/app.component.spec.ts @@ -7,7 +7,6 @@ import { RouterLinkStubDirective } from './shared/mock/mock.routerLink'; import { LoaderService } from './shared/loader.service'; import { AppComponentService } from './appcomponent.service'; import { AppModule } from './app.module'; -import { MockAppComponentService } from './shared/mock/mock.appcomponent.service'; import { AppComponent } from './app.component'; import { Md2SelectChange } from 'md2'; import { BehaviorSubject } from 'rxjs/BehaviorSubject'; diff --git a/Slack.Automation/Promact.Erp.Web/app/index.html b/Slack.Automation/Promact.Erp.Web/app/index.html index 6aba6f36..e7a947d8 100644 --- a/Slack.Automation/Promact.Erp.Web/app/index.html +++ b/Slack.Automation/Promact.Erp.Web/app/index.html @@ -51,7 +51,7 @@ diff --git a/Slack.Automation/Promact.Erp.Web/app/shared/MailSetting/mailsetting.html b/Slack.Automation/Promact.Erp.Web/app/shared/MailSetting/mailsetting.html index 5ffb04a0..a2540bb5 100644 --- a/Slack.Automation/Promact.Erp.Web/app/shared/MailSetting/mailsetting.html +++ b/Slack.Automation/Promact.Erp.Web/app/shared/MailSetting/mailsetting.html @@ -18,7 +18,7 @@ [readonly]="!projectSelected" [isAutoComplete]="true" [autocompleteDataList]="groupList" - autocomplete-item-text="data" required> + autocomplete-item-text="value" required>
@@ -31,7 +31,7 @@ [readonly]="!projectSelected" [isAutoComplete]="true" [autocompleteDataList]="groupList" - autocomplete-item-text="data"> + autocomplete-item-text="value">
diff --git a/Slack.Automation/Promact.Erp.Web/app/shared/mock/mock.appcomponent.service.ts b/Slack.Automation/Promact.Erp.Web/app/shared/mock/mock.appcomponent.service.ts deleted file mode 100644 index fed1e355..00000000 --- a/Slack.Automation/Promact.Erp.Web/app/shared/mock/mock.appcomponent.service.ts +++ /dev/null @@ -1,11 +0,0 @@ -import { Injectable } from '@angular/core'; -import { BehaviorSubject } from 'rxjs/BehaviorSubject'; - -@Injectable() - -export class MockAppComponentService { - - getUserIsAdminOrNot() { - return new BehaviorSubject("true").asObservable(); - } -} \ No newline at end of file