RiverMeadow.Login/RiverMeadow.Login.psm1

Import-Module -Name $PSScriptRoot\..\Common\Error\Error
function Invoke-RMLogin {
    param (
        [string] $EmailAddress = (Read-Host "Enter email address"),
        [string] $Password,
        [string] $MFAVerifcationCode,
        [string] $RMHost
    )

    if (-not $PSBoundParameters.ContainsKey('Password')) {
        $SecurePassword = Read-Host "Enter password" -AsSecureString
        $BSTR = [System.Runtime.InteropServices.Marshal]::SecureStringToBSTR($SecurePassword)
        $Password = [System.Runtime.InteropServices.Marshal]::PtrToStringAuto($BSTR)
    }

    $Uri = "https://migrate.rivermeadow.com/api/v3"
    if ($PSBoundParameters.ContainsKey('RMHost')) {
        $Uri = "http://" + $RMHost + "/api/v3"
    }

    $Body = @{
        email = $EmailAddress
        password = $Password
    }

    if ($MFAVerifcationCode) {
        $Body['mfa_token'] = $MFAVerifcationCode
    }

    $JsonBody = $Body | ConvertTo-Json
    $Headers = @{
        Accept = "application/rm+json"
    }

    $Params = @{
        Method = "Post"
        Uri = $Uri + "/login"
        Body = $JsonBody
        ContentType = "application/json"
        Headers = $Headers
    }

    if (Get-Variable -Name "RMContext-UserLogin" -ErrorAction SilentlyContinue) {
        # Delete the previous Login result before attempting a new one
        Remove-RMVariable
    }

    $UserLogin = $null
    try {
        $UserLogin = Invoke-RestMethod -SkipCertificateCheck @Params
    } catch [System.Exception] {
        $ErrorString = $PSItem.ToString()
        if ($ErrorString.Contains("error_code")) {
            $ErrorString = $ErrorString | ConvertFrom-Json
            if ($ErrorString.error_code -eq "mfa_token_required") {
                $VerificationCode = Read-Host "We sent you the Verification Code. Please enter it here"
                if ($RMHost) {
                    Invoke-RMLogin -EmailAddress $EmailAddress -Password $Password -MFAVerifcationCode $VerificationCode -RMHost $RMHost
                } else {
                    Invoke-RMLogin -EmailAddress $EmailAddress -Password $Password -MFAVerifcationCode $VerificationCode
                }
            } else {
                Show-RMError -ErrorObj $PSItem
            }
        } else {
            Show-RMError -ErrorObj $PSItem
        }
        return
    }

    Set-Variable -Name "RMContext-UserLogin" -Value $UserLogin -Scope Global
    Set-Variable -Name "RMContext-ReactorURI" -Value $Uri -Scope Global
    Get-RMUser -UserId $UserLogin.user_id -Uri $Uri

    $CurrentOrg = (Get-Variable -Name "RMContext-CurrentOrganizationName").Value
    $CurrentProjectName = (Get-Variable -Name "RMContext-CurrentProjectName").Value

    Write-Output "Current Organization Name: $CurrentOrg"
    Write-Output "Current Project Name: $CurrentProjectName"
}

function Get-RMUser {
    param(
        [Parameter(Mandatory)]
        [string]$UserId,
        [Parameter(Mandatory)]
        [string]$Uri
    )

    $LoginResult = Get-Variable -Name "RMContext-UserLogin"

    $Headers = @{
        "Accept" = "application/rm+json"
        "X-Auth-Token" = $LoginResult.Value.token
    }

    $Params = @{
        Method = "Get"
        Uri = $Uri + "/users/" + $UserId
        Headers = $Headers
    }

    try {
        $UserInfo = Invoke-RestMethod -SkipCertificateCheck @Params
    } catch [System.Net.WebException] {
        Show-RMError -ErrorObj $PSItem
        throw $PSItem
    }

    Set-Variable -Name "RMContext-UserOrganizations" -Value $UserInfo.organizations -Scope Global
    $CurrentOrgName  = Get-RMParentOrganizationNameById -OrganizationId $UserInfo.organization
    $CurrentProjectName = Get-RMOrganizationNameById -OrganizationId $UserInfo.organization
    Set-Variable -Name "RMContext-CurrentOrganizationName" -Value $CurrentOrgName -Scope Global
    Set-Variable -Name "RMContext-CurrentProjectName" -Value $CurrentProjectName -Scope Global
    Set-Variable -Name "RMContext-CurrentProjectId" -Value $UserInfo.organization -Scope Global
}


function Get-RMOrganizationNameById {
    param(
        [string] $OrganizationId
    )

    $UserOrgs = Get-Variable -Name "RMContext-UserOrganizations"

    foreach($Org in $UserOrgs.Value) {
        if ($Org.id -eq $OrganizationId) {
            return $Org.name
        }
    }

    throw "No organization or project exists by the given $OrganizationId"
}

function Get-RMParentOrganizationIdById {
    param(
        [string] $OrganizationId
    )

    $UserOrgs = Get-Variable -Name "RMContext-UserOrganizations"

    foreach($Org in $UserOrgs.Value) {
        if ($Org.id -eq $OrganizationId) {
            return $Org.parent_organization_id
        }
    }

    throw "No organization or project exists by the given $OrganizationId"

}

function Get-RMParentOrganizationNameById {
    param(
        [string] $OrganizationId
    )

    $ParentOrgId = Get-RMParentOrganizationIdById -OrganizationId $OrganizationId

    $UserOrgs = Get-Variable -Name "RMContext-UserOrganizations"

    foreach($Org in $UserOrgs.Value) {
        if ($Org.id -eq $ParentOrgId) {
            return $Org.name
        }
    }

    throw "No organization or project exists by the given $OrganizationId"

}

function Remove-RMVariable {
    param()
    Remove-Variable -Name "RMContext-UserLogin" -Scope Global -ErrorAction SilentlyContinue
    Remove-Variable -Name "RMContext-UserOrganizations" -Scope Global -ErrorAction SilentlyContinue
    Remove-Variable -Name "RMContext-CurrentOrganizationName" -Scope Global -ErrorAction SilentlyContinue
    Remove-Variable -Name "RMContext-CurrentProjectName" -Scope Global -ErrorAction SilentlyContinue
    Remove-Variable -Name "RMContext-CurrentProjectId" -Scope Global -ErrorAction SilentlyContinue
}

Export-ModuleMember -Function Invoke-RMLogin -Alias irmlogin