private/projectDatabase/project_database.ps1



function Test-ProjectDatabase{
    [CmdletBinding()]
    param(
        [Parameter(Position = 0)][string]$Owner,
        [Parameter(Position = 1)][int]$ProjectNumber
    )

    $key = Get-DatabaseKey -Owner $Owner -ProjectNumber $ProjectNumber
    $prj = Get-Database -Key $key

    $ret = $null -ne $prj

    return $ret
}

function Test-ProjectDatabaseStaged{
    [CmdletBinding()]
    param(
        [Parameter(Position = 0)][string]$Owner,
        [Parameter(Position = 1)][int]$ProjectNumber
    )

    $key = Get-DatabaseKey -Owner $Owner -ProjectNumber $ProjectNumber
    $prj = Get-Database -Key $key

    if($null -eq $prj){
        return $false
    }

    if($null -eq $prj.Staged){
        return $false
    }

    if($prj.Staged.Count -eq 0){
        return $false
    }

    return $true
}

function Get-ProjectFromDatabase{
    [CmdletBinding()]
    param(
        [Parameter(Position = 0)][string]$Owner,
        [Parameter(Position = 1)][int]$ProjectNumber
    )

    $key = Get-DatabaseKey -Owner $Owner -ProjectNumber $ProjectNumber
    $prj = Get-Database -Key $key

    $prj.fields = $prj.fields | Copy-MyHashTable
    $prj.items  = $prj.items  | Copy-MyHashTable
    $prj.Staged = $prj.Staged | Copy-MyHashTable

    return $prj
}

function Reset-ProjectDatabase{
    [CmdletBinding()]
    param(
        [Parameter(Position = 0)][string]$Owner,
        [Parameter(Position = 1)][int]$ProjectNumber
    )

    $dbKey = Get-DatabaseKey -Owner $Owner -ProjectNumber $ProjectNumber
    Reset-Database -Key $dbKey
}

function Save-ProjectV2toDatabase{
    [CmdletBinding()]
    param(
        [Parameter(Position = 0)][object]$ProjectV2,
        [Parameter(Position = 1)][Object[]]$Items,
        [Parameter(Position = 2)][Object[]]$Fields
    )

    $owner = $ProjectV2.owner.login
    $projectnumber = $ProjectV2.number

    $db = New-Object System.Collections.Hashtable

    $db.url              = $ProjectV2.url
    $db.shortDescription = $ProjectV2.shortDescription
    $db.public           = $ProjectV2.public
    $db.closed           = $ProjectV2.closed
    $db.title            = $ProjectV2.title
    $db.ProjectId        = $ProjectV2.id
    $db.readme           = $ProjectV2.readme

    $db.owner            = $owner
    $db.number           = $projectnumber

    $db.items = $items
    $db.fields = $fields

    # This is the only Save.ProjectDatabase that should not be called with -Safe
    Save-ProjectDatabase -Database $db
}

function Save-ProjectDatabaseSafe{
    [CmdletBinding()]
    param(
        [Parameter(Mandatory,Position = 0)][hashtable]$Database
    )
    Save-ProjectDatabase -Database $Database -Safe
}

function Save-ProjectDatabase{
    [CmdletBinding()]
    param(
        [Parameter(Mandatory,Position = 0)][hashtable]$Database,
        [Parameter()][switch]$Safe
    )

    $owner = $Database.owner
    $projectnumber = $Database.number

    if([string]::IsNullOrWhiteSpace($owner)){
        throw "Database.owner is null or empty"
    }
    if($projectnumber -le 0){
        throw "Database.number is null or not a positive integer"
    }
    
    $dbkey = Get-DatabaseKey -Owner $owner -ProjectNumber $projectnumber

    if($Safe){
        $oldDatabase = Get-Database -Key $dbkey

        if ($oldDatabase.safeId -ne $Database.safeId){
            throw "The database has changed since it was read. Aborting save to prevent overwriting changes."
        }

    }

    # Add safe mark
    $Database.safeId = [guid]::NewGuid().ToString()

    Save-Database -Key $dbkey -Database $Database
}

function Get-DatabaseKey{
    [CmdletBinding()]
    param(
        [Parameter(Position = 0)][string]$Owner,
        [Parameter(Position = 1)][int]$ProjectNumber
    )

    $ret = "$($owner)_$($projectnumber)"

    return $ret
}