functions/Public/Methods/Set-Mga.ps1

function Set-Mga {
    <#
    .LINK
    https://github.com/baswijdenes/Optimized.Mga/
 
    .LINK
    https://baswijdenes.com/c/microsoft/mga/
 
    .SYNOPSIS
    Set-Mga is an Alias for the method Patch.
 
    .DESCRIPTION
    Updates an object in the Azure AD tenant with the Microsoft Graph API.
    Json, XML, and CSV is converted to a PSObject.
 
    .PARAMETER Uri
    Uri to the Microsoft Graph API.
    You can also use the last part of an Uri and the rest will be automatically added.
    Example: /users
    Example: https://graph.microsoft.com/v1.0/users
    Example: users?$filter=displayName eq 'Bas Wijdenes'
    Example: beta/users
 
    .PARAMETER Body
    Body will accept a PSObject or a Json string.
 
    .PARAMETER Reference
    This is not a mandatory parameter.
    By using v1.0 or beta it will always overwrite the value given in the Uri.
    By using All it will first try v1.0 in a try and catch. and when it jumps to the catch it will use the beta reference.
 
    .PARAMETER CustomHeader
    This not a not mandatory parameter, there is a default header containing application/json.
    By using this parameter you can add a custom header. The CustomHeader is reverted back to the original after the cmdlet has run.
 
    .PARAMETER Batch
    By using Batch you can patch multiple objects at once by using Batch-Mga.
    This will only work for a body that has the members@odata.bind property.
 
    .EXAMPLE
    $users = Get-Mga 'https://graph.microsoft.com/v1.0/users'
    $UserList = [System.Collections.Generic.List[Object]]::new()
    foreach ($User in $users)
    {
        $DirectoryObject = "https://graph.microsoft.com/v1.0/directoryObjects/$($User.id)"
        $UserList.Add($DirectoryObject)
    }
    $Body = [PSCustomObject] @{
        "members@odata.bind" = $UserList
    }
    Set-Mga -Uri 'https://graph.microsoft.com/v1.0/groups/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx' -Body $Body
    #>

    [CmdletBinding()]
    param (
        [Parameter(Mandatory = $true, Position = 0)]
        [Alias('URL')]
        [string]
        $Uri,
        [Parameter(Mandatory = $true)]
        [Alias('InputObject')]
        [object]
        $Body,
        [Parameter(Mandatory = $false)]
        [switch]
        $Batch,
        [Parameter(Mandatory = $false)]
        [object]
        $CustomHeader
    )
    begin {
        try {
            $StartMgaBeginDefault = Start-MgaBeginDefault -CustomHeader $CustomHeader -Reference $Reference -Uri $Uri
            $Uri = $StartMgaBeginDefault.Uri
            $UpdateMgaUriReference = $StartMgaBeginDefault.UpdateMgaUriReference
            $ValidateJson = ConvertTo-MgaJson -Body $Body -Validate
        }
        catch {
            throw $_
        }
    }
    process {
        try {

            if (($ValidateJson -eq $false) -and (($Body.'members@odata.bind').count -gt 20)) {
                $GroupedInputObject = [system.Collections.Generic.List[system.Object]]::new()
                foreach ($Line in $Body.'members@odata.bind') {
                    $GroupedInputObject.Add($Line)
                    if ($($GroupedInputObject).count -eq 20) {
                        $GroupedInputObject = [PSCustomObject] @{
                            'members@odata.bind' = $GroupedInputObject
                        }
                        if ($Batch -eq $true) {
                            if ($null -eq $PatchToBatch) {                       
                                $PatchToBatch = [system.Collections.Generic.List[system.Object]]::new()
                            }
                            $ToBatch = [PSCustomObject]@{
                                Method = 'PATCH'
                                Url    = $Uri
                                Body   = $GroupedInputObject
                            }
                            $PatchToBatch.Add($ToBatch)
                        }
                        else {
                            $EndResult += Set-Mga -Body $GroupedInputObject -URL $Uri
                        }
                        $GroupedInputObject = [system.Collections.Generic.List[system.Object]]::new()
                    }
                }
                if (($Batch -eq $true)) {
                    $EndResult = Batch-Mga -Body $PatchToBatch
                }
                elseif (-not([string]::IsNullOrEmpty($GroupedInputObject))) {
                    if ($GroupedInputObject.count -gt 1) {
                        $GroupedInputObject = [PSCustomObject] @{
                            'members@odata.bind' = $GroupedInputObject
                        }
                    }
                    else {
                        $GroupedInputObject = [PSCustomObject] @{
                            '@odata.id' = $GroupedInputObject
                        }
                    }
                    $EndResult += Set-Mga -Body $GroupedInputObject -URL $Uri
                }
            }
            else {
                $InvokeWebRequestSplat = @{
                    Headers = $Script:MgaSession.HeaderParameters
                    Uri     = $Uri
                    Method  = 'Patch'
                }
                $Body = ConvertTo-MgaJson -Body $Body
                if ($Body) {
                    $InvokeWebRequestSplat.Body = $Body
                }
                $Result = Invoke-WebRequest @InvokeWebRequestSplat
                $EndResult = ConvertTo-MgaResult -Response $Result
            }
        }
        catch {
            $StartMgaProcessCatchDefaultSplat = @{
                Uri                   = $Uri
                Reference             = $Reference
                UpdateMgaUriReference = $UpdateMgaUriReference
                Result                = $Result
                Throw                 = $_
            }
            $Uri = (Start-MgaProcessCatchDefault @StartMgaProcessCatchDefaultSplat).Uri
            $MgaSplat = @{
                Uri = $Uri
            }
            if ($Body) {
                $MgaSplat.Body = $Body
            }
            $EndResult += Set-Mga @MgaSplat
            $ReturnVerbose = $False
        }
    }
    end {
        Complete-MgaResult -Result $EndResult -CustomHeader $CustomHeader -ReturnVerbose $ReturnVerbose
    }
}