Exemple #1
0
        /// <summary>
        /// Returns a string which represents specified ProjectIdentifier.
        /// </summary>
        /// <param name="projectIdentifier">ProjectIdentifier instance.</param>
        /// <returns>Returns string.</returns>
        public static string GetProjectIdentifier(ProjectIdentifier projectIdentifier)
        {
            if (projectIdentifier == null)
            {
                throw new ArgumentNullException("projectIdentifier");
            }

            StringBuilder strBuilder = new StringBuilder();

            strBuilder.Append(projectIdentifier.Name);
            strBuilder.Append(Colon);

            for (int i = 0; i < projectIdentifier.Numbers.Count; i++)
            {
                strBuilder.Append(projectIdentifier.Numbers[i]);
                if (i != projectIdentifier.Numbers.Count - 1)
                {
                    strBuilder.Append(Comma);
                }
            }

            return(strBuilder.ToString());
        }
        public async Task OnGet()
        {
            #region Example with default fields (1 level)

            MemberProfile = await _teamDirectoryClient.Profiles.GetProfileAsync(ProfileIdentifier.Me);

            #endregion

            #region Example with full field definitions

            MemberProfile = await _teamDirectoryClient.Profiles.GetProfileAsync(ProfileIdentifier.Me, partial => partial
                                                                                .WithAllFieldsWildcard() // adds all fields for the current partial request (one level)
                                                                                .WithId()
                                                                                .WithName(name => name
                                                                                          .WithFirstName()
                                                                                          .WithLastName())
                                                                                .WithEmails(emails => emails.WithAllFieldsWildcard())
                                                                                .WithMessengers()
                                                                                .WithPhones()
                                                                                .WithLinks()
                                                                                .WithBirthday()
                                                                                .WithLanguages(languages => languages
                                                                                               .WithAllFieldsWildcard()
                                                                                               .WithLanguage(language => language.WithAllFieldsWildcard()))
                                                                                .WithAbsences(absence => absence.WithAllFieldsWildcard())
                                                                                .WithMemberships(membership => membership
                                                                                                 .WithAllFieldsWildcard()
                                                                                                 .WithRole(role => role.WithName())
                                                                                                 .WithTeam(team => team.WithName()))
                                                                                .WithLocations(locations => locations
                                                                                               .WithId()
                                                                                               .WithLocation(location => location
                                                                                                             .WithName())));

            #endregion

            var weekStart = StartOfWeek(DateTime.UtcNow, DayOfWeek.Monday);
            var weekEnd   = weekStart.AddDays(7).AddHours(23).AddMinutes(59).AddSeconds(59);

            var issuesCreatedThisWeek       = 0;
            var issuesResolvedThisWeek      = 0;
            var reviewsCreatedThisWeek      = 0;
            var reviewsParticipatedThisWeek = 0;
            var todoClosedThisWeek          = 0;
            var meetingsThisWeek            = 0;

            await foreach (var project in _projectClient.GetAllProjectsByMemberAsyncEnumerable(ProfileIdentifier.Id(MemberProfile.Id)))
            {
                try
                {
                    // Check # of issues resolved this week
                    var issueStatuses = await _projectClient.Planning.Issues.Statuses.GetAllIssueStatusesAsync(ProjectIdentifier.Id(project.Id));

                    await foreach (var issue in _projectClient.Planning.Issues.GetAllIssuesAsyncEnumerable(ProjectIdentifier.Id(project.Id), assigneeId: new List <ProfileIdentifier>(), statuses: issueStatuses.Select(it => it.Id).ToList(), sorting: IssuesSorting.UPDATED, descending: true, partial: _ => _
                                                                                                           .WithAllFieldsWildcard()
                                                                                                           .WithCreationTime()
                                                                                                           .WithCreatedBy(createdBy => createdBy
                                                                                                                          .WithDetails(details => details
                                                                                                                                       .ForInherited <CUserPrincipalDetails>(details => details
                                                                                                                                                                             .WithUser(user => user
                                                                                                                                                                                       .WithId()))
                                                                                                                                       .ForInherited <CUserWithEmailPrincipalDetails>(details => details
                                                                                                                                                                                      .WithName()
                                                                                                                                                                                      .WithEmail())))
                                                                                                           .WithStatus()
                                                                                                           .WithAssignee(assignee => assignee
                                                                                                                         .WithId())
                                                                                                           .WithChannel(channel => channel
                                                                                                                        .WithLastMessage(lastMessage => lastMessage
                                                                                                                                         .WithText()
                                                                                                                                         .WithTime()))))
                    {
                        var created     = issue.CreationTime;
                        var lastUpdated = issue.Channel.LastMessage?.Time.AsDateTime() ?? created;
                        if (lastUpdated < weekStart)
                        {
                            break;
                        }

                        // Created
                        if (issue.CreatedBy.Details is CUserPrincipalDetails userPrincipal && userPrincipal.User?.Id == MemberProfile.Id)
                        {
                            if (created >= weekStart && created <= weekEnd)
                            {
                                issuesCreatedThisWeek++;
                            }
                        }

                        // Resolved
                        if (issue.Assignee?.Id == MemberProfile.Id)
                        {
                            if (lastUpdated >= weekStart && lastUpdated <= weekEnd)
                            {
                                var wasStatusUpdate = issue.Channel.LastMessage?.Text == "changed status";
                                if (wasStatusUpdate && issue.Status.IsResolved)
                                {
                                    issuesResolvedThisWeek++;
                                }
                            }
                        }
                    }
                }
                catch (Exception ex)
                {
                    _logger.LogError("An error occurred", ex);
                }

                try
                {
                    // Check # of reviews created and participated in
                    Partial <CodeReviewWithCount> codeReviewPartial(Partial <CodeReviewWithCount> _) => _
                    .WithAllFieldsWildcard()
                    .WithReview()
                    .WithAuthors()
                    .WithParticipants();

                    var reviews = await _projectClient.CodeReviews.GetAllCodeReviewsAsyncEnumerable(ProjectIdentifier.Id(project.Id), ReviewSorting.LastUpdatedDesc, state : null, from : weekStart, partial : codeReviewPartial).ToListAsync();

                    foreach (var review in reviews)
                    {
                        var createdAt = review.Review switch
                        {
                            CommitSetReviewRecord commitSetReview => commitSetReview.CreatedAt.AsDateTime(),
                            MergeRequestRecord mergeRequest => mergeRequest.CreatedAt.AsDateTime(),
                                 _ => DateTime.MinValue
                        };

                        if (createdAt >= weekStart && createdAt <= weekEnd)
                        {
                            if (review.Participants.Participants.Any(it => it.User.Id == MemberProfile.Id && it.Role == CodeReviewParticipantRole.Author))
                            {
                                reviewsCreatedThisWeek++;
                            }
                        }

                        if (review.Participants.Participants.Any(it => it.User.Id == MemberProfile.Id && it.Role == CodeReviewParticipantRole.Reviewer))
                        {
                            reviewsParticipatedThisWeek++;
                        }
                    }
                }
                catch (Exception ex)
                {
                    _logger.LogError("An error occurred", ex);
                }
            }

            try
            {
                // Check # of TO-DO items resolved
                await foreach (var todo in _todoClient.GetAllTodoItemsAsyncEnumerable(from: weekStart, partial: _ => _
                                                                                      .WithId()
                                                                                      .WithContent(content => content
                                                                                                   .ForInherited <TodoItemContentMdText>(md => md
                                                                                                                                         .WithAllFieldsWildcard()))
                                                                                      .WithStatus()))
                {
                    if (todo.Status == "Closed")
                    {
                        todoClosedThisWeek++;
                    }
                }
            }
            catch (Exception ex)
            {
                _logger.LogError("An error occurred", ex);
            }

            try
            {
                await foreach (var meeting in _calendarClient.Meetings.GetAllMeetingsAsyncEnumerable(profiles: new List <string> {
                    MemberProfile.Id
                }, includePrivate: true, includeArchived: false, includeMeetingInstances: true, startingAfter: weekStart, endingBefore: weekEnd, partial: _ => _
                                                                                                     .WithAllFieldsWildcard()
                                                                                                     .WithId()
                                                                                                     .WithSummary()
                                                                                                     .WithDescription()
                                                                                                     .WithConferenceLink()))
                {
                    meetingsThisWeek++;

                    if (meeting.OccurrenceRule.Start.Date == DateTime.UtcNow.Date)
                    {
                        MeetingsToday.Add(meeting);
                    }
                }
            }
            catch (Exception ex)
            {
                _logger.LogError("An error occurred", ex);
            }

            IssuesCreatedThisWeek       = issuesCreatedThisWeek;
            IssuesResolvedThisWeek      = issuesResolvedThisWeek;
            ReviewsCreatedThisWeek      = reviewsCreatedThisWeek;
            ReviewsParticipatedThisWeek = reviewsParticipatedThisWeek;
            TodoClosedThisWeek          = todoClosedThisWeek;
            MeetingsThisWeek            = meetingsThisWeek;
        }
Exemple #3
0
        public static async IAsyncEnumerable <ITypeSymbol> GetTypeDependencies(this ISymbol symbol, CompilationCache compilationCache, ProjectIdentifier containingProject, bool includeExternalMetadata = true, [EnumeratorCancellation] CancellationToken ct = default)
        {
            foreach (var syntaxRef in symbol.DeclaringSyntaxReferences)
            {
                if (ct.IsCancellationRequested)
                {
                    yield break;
                }
                var root = await syntaxRef.GetSyntaxAsync(ct);

                var model = await compilationCache.GetSemanticModel(syntaxRef.SyntaxTree, containingProject, ct);

                if (model == null)
                {
                    continue;
                }
                foreach (var referenced in root.GetAllReferencedTypeSymbols(model, includeExternalMetadata))
                {
                    yield return(referenced);
                }
            }
        }