Schaeffler_codebeamer_help._functions.ps1

function ConvertTo-CbField {
    [CmdletBinding(DefaultParameterSetName = "Field")]
    param (
        [Parameter(ParameterSetName = "Field")]
        [string[]]$Field,

        [Parameter(ParameterSetName = "FieldWithValue")]
        [hashtable]$FieldWithValue,

        [Parameter(Mandatory, ParameterSetName = "Field")]
        [Parameter(Mandatory, ParameterSetName = "FieldWithValue")]
        [int]$TrackerID,

        [Parameter(ParameterSetName = "Field")]
        [Parameter(ParameterSetName = "FieldWithValue")]
        [switch]$DefaultValues,

        [Parameter(Mandatory, ParameterSetName = "Field")]
        [Parameter(Mandatory, ParameterSetName = "FieldWithValue")]
        [Alias("cbs")]
        [PSCustomObject]$CBSession
    )

    try {
        $uriConfiguration = "https://{0}/cb/api/v3/tracker/{1}/configuration" -f $CBSession.server, $TrackerID

            Write-Debug "uri: $uriConfiguration "

        $result = Invoke-RestMethod -Uri $uriConfiguration  -Method Get -Headers $CBSession.headers -ErrorAction Stop

        $uriSchema = "https://{0}/cb/api/v3/trackers/{1}/schema" -f $CBSession.Server, $TrackerID

            Write-Debug "uri: $uriSchema"

        $fieldsSchema  = Invoke-RestMethod -Uri $uriSchema -Method Get -Headers $CBSession.headers -errorAction Stop

        $fieldLabels = switch ($PSCmdlet.ParameterSetName) {
            "Field" { $field }
            "FieldWithValue" { $FieldWithValue.Keys }
            default { "Well something went worng" }
        }

        $fieldsResult = foreach ($name in $fieldLabels) {

            $fieldNames = [ordered]@{}
            Write-Debug "Field Name: $name"

            $fieldProperties = $fieldsSchema | Where-Object { $_.name -eq $name }


            if (-not $fieldProperties) { throw "Field $name does not exist in tracker $trackerID" }

            Write-Debug "Tracker ID: $TrackerID"

            $uri = "https://{0}/cb/api/v3/trackers/{1}/fields/{2}" -f $CBSession.Server, $TrackerID, $fieldProperties.id

            Write-Debug "URI: $uri"

            $fieldOptions = Invoke-RestMethod -Uri $uri -Method Get -Headers $CBSession.headers -ErrorAction Stop


            if ($fieldOptions.valueModel -notlike "*ChoiceFieldValue*") {

                $fieldValue = if ($FieldWithValue) { $FieldWithValue[$fieldProperties.name] } else { "" }


                $fieldNames["fieldId"] = $fieldProperties.id
                $fieldNames["name"] = $fieldProperties.name
                $fieldNames["value"] = $fieldValue
                $fieldNames["sharedFieldName"] = ""
                $fieldNames["type"] = $fieldProperties.valueModel

                Write-Debug "model $($fieldOptions.valueModel)"
            }

            if ($fieldOptions.valueModel -like "*ChoiceFieldValue*") {

                $fieldValue = if ($FieldWithValue) { $FieldWithValue[$fieldProperties.name] } else { -1 }

                $type = if ($fieldOptions.memberTypes) { "UserReference" } else { $fieldProperties.referenceType }

                $fieldNames["fieldId"] = $fieldProperties.id
                $fieldNames["name"] = $fieldProperties.name
                $fieldNames["values"] = [array]@(
                    [pscustomobject]@{
                        id   = $fieldValue
                        type = $type
                    }
                )
                $fieldNames["sharedFieldName"] = ""
                $fieldNames["type"] = "ChoiceFieldValue"
            }


            if ($DefaultValues.IsPresent) {

                $date = Get-date -Format 'yyyy-MM-ddThh:mm:ss.fff'

                switch ($fieldNames.type) {
                    "TextFieldValue" {

                        Write-Debug $_

                        $fieldNames["value"] = "Default TextFieldValue Generated on: {0}" -f $date
                    }
                    "WikiTextFieldValue" {

                        Write-Debug $_

                        $fieldNames["value"] = "Default WikiTextFieldValue Generated on: {0}" -f $date
                    }
                    "ChoiceFieldValue" {

                        Write-Debug $_
                        Write-Debug "fieldOptions.memberTypes: $($fieldOptions.memberTypes)"
                        Write-Debug "fieldProperties.choiceOptionSetting.type: $($fieldProperties.choiceOptionSetting.type)"


                        if ($fieldOptions.memberTypes -or $fieldProperties.referenceType -eq "UserReference") {

                            $uri = "https://{0}/cb/api/v3/projects/{1}/members?page=1&pageSize=500" -f $CBSession.server, $result.basicInformation.projectID

                            Write-Debug "uri: $uri"

                            $project = Invoke-RestMethod -Uri $uri -Method Get -Headers $CBSession.headers -ErrorAction Stop
                            $member = $project.members | Where-Object { $_.type -eq "UserReference" } | Select-Object -First 1


                            Write-Debug "Member: $($member.id), Member Name:$($member.name)"
                            Write-Debug "fieldnames: $($fieldNames.Values[0])"

                            $fieldNames.Values[0].id = $member.id
                        }


                        if ($fieldOptions.options) {

                            $fieldNames.Values[0].id = $fieldOptions.options | Select-Object -ExpandProperty id -Last 1
                        }

                        if ($fieldProperties.choiceOptionSetting.type -eq "CHOICE_WORK_CONFIG_ITEMS") {

                            #tracker id from which we need to take Item to set default value
                            $relatedtrackerID = $fieldProperties.choiceOptionSetting.referenceFilters.domainid
                            $uri = "https://{0}/cb/api/v3/trackers/{1}/items?page=1&pageSize=1" -f $CBSession.server, ($relatedtrackerID | Select-Object -First 1)

                            Write-Debug "relatedtrackerID : $relatedtrackerID"

                            Write-Debug "uri: $uri"

                            $reletadID = (Invoke-RestMethod -Uri $uri -Method Get -Headers $CBSession.headers -ErrorAction Stop).itemRefs.id | Select-Object -First 1

                            Write-Debug "reletadID: $reletadID"

                            $fieldNames.Values[0].id = $reletadID
                        }
                    }
                    "DurationFieldValue" {
                        # range between 1 and 360000 so value should be less then one hour
                        $duration = get-random -Minimum 1 -Maximum 360000
                        $fieldNames["value"] = $duration
                    }
                    "DateFieldValue" {
                        $fieldNames["value"] = $date
                    }
                    "DecimalFieldValue" {
                        [decimal]$decimalValue = Get-Random -Minimum 0.1 -Maximum 1.1
                        $decimalValue = "{0:N3}" -f $decimalValue
                        $fieldNames["value"] = $decimalValue
                    }
                    "BoolFieldValue" {
                        $fieldNames["value"] = $true
                    }
                    "IntegerFieldValue" {
                        $fieldNames["value"] = 1
                    }
                    Default { Write-Warning "Unknown Type $($fieldNames.type)" }
                }
            }
            New-Object -TypeName psobject -Property $fieldNames
        }
        $fieldsResult
    }
    catch {
        $fullError = $_
        switch ($_.ErrorDetails.Message) {
            { $_ -like "*Tracker not found*" } {
                Write-Error "Tracker ID: $TrackerID most likely doesn't exist. Please recheck Tracker ID or Server."
            }
            Default { Write-Error $fullError }
        }
    }
}