Public/New-DuneCollection.ps1

<#
.SYNOPSIS
Create a new Dune collection.

.DESCRIPTION
Creates a new collection in Dune. Supports `ShouldProcess` semantics. Provide `Name` and optional display name, description, variables and tags.

.PARAMETER Name
The unique name for the collection. Mandatory.

.PARAMETER DisplayName
A human-friendly display name for the collection.

.PARAMETER Description
A description for the collection.

.PARAMETER Variables
An array of hashtables defining collection variables.

.PARAMETER Tags
An array of hashtables used as tags for the collection.

.EXAMPLE
PS> New-DuneCollection -Name "web-tier" -DisplayName "Web Tier" -Description "Front-end servers"
Creates a collection named `web-tier`.

.EXAMPLE
PS> @{Name='env';Value='prod'} | New-DuneCollection -Name "web-tier" -Variables @(@{Name='env';Value='prod'})
Creates a collection while setting variables.
#>

function New-DuneCollection {
    [CmdletBinding(
        SupportsShouldProcess,
        ConfirmImpact = 'None'
    )]
    param (
        [Parameter(Mandatory)]
        [string]$Name,

        [Parameter()]
        [string]$DisplayName,

        [Parameter()]
        [string]$Description,

        [Parameter()]
        [hashtable[]]$Variables,

        [Parameter()]
        [hashtable[]]$Tags
    )

    begin {}

    process {
        Write-Debug "$($MyInvocation.MyCommand)|process"
        $Body = @{
            DisplayName = $DisplayName
            Name        = $Name
            Description = $Description
            Tags        = $Tags
        }
        if ($PSBoundParameters.ContainsKey('Variables')) {
            $Variables | ForEach-Object {
                $_.Value = ConvertTo-Json -InputObject $Variables
            }
            $Body.Variables = $Variables
        }
        if ($PSCmdlet.ShouldProcess($($Body | ConvertTo-Json -Depth 16 -Compress))) {
            $Return = Invoke-DuneApiRequest -Uri "Collections" -Method POST -Body $Body
            $ReturnObject = if ($Return.Content) { $Return.Content | ConvertFrom-Json | ConvertTo-DuneClassObject -Class DuneCollection }
            return $ReturnObject
        }
    }

    end {}
}