/// <summary>
        /// Method to get last leave status and details on slack
        /// </summary>
        /// <param name="slackText">list of string contain leave slash command parameter</param>
        /// <param name="leave">leave slash command</param>
        /// <param name="accessToken">User's access token</param>
        /// <returns>Reply text to be send</returns>
        private async Task <string> SlackLeaveStatusAsync(List <string> slackText, SlashCommand leave, string accessToken)
        {
            // if slackText count is more then 1 then its means that user want to get leave list of someone else
            if (slackText.Count > 1)
            {
                // other user slack user name
                SlackUserDetailAc slackUser = await _slackUserRepository.GetBySlackNameAsync(slackText[1]);

                if (slackUser != null)
                {
                    var user = await _userManagerRepository.FirstOrDefaultAsync(x => x.SlackUserId == slackUser.UserId);

                    _logger.Debug("SlackLeaveStatusAsync user name other : " + user.UserName);
                    // last leave details of other user
                    replyText = await LeaveStatusBySlackUserIdAsync(user.Id, accessToken);
                }
                else
                {
                    replyText = string.Format(_stringConstant.UserDetailsNotFound, slackText[1]);
                }
            }
            else
            {
                var user = await _userManagerRepository.FirstOrDefaultAsync(x => x.SlackUserId == leave.UserId);

                _logger.Debug("SlackLeaveStatusAsync user name own : " + user.UserName);
                // last leave details of own
                replyText = await LeaveStatusBySlackUserIdAsync(user.Id, accessToken);
            }
            return(replyText);
        }
        /// <summary>
        /// Method to send slack message to user whom leave has been applied by admin
        /// </summary>
        /// <param name="leaveRequest">LeaveRequest object</param>
        /// <param name="managementEmail">Management email address</param>
        /// <param name="replyText">Reply text to be send to user</param>
        /// <param name="user">User details</param>
        public async Task SendSickLeaveMessageToUserIncomingWebhookAsync(LeaveRequest leaveRequest, string managementEmail, string replyText, User user)
        {
            _logger.Debug("SendSickLeaveMessageToUserIncomingWebhookAsync method");
            var attachment = _attachmentRepository.SlackResponseAttachmentWithoutButton(Convert.ToString(leaveRequest.Id), replyText);
            SlackUserDetailAc slackUser = await _slackUserRepository.GetByIdAsync(user.SlackUserId);

            if (slackUser != null)
            {
                _logger.Debug("SendSickLeaveMessageToUserIncomingWebhookAsync user slack name : " + slackUser.Name);
                var incomingWebHook = await _incomingWebHook.FirstOrDefaultAsync(x => x.UserId == slackUser.UserId);

                var slashIncomingWebhookText = new SlashIncomingWebhook()
                {
                    Channel = _stringConstant.AtTheRate + slackUser.Name, Username = _stringConstant.LeaveBot, Attachments = attachment
                };
                var slashIncomingWebhookJsonText = JsonConvert.SerializeObject(slashIncomingWebhookText);
                if (incomingWebHook != null)
                {
                    await _httpClientService.PostAsync(incomingWebHook.IncomingWebHookUrl, slashIncomingWebhookJsonText, _stringConstant.JsonContentString, null, null);
                }
            }
            EmailApplication email = new EmailApplication();

            email.To = new List <string>();
            // creating email templates corresponding to leave applied
            email.Body    = _emailTemplateRepository.EmailServiceTemplateSickLeave(leaveRequest);
            email.From    = managementEmail;
            email.Subject = _stringConstant.EmailSubject;
            email.To.Add(user.Email);
            _emailService.Send(email);
            _logger.Debug("SendSickLeaveMessageToUserIncomingWebhookAsync Email sended successfully");
        }
        /// <summary>
        /// Method to get slack user information by their slack user id
        /// </summary>
        /// <param name="slackId">slack user id</param>
        /// <returns>object of SlackUserDetailAc</returns>
        public async Task <SlackUserDetailAc> GetByIdAsync(string slackId)
        {
            SlackUserDetails slackUserDetail = await _slackUserDetailsRepository.FirstOrDefaultAsync(x => x.UserId == slackId);

            SlackUserDetailAc slackUserDetailAc = _mapper.Map <SlackUserDetailAc>(slackUserDetail);

            return(slackUserDetailAc);
        }
        /// <summary>
        /// Method to get slack user information by their slack user name. - JJ
        /// </summary>
        /// <param name="userSlackName">slack user name</param>
        /// <returns>object of SlackUserDetailAc</returns>
        public async Task <SlackUserDetailAc> GetBySlackNameAsync(string userSlackName)
        {
            SlackUserDetails slackUserDetail = await _slackUserDetailsRepository.FirstOrDefaultAsync(x => x.Name == userSlackName);

            SlackUserDetailAc slackUserDetailAc = _mapper.Map <SlackUserDetailAc>(slackUserDetail);

            return(slackUserDetailAc);
        }
        public async Task GetByIdAsync()
        {
            await _slackUserRepository.AddSlackUserAsync(slackUserDetails);

            SlackUserDetailAc slackUser = await _slackUserRepository.GetByIdAsync(_stringConstant.StringIdForTest);

            Assert.Equal(slackUser.Name, _stringConstant.FirstNameForTest);
        }
        public async Task AddSlackUserAsync()
        {
            await _slackUserRepository.AddSlackUserAsync(slackUserDetails);

            SlackUserDetailAc slackUserDetail = await _slackUserRepository.GetBySlackNameAsync(slackUserDetails.Name);

            Assert.Equal(slackUserDetail.UserId, slackUserDetails.UserId);
        }
        public async Task GetBySlackName()
        {
            await _slackUserRepository.AddSlackUserAsync(slackUserDetails);

            SlackUserDetailAc slackUser = _slackUserRepository.GetBySlackNameAsync(_stringConstant.FirstNameForTest).Result;

            Assert.Equal(slackUser.UserId, _stringConstant.StringIdForTest);
        }
        public async Task SlackUserUpdate()
        {
            await _slackUserRepository.AddSlackUserAsync(slackUserDetails);

            slackUserDetails.Name = _stringConstant.FalseStringNameForTest;
            await _slackUserRepository.AddSlackUserAsync(slackUserDetails);

            SlackUserDetailAc slackUser = _slackUserRepository.GetByIdAsync(_stringConstant.StringIdForTest).Result;

            Assert.Equal(slackUser.Name, _stringConstant.FalseStringNameForTest);
        }
Ejemplo n.º 9
0
        public async Task <IHttpActionResult> RefreshTokenAsync(string refreshToken, string slackUserName)
        {
            var oAuth = _oAuthLoginRepository.ExternalLoginInformation(refreshToken);
            SlackUserDetailAc user = await _slackUserRepository.GetBySlackNameAsync(slackUserName);

            if (user != null)
            {
                oAuth.UserId = user.UserId;
            }
            return(Ok(oAuth));
        }
        public async Task GetByIdFalse()
        {
            await _slackUserRepository.AddSlackUserAsync(slackUserDetails);

            slackUserDetails.UserId = _stringConstant.SlackChannelIdForTest;
            slackUserDetails.Name   = _stringConstant.FalseStringNameForTest;
            await _slackUserRepository.AddSlackUserAsync(slackUserDetails);

            SlackUserDetailAc slackUser = _slackUserRepository.GetByIdAsync(_stringConstant.SlackChannelIdForTest).Result;

            Assert.NotEqual(slackUser.Name, _stringConstant.FirstNameForTest);
        }
        /// <summary>
        /// Method to get leave Updated from slack button response
        /// </summary>
        /// <param name="leaveResponse">leave update response from slack</param>
        public async Task UpdateLeaveAsync(SlashChatUpdateResponse leaveResponse)
        {
            try
            {
                _logger.Debug("UpdateLeaveAsync Leave update method");
                // method to get leave by its id
                LeaveRequest leave = await _leaveRepository.LeaveByIdAsync(Convert.ToInt32(leaveResponse.CallbackId));

                _logger.Debug("UpdateLeaveAsync leave applied by : " + leave.EmployeeId);
                ApplicationUser user = await _userManagerRepository.FirstOrDefaultAsync(x => x.Id == leave.EmployeeId);

                _logger.Debug("UpdateLeaveAsync User name : " + user.UserName);
                SlackUserDetailAc slackUser = await _slackUserRepository.GetByIdAsync(user.SlackUserId);

                _logger.Debug("UpdateLeaveAsync User slack name : " + slackUser.Name);
                ApplicationUser updaterUser = await _userManagerRepository.FirstOrDefaultAsync(x => x.SlackUserId == leaveResponse.User.Id);

                if (updaterUser != null)
                {
                    _logger.Debug("UpdateLeaveAsync User want to update the leave : " + updaterUser.UserName);
                    // only pending status can be modified
                    if (leave.Status == Condition.Pending)
                    {
                        if (leaveResponse.Actions[0].Value == _stringConstant.Approved)
                        {
                            leave.Status = Condition.Approved;
                        }
                        else
                        {
                            leave.Status = Condition.Rejected;
                        }
                        await _leaveRepository.UpdateLeaveAsync(leave);

                        _logger.Debug("UpdateLeaveAsync leave updated successfully");
                        _logger.Debug("Leave details : " + leave.ToString());
                        replyText = string.Format(_stringConstant.CasualLeaveUpdateMessageForUser,
                                                  leave.Id, leave.FromDate.ToShortDateString(), leave.EndDate.Value.ToShortDateString(),
                                                  leave.Reason, leave.Status, leaveResponse.User.Name);
                        _logger.Debug("Reply text to user : "******"UpdateLeaveAsync user incoming webhook is null : " + string.IsNullOrEmpty(incomingWebHook.IncomingWebHookUrl));
                        // Used to send slack message to the user about leave updation
                        _logger.Debug("UpdateLeaveAsync Client repository - UpdateMessageAsync");
                        await _clientRepository.UpdateMessageAsync(incomingWebHook.IncomingWebHookUrl, replyText);

                        _logger.Debug("Creating Email object");
                        // Used to send email to the user about leave updation
                        EmailApplication email = new EmailApplication();
                        email.To   = new List <string>();
                        email.Body = _emailTemplateRepository.EmailServiceTemplateLeaveUpdate(leave);
                        _logger.Debug("Email body is null : " + email.Body);
                        email.From = updaterUser.Email;
                        _logger.Debug("Email from : " + email.From);
                        email.To.Add(user.Email);
                        _logger.Debug("Email from : " + email.To);
                        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,
                                                      leave.RejoinDate.Value.ToShortDateString());
                        _logger.Debug("Reply text to updator : " + replyText);
                        _logger.Debug("UpdateLeaveAsync Email sending");
                        _emailService.Send(email);
                        _logger.Debug("UpdateLeaveAsync Email successfully send");
                    }
                    else
                    {
                        _logger.Debug("UpdateLeaveAsync leave already updated");
                        replyText = string.Format(_stringConstant.AlreadyUpdatedMessage, leave.Status);
                    }
                }
                else
                {
                    replyText = _stringConstant.YouAreNotInExistInOAuthServer;
                }
            }
            catch (SmtpException ex)
            {
                replyText += string.Format(_stringConstant.ReplyTextForSMTPExceptionErrorMessage,
                                           _stringConstant.ErrorWhileSendingEmail, ex.Message.ToString());
            }
            _logger.Debug("UpdateLeaveAsync Client Repository - SendMessageAsync");
            // updating leave applied text of slack
            await _clientRepository.SendMessageAsync(leaveResponse.ResponseUrl, replyText);
        }
        /// <summary>
        /// Method to apply leave
        /// </summary>
        /// <param name="slackRequest">list of string contain leave slash command parameters</param>
        /// <param name="leave">leave slash command</param>
        /// <param name="accessToken">User's access token</param>
        /// <returns>Reply text to be send</returns>
        private async Task <string> LeaveApplyAsync(List <string> slackRequest, SlashCommand leave, string accessToken, string userId)
        {
            try
            {
                LeaveType leaveType;
                DateTime  startDate, endDate, reJoinDate;
                User      user       = new User();
                string    dateFormat = Thread.CurrentThread.CurrentCulture.DateTimeFormat.ShortDatePattern;
                _logger.Debug("LeaveApplyAsync Date format of leave command : " + dateFormat);
                _logger.Debug("LeaveApplyAsync Current Culture info : " + Thread.CurrentThread.CurrentCulture.DisplayName);
                // checking whether string can convert to date of independent culture or not, if return true then further process will be conduct
                bool startDateConvertorResult = DateTime.TryParseExact(slackRequest[3], dateFormat, CultureInfo.InvariantCulture,
                                                                       DateTimeStyles.None, out startDate);
                if (startDateConvertorResult)
                {
                    user = await _oauthCallsRepository.GetUserByUserIdAsync(userId, accessToken);

                    LeaveRequest leaveRequest = new LeaveRequest();
                    // Method to check leave's start date is not beyond today. Back date checking
                    bool validStartDate = LeaveStartDateValid(startDate);
                    if (validStartDate)
                    {
                        // checking whether string can convert to leave type or not, if return true then further process will be conduct
                        bool leaveTypeConvertorResult = Enum.TryParse(slackRequest[1], out leaveType);
                        if (leaveTypeConvertorResult)
                        {
                            // converting string to leave type of indian culture
                            switch (leaveType)
                            {
                            case LeaveType.cl:
                            {
                                _logger.Debug("LeaveApplyAsync Casual leave");
                                // checking whether string can convert to date of indian culture or not, if return true then further process will be conduct
                                bool endDateConvertorResult = DateTime.TryParseExact(slackRequest[4], dateFormat,
                                                                                     CultureInfo.InvariantCulture, DateTimeStyles.None, out endDate);
                                bool reJoinDateConvertorResult = DateTime.TryParseExact(slackRequest[5], dateFormat,
                                                                                        CultureInfo.InvariantCulture, DateTimeStyles.None, out reJoinDate);
                                if (endDateConvertorResult && reJoinDateConvertorResult)
                                {
                                    // Method to check leave's end date is not beyond start date and re-join date is not beyond end date
                                    bool validDate = ValidDateTimeForLeave(startDate, endDate, reJoinDate);
                                    if (validDate)
                                    {
                                        // get user details from oAuth server
                                        leaveRequest.EndDate    = endDate;
                                        leaveRequest.RejoinDate = reJoinDate;
                                        leaveRequest.Status     = Condition.Pending;
                                        leaveRequest.Type       = leaveType;
                                        leaveRequest.Reason     = slackRequest[2];
                                        leaveRequest.FromDate   = startDate;
                                        leaveRequest.CreatedOn  = DateTime.UtcNow;
                                        // if user doesn't exist in OAuth server then user can't apply leave
                                        if (user.Id != null)
                                        {
                                            _logger.Debug("LeaveApplyAsync leave apply user name : " + user.UserName);
                                            // Method to check more than one leave cannot be applied on that date
                                            validDate = await LeaveDateDuplicate(user.Id, startDate, endDate);

                                            if (!validDate)
                                            {
                                                leaveRequest.EmployeeId = user.Id;
                                                await _leaveRepository.ApplyLeaveAsync(leaveRequest);

                                                _logger.Debug("LeaveApplyAsync Leave applied sucessfully");
                                                replyText = _attachmentRepository.ReplyText(leave.Username, leaveRequest);
                                                _logger.Debug("LeaveApplyAsync Client Repository - SendMessageWithAttachmentIncomingWebhookAsync");
                                                // method to send slack notification and email to team leaders and management
                                                await _clientRepository.SendMessageWithAttachmentIncomingWebhookAsync(leaveRequest,
                                                                                                                      accessToken, replyText, user.Id);
                                            }
                                            else
                                            {
                                                replyText = _stringConstant.LeaveAlreadyExistOnSameDate;
                                            }
                                        }
                                        else
                                        {
                                            // if user doesn't exist in OAuth server then user can't apply leave, will get this message
                                            replyText = _stringConstant.SorryYouCannotApplyLeave;
                                        }
                                    }
                                    else
                                    {
                                        replyText = _stringConstant.InValidDateErrorMessage;
                                    }
                                }
                                else
                                {
                                    // if date is not proper than date format error message will be send to user
                                    replyText = string.Format(_stringConstant.DateFormatErrorMessage, dateFormat);
                                }
                            }
                            break;

                            case LeaveType.sl:
                            {
                                _logger.Debug("LeaveApplyAsync Sick leave");
                                bool isAdmin = false;
                                User newUser = new User();
                                if (slackRequest.Count > 4)
                                {
                                    isAdmin = await _oauthCallsRepository.UserIsAdminAsync(userId, accessToken);

                                    _logger.Debug("LeaveApplyAsync User is admin : " + isAdmin);
                                    if (isAdmin)
                                    {
                                        _logger.Debug("LeaveApplyAsync Sick Leave applying for other");
                                        SlackUserDetailAc slackUser = await _slackUserRepository.GetBySlackNameAsync(slackRequest[4]);

                                        // get user details from oAuth server for other user
                                        var newUserDetails = await _userManagerRepository.FirstOrDefaultAsync(x => x.SlackUserId == slackUser.UserId);

                                        newUser = await _oauthCallsRepository.GetUserByUserIdAsync(newUserDetails.Id, accessToken);
                                    }
                                    else
                                    {
                                        replyText = _stringConstant.AdminErrorMessageApplySickLeave;
                                    }
                                }
                                else
                                {
                                    _logger.Debug("LeaveApplyAsync Sick Leave applying for own");
                                    // get user details from oAuth server for own
                                    newUser = await _oauthCallsRepository.GetUserByUserIdAsync(userId, accessToken);

                                    leaveRequest.EndDate    = startDate;
                                    leaveRequest.RejoinDate = startDate.AddDays(1);
                                }
                                leaveRequest.Status    = Condition.Approved;
                                leaveRequest.Type      = leaveType;
                                leaveRequest.Reason    = slackRequest[2];
                                leaveRequest.FromDate  = startDate;
                                leaveRequest.CreatedOn = DateTime.UtcNow;
                                // if user doesn't exist in OAuth server then user can't apply leave
                                if (newUser.Id != null)
                                {
                                    // Method to check more than one leave cannot be applied on that date
                                    bool validDate = await LeaveDateDuplicate(newUser.Id, startDate, null);

                                    if (!validDate)
                                    {
                                        leaveRequest.EmployeeId = newUser.Id;
                                        await _leaveRepository.ApplyLeaveAsync(leaveRequest);

                                        _logger.Debug("LeaveApplyAsync Leave applied successfully");
                                        replyText = _attachmentRepository.ReplyTextSick(newUser.FirstName, leaveRequest);
                                        _logger.Debug("LeaveApplyAsync Client Repository - SendMessageWithoutButtonAttachmentIncomingWebhookAsync");
                                        await _clientRepository.SendMessageWithoutButtonAttachmentIncomingWebhookAsync(leaveRequest,
                                                                                                                       accessToken, replyText, newUser.Id);

                                        if (isAdmin)
                                        {
                                            _logger.Debug("LeaveApplyAsync Client Repository - SendSickLeaveMessageToUserIncomingWebhookAsync");
                                            await _clientRepository.SendSickLeaveMessageToUserIncomingWebhookAsync(leaveRequest,
                                                                                                                   user.Email, replyText, newUser);
                                        }
                                    }
                                    else
                                    {
                                        replyText = _stringConstant.LeaveAlreadyExistOnSameDate;
                                    }
                                }
                                else
                                {
                                    // if user doesn't exist in OAuth server then user can't apply leave, will get this message
                                    replyText += _stringConstant.SorryYouCannotApplyLeave;
                                }
                            }
                            break;
                            }
                        }
                        else
                        {
                            // if leave type is not proper than not of leave type format error message will be send to user
                            replyText = _stringConstant.NotTypeOfLeave;
                        }
                    }
                    else
                    {
                        replyText = _stringConstant.BackDateErrorMessage;
                    }
                }
                else
                {
                    // if date is not proper than date format error message will be send to user
                    replyText = string.Format(_stringConstant.DateFormatErrorMessage, dateFormat);
                }
            }
            catch (SmtpException ex)
            {
                // error message will be send to email. But leave will be applied
                replyText = string.Format(_stringConstant.ReplyTextForSMTPExceptionErrorMessage,
                                          _stringConstant.ErrorWhileSendingEmail, ex.Message.ToString());
            }
            return(replyText);
        }