Public/Report/Get-OCM365TeamMembership.ps1

function Get-OCM365TeamMembership {
    <#
    .SYNOPSIS
        Retrieves all Microsoft Teams and their memberships.

    .DESCRIPTION
        Gets all Teams in the tenant and retrieves detailed membership information for each team.
        Returns team information along with member details including user ID, email, and roles.

    .EXAMPLE
        Get-OCM365TeamMembership
        Retrieves all teams and their members.

    .NOTES
        Requires Microsoft Graph PowerShell module and an active Graph connection.
        Required Graph API permissions: Team.ReadBasic.All, TeamMember.Read.All
    #>

    [CmdletBinding()]
    param ()

    begin {
        Write-Debug "[Get-OCM365TeamMembership] Starting function"
        
        # Check if connected to Microsoft Graph
        $mgContext = Get-MgContext
        if (-not $mgContext) {
            Write-Error "Not connected to Microsoft Graph. Please run Connect-MgGraph first." -ErrorAction Stop
            throw "Not connected to Microsoft Graph. Please run Connect-MgGraph first."
        }
        
        Write-Debug "[Get-OCM365TeamMembership] Successfully validated Graph connection"

        # Check required permissions using the permission hierarchy function
        $requiredScopes = @('Team.ReadBasic.All', 'TeamMember.Read.All')
        if (-not (Test-OCM365GraphPermission -RequiredPermissions $requiredScopes -Scopes $mgContext.Scopes)) {
            $message = "Missing required permissions: $($requiredScopes -join ', '). Current scopes: $($mgContext.Scopes -join ', ')"
            Write-Error $message -ErrorAction Stop
            throw $message
        }
        
        Write-Debug "[Get-OCM365TeamMembership] Permission validation successful"
        
        Write-Information "Starting Teams and membership retrieval" -InformationAction $InformationPreference
    }

    process {
        Write-Verbose "Retrieving all Teams and their memberships..." -Verbose:$VerbosePreference
        Write-Debug "[Get-OCM365TeamMembership] Calling Get-MgTeam"
        
        try {
            $teams = Get-MgTeam -All -ErrorAction Stop -Verbose:$VerbosePreference -Debug:$DebugPreference
            Write-Information "Found $($teams.Count) teams" -InformationAction $InformationPreference
            Write-Verbose "Found $($teams.Count) teams" -Verbose:$VerbosePreference
            Write-Debug "[Get-OCM365TeamMembership] Retrieved teams count: $($teams.Count)"
            
            $results = foreach ($team in $teams) {
                Write-Progress -Activity "Processing Teams" -Status "Processing $($team.DisplayName)" -ProgressAction $ProgressPreference
                Write-Debug "[Get-OCM365TeamMembership] Processing team: $($team.DisplayName) (ID: $($team.Id))"
                
                Write-Verbose "Getting members for team: $($team.DisplayName)" -Verbose:$VerbosePreference
                $members = Get-MgTeamMember -TeamId $team.Id -All -ErrorAction Stop -Verbose:$VerbosePreference -Debug:$DebugPreference | ForEach-Object {
                    Write-Debug "[Get-OCM365TeamMembership] Processing member: $($_.AdditionalProperties.email)"
                    @{
                        UserId       = $_.AdditionalProperties.userId
                        TenantId     = $_.AdditionalProperties.tenantId
                        Mail         = $_.AdditionalProperties.email
                        MembershipId = $_.Id
                        Roles        = $_.Roles
                    }
                }
                
                Write-Debug "[Get-OCM365TeamMembership] Team $($team.DisplayName) has $($members.Count) members"
                
                [PSCustomObject]@{
                    DisplayName = $team.DisplayName
                    TeamId      = $team.Id
                    Team        = $team
                    Members     = $members
                }
            }
            
            Write-Progress -Activity "Processing Teams" -Completed -ProgressAction $ProgressPreference
            Write-Information "Retrieved $($results.Count) teams with membership information" -InformationAction $InformationPreference
            Write-Verbose "Retrieved $($results.Count) teams with membership information" -Verbose:$VerbosePreference
            Write-Debug "[Get-OCM365TeamMembership] Teams retrieval complete"
            
            return $results
        }
        catch {
            Write-Error "Failed to retrieve team memberships: $_" -ErrorAction Stop
            throw
        }
    }
}