Ejemplo n.º 1
0
 public async Task ProcessRequest(EventWrapperRequest request)
 {
     try
     {
         await FindSimilar(request);
     }
     catch (Exception e)
     {
         if (request?.Event?.Channel != null)
         {
             await _slackClient.SendMessageAsync(request.Event.Channel, Phrases.SlackError);
         }
         _logger.LogError(e, e.Message);
     }
 }
Ejemplo n.º 2
0
        public async Task ProcessRequest_MessageFromBot_Ignore()
        {
            //Arrange
            var slackEvent = new SlackEvent
            {
                BotId = "123456"
            };
            var request = new EventWrapperRequest
            {
                Event = slackEvent
            };

            // Act
            await _eventService.ProcessRequest(request);

            // Assert
            _elasticSearchService.VerifyNoOtherCalls();
            _slackClientMock.VerifyNoOtherCalls();
        }
Ejemplo n.º 3
0
        public async Task ProcessRequest_EventTypeWrong_Ignore()
        {
            //Arrange
            var slackEvent = new SlackEvent
            {
                Type = "EmojiReaction"
            };
            var request = new EventWrapperRequest
            {
                Event = slackEvent
            };

            // Act
            await _eventService.ProcessRequest(request);

            // Assert
            _elasticSearchService.VerifyNoOtherCalls();
            _slackClientMock.VerifyNoOtherCalls();
        }
Ejemplo n.º 4
0
        public async Task ProcessRequest_MessageTextIsEmpty_Ignore()
        {
            //Arrange
            var slackEvent = new SlackEvent
            {
                Text = string.Empty
            };
            var request = new EventWrapperRequest
            {
                Event = slackEvent
            };

            // Act
            await _eventService.ProcessRequest(request);

            // Assert
            _elasticSearchService.VerifyNoOtherCalls();
            _slackClientMock.VerifyNoOtherCalls();
        }
Ejemplo n.º 5
0
        public EventServiceTests()
        {
            var elasticsearchSettingsMock = new Mock <IOptions <ElasticsearchSettings> >();

            elasticsearchSettingsMock
            .SetupGet(m => m.Value)
            .Returns(() => new ElasticsearchSettings());

            _elasticSearchService      = new Mock <IElasticSearchService>();
            _slackClientMock           = new Mock <ISlackHttpClient>();
            _searchableTextServiceMock = new Mock <ISearchableTextService>();
            var logger = new Mock <ILogger <EventService> >();

            _eventService = new EventService(_slackClientMock.Object, _elasticSearchService.Object,
                                             _searchableTextServiceMock.Object, logger.Object);

            var slackEvent = new SlackEvent
            {
                Text    = "Hello from Slack!",
                Channel = "CBGJMA0TA",
                UserId  = "UBJ6GC75K",
                Type    = "message"
            };

            _request = new EventWrapperRequest
            {
                Event = slackEvent
            };

            _question = new SearchableQuestion
            {
                Id   = Guid.NewGuid().ToString(),
                Text = "???"
            };

            _answer = new SearchableAnswer()
            {
                Text       = "???",
                Id         = Guid.NewGuid().ToString(),
                QuestionId = Guid.NewGuid().ToString()
            };
        }
Ejemplo n.º 6
0
        private async Task FindSimilar(EventWrapperRequest request)
        {
            if (request == null)
            {
                throw new ArgumentNullException(nameof(request));
            }
            if (request.Event.Type != "message")
            {
                return;
            }
            // ignore bot answers
            if (request.Event.BotId != null)
            {
                return;
            }
            var askedQuestion = request.Event?.Text;

            if (string.IsNullOrWhiteSpace(askedQuestion))
            {
                return;
            }

            _logger.LogInformation("User with id {UserId} asked a question {Question}",
                                   request.Event.UserId, askedQuestion);

            var attachments = new List <AttachmentDto>();

            // questions
            var similarQuestions = await Search <QuestionElasticSearchRequest, SearchableQuestion>(
                askedQuestion, NecessaryNumberOfQuestions,
                _elasticSearchService.SearchAsync <SearchableQuestion>);

            attachments.AddRange(similarQuestions.Select(CreateQuestionAttachment));

            // confluence
            var confluencePages = await Search <ConfluenceElasticSearchRequest, SearchableConfluence>(
                askedQuestion, NecessaryNumberOfConfluencePages,
                _elasticSearchService.SearchWithTitleAsync <SearchableConfluence>);

            AddToAttachments(attachments, CreateConfluenceAttachment(confluencePages));

            // jira
            var jiraIssues = await Search <JiraElasticSearchRequest, SearchableJira>(
                askedQuestion, NecessaryNumberOfJiraIssues,
                _elasticSearchService.SearchWithTitleAsync <SearchableJira>);

            AddToAttachments(attachments, CreateJiraAttachment(jiraIssues));

            // answers
            if (similarQuestions.Count < NecessaryNumberOfQuestions)
            {
                var searchableAnswers = await Search <AnswerElasticSearchRequest, SearchableAnswer>(
                    askedQuestion, NecessaryNumberOfAnswers,
                    _elasticSearchService.SearchAsync <SearchableAnswer>);

                var searchableQuestions = await _searchableTextService
                                          .GetQuestionsAsync(searchableAnswers.Select(q => Guid.Parse(q.QuestionId)));

                AddToAttachments(attachments, CreateAnswersAttachment(searchableAnswers, searchableQuestions));
            }

            // ask experts
            attachments.Add(CreateAskExpertsAttachment(askedQuestion));

            await _slackClient.SendMessageAsync(request.Event.Channel,
                                                similarQuestions.Count != 0?Phrases.SimilarQuestions : null,
                                                attachments);
        }