Private/Format-RyverUserObject.ps1

function Format-RyverUserObject {
    <#
    .SYNOPSIS
        Parse user objects.
 
    .DESCRIPTION
        Parse user objects.
 
    .INPUTS
        System.Management.Automation.PSCustomObject[]
 
    .INPUTS
        System.Management.Automation.PSCustomObject
 
    .NOTES
        - Troy Lindsay
        - Twitter: @troylindsay42
        - GitHub: tlindsay42
 
    .EXAMPLE
        Format-RyverUserObject -InputObject $objects
        Parses user objects.
 
    .EXAMPLE
        $objects | Format-RyverUserObject
        Parses user objects via the pipeline.
 
    .EXAMPLE
        Format-RyverChannelObject $objects
        Parses user objects via positional parameter.
 
    .LINK
        https://tlindsay42.github.io/PSRyver/Private/Format-RyverUserObject/
 
    .LINK
        https://github.com/tlindsay42/PSRyver/blob/master/PSRyver/Private/Format-RyverUserObject.ps1
 
    .FUNCTIONALITY
        Ryver
    #>

    [CmdletBinding(
        HelpUri = 'https://tlindsay42.github.io/PSRyver/Private/Format-RyverUserObject/'
    )]
    [OutputType( [PSCustomObject[]] )]
    [OutputType( [PSCustomObject] )]
    param (
        # The user objects to parse.
        [Parameter(
            Mandatory = $true,
            Position = 0,
            ValueFromPipeline = $true
        )]
        [PSCustomObject[]]
        $InputObject
    )

    begin {
        $function = $MyInvocation.MyCommand.Name
        Write-Verbose -Message "Beginning: '${function}'."
    }

    process {
        Write-Verbose -Message (
            "Processing: '${function}' with ParameterSetName '$( $PSCmdlet.ParameterSetName )' and Parameters: " +
            ( $PSBoundParameters | Remove-SensitiveData | Format-Table -AutoSize | Out-String )
        )

        foreach ( $object in $InputObject ) {
            $IsDetailedObject = $null -ne (
                $object |
                    Select-Object -ExpandProperty 'CreateDate' -ErrorAction 'SilentlyContinue'
            )

            $IsBasicObject = $null -ne (
                $object |
                    Select-Object -ExpandProperty 'DisplayName' -ErrorAction 'SilentlyContinue'
            )

            $IsSimpleObject = $null -ne (
                $object |
                    Select-Object -ExpandProperty '__Deferred' -ErrorAction 'SilentlyContinue' |
                    Select-Object -ExpandProperty 'Uri' -ErrorAction 'SilentlyContinue'
            )

            if ( $IsDetailedObject -eq $true ) {
                [PSCustomObject] @{
                    PSTypeName              = "PSRyver.$( $object.__Metadata.Type )"
                    Metadata                = [PSCustomObject] @{
                        Uri  = $object.__Metadata.Uri
                        Type = $object.__Metadata.Type
                        ETag = $object.__Metadata.ETag
                    }
                    ID                      = $object.ID.ToUInt64( $null )
                    CreateDate              = $object.CreateDate
                    ModifyDate              = $object.ModifyDate
                    CreateSource            = $object.CreateSource
                    ModifySource            = $object.ModifySource
                    Version                 = $object.Version
                    UserName                = $object.UserName
                    EmailAddress            = $object.EmailAddress
                    PendingEmailAddress     = $object.PendingEmailAddress
                    PendingEmailAddressDate = $object.PendingEmailAddressDate
                    DisplayName             = $object.DisplayName
                    Description             = $object.Description
                    AboutMe                 = $object.AboutMe
                    HasAvatar               = $object.HasAvatar
                    NewUser                 = $object.NewUser
                    InviteDate              = $object.InviteDate
                    InviteAcceptedDate      = $object.InviteAcceptedDate
                    InviteMessage           = $object.InviteMessage
                    Roles                   = $object.Roles
                    Features                = $object.Features
                    IsCreator               = $object.IsCreator
                    Active                  = $object.Active
                    Locked                  = $object.Locked
                    Verified                = $object.Verified
                    JIDLocal                = $object.JIDLocal
                    JID                     = $object.JID
                    Type                    = 'User'
                    RyverType               = $object.Type
                    TimeZone                = $object.TimeZone
                    TagDefs                 = $object.TagDefs
                    Descriptor              = $object.__Descriptor
                    Permissions             = $object.__Permissions
                    CreateUser              = $object.CreateUser
                    ModifyUser              = $object.ModifyUser
                    Board                   = $object.Board
                    ExternalLinks           = $object.ExternalLinks
                    Phones                  = $object.Phones
                    WorkRooms               = $object.WorkRooms
                    NotificationEndpoints   = $object.NotificationEndpoints
                    DefaultPublicReadAcl    = $object.DefaultPublicReadAcl
                    DefaultPublicWriteAcl   = $object.DefaultPublicWriteAcl
                    Groups                  = $object.Groups
                    Tasks                   = $object.Tasks
                }
            }
            elseif ( $IsBasicObject -eq $true ) {
                [PSCustomObject] @{
                    PSTypeName  = "PSRyver.$( $object.__Metadata.Type )"
                    Metadata    = [PSCustomObject] @{
                        Type = $object.__Metadata.Type
                    }
                    ID          = $object.ID.ToUInt64( $null )
                    Descriptor  = $object.__Descriptor
                    DisplayName = $object.DisplayName
                    UserName    = $object.UserName
                    Type        = 'User'
                }
            }
            elseif ( $IsSimpleObject -eq $true ) {
                [PSCustomObject] @{
                    Uri = $object.__Deferred.Uri
                }
            }
            else {
                Write-Error -Message "Invalid object: '${object}'."
            }
        }
    }

    end {
        Write-Verbose -Message "Ending: '${function}'."
    }
}