Пример #1
0
        public void Run(JiraConfiguration settings, TextWriter output)
        {
            if (Period == null || Users == null)
            {
                throw new InvalidOperationException(
                          $"{nameof(Period)} and {nameof(Users)} must be initialized before running command.");
            }

            if (Users.Length == 0)
            {
                throw new InvalidOperationException($"{nameof(Users)} must contain at least one user.");
            }

            output.WriteLine("Downloading worklogs for period of {0}.", Period);

            var jiraClient = new RestApiServiceClient(new HttpClientHandler(), settings.BaseUrl,
                                                      settings.Login,
                                                      settings.Password);
            var views = DownloadTimesheetAsync(jiraClient, Users, Period).Result;

            output.WriteLine();

            using (var fileWriter = GetFileWriter(OutputFileName))
            {
                var compositOutput = new CompositTextWriter(fileWriter, output);
                //printing into output
                foreach (var view in views)
                {
                    compositOutput.WriteLine("Worklogs for user \"{0}\":", view.Author.Name);
                    view.Print(new PlainTextOutput(compositOutput));
                    compositOutput.WriteLine();
                }
            }
        }
Пример #2
0
        private async Task <IEnumerable <ProjectViewModel> > DownloadTimesheetAsync(RestApiServiceClient client,
                                                                                    IEnumerable <string> users, Period period)
        {
            //NOTE: downloading timesheets for users not in single search request but simultaneously to increase speed
            var downloadTasks = users.Select(user => DownloadTimesheetImplAsync(client, period, user)).ToList();

            return(await Task.WhenAll(downloadTasks));
        }
Пример #3
0
        private async Task <ProjectViewModel> DownloadTimesheetImplAsync(RestApiServiceClient client,
                                                                         Period period,
                                                                         params string[] users)
        {
            var issuesRequest = BuildRequest(period, users);

            if (users.Length != 1)
            {
                throw new NotImplementedException();
            }

            //NOTE: our jira search request return all issues that match our request,
            //but this issues also may include worklogs that are not in requested period or for requested author
            //worklogs must be filtered here to match user request
            var issuesWithWorklogs = await client.GetIssuesAsync(issuesRequest);

            //mapping models to view models
            var authorViewModel  = new AuthorViewModel(users[0]);
            var issuesViewModels = new List <IssueViewModel>();

            foreach (var issue in issuesWithWorklogs)
            {
                var issueViewModel = new IssueViewModel(issue);
                issueViewModel.Worklogs = issue.worklogs
                                          .Where(w => authorViewModel.Name.Equals(w.authorName, StringComparison.InvariantCultureIgnoreCase))
                                          .Where(w => w.started.Date >= period.StartDate && w.started.Date <= period.EndDate)
                                          .Select(w =>
                {
                    var worklogViewModel = new WorklogViewModel(w)
                    {
                        Issue  = issueViewModel,
                        Author = authorViewModel
                    };
                    return(worklogViewModel);
                }).ToList();

                issuesViewModels.Add(issueViewModel);
            }

            var workDayViewModels = issuesViewModels.SelectMany(issue => issue.Worklogs)
                                    .GroupBy(w => w.StarteDate)
                                    .Select(g => new WorkDayViewModel {
                Worklogs = g.ToList()
            })
                                    .ToList();

            var projectViewModel = new ProjectViewModel(issuesViewModels, workDayViewModels, authorViewModel, period);

            return(projectViewModel);
        }