Private/Session/_Classes.ps1

#Enumeration of authentication types used to create the session object
enum AuthenticationType {
    ApplicationIdWithSecret 
    ApplicationIdWithCertificate
}

#Enumeration of objecttype used to generate the objects reference uri
enum ObjectType {
    group 
    user
    directoryObject
}

class Token {
    [datetime] $ExpireDateTime
    [string] $Type
    [string] $Value 
    [bool]  $Valid
    [string] $Reason

    Token(){
        $this.Valid = $false
        $this.Reason = "No token information present"
    }
    
    Token([bool]$Valid = $false,$Reason) {
        $this.Valid = $Valid
        $this.Reason = $Reason
    }

    Token ([string]$Type,[string]$Value,[int]$ExpiresIn) {
        $this.Type = $Type
        $this.Value = $Value
        $this.ExpireDateTime = (Get-date).AddSeconds($ExpiresIn)  
        $this.Valid = $true
    }
}

class CredentialDetails {
    [string] $TenantId
    [string] $ApplicationId
    [string] $Secret
    CredentialDetails(){

    }
    CredentialDetails([string]$TenantId,[string]$ApplicationId,[string]$Secret) {
        $this.TenantId  = $TenantId
        $this.ApplicationId = $ApplicationId
        $this.Secret = $Secret
    }
}

class Request {
}



class Session {
    [AuthenticationType] $AuthenticationType
    [CredentialDetails] $Credentials
    [Token] $Token 
    Session() {
    }
    [Token] GetToken() {
        return $this.Token
        if ($this.Credentials) {
            if (!$this.Token -or ($this.Token.ExpireDateTime).AddMinutes(-1) -gt (get-date))  {
                $this.RefreshToken()
            }   
        }
        if($this.Token.Valid) {
            return $this.Token
        } else {
            throw ([System.InvalidOperationException]::new($this.Token))
        }
    }
    RefreshToken() {
        if($this.Credentials){
            switch ($this.AuthenticationType) {
                ([AuthenticationType]::ApplicationIdWithSecret) { 
                    $this.Token = Get-MSGToken `
                        -TenantId $this.Credentials.TenantId `
                        -ApplicationId $this.Credentials.ApplicationId `
                        -Secret $this.Credentials.Secret
                 }
                ([AuthenticationType]::ApplicationIdWithCertificate) {  
                    throw ([System.NotImplementedException]::new("Not supported yet"))
                }
                Default {
                    $this.AuthenticationType
                    throw ([System.NotImplementedException]::new("Unknown authentication type"))
                }
            }
        } else {
            throw ([System.InvalidOperationException]::new("Credential information missing"))
        }
    }
}