Public/SecretStores/New-GcpSecretStore.ps1

<#
.SYNOPSIS
Creates a new GCP Secret Manager secret store.

.DESCRIPTION
Creates a new secret store for Google Cloud Secret Manager with specified configuration.

.PARAMETER Name
The display name for the secret store.

.PARAMETER Description
Optional description for the secret store.

.PARAMETER ProjectName
The GCP project name.

.PARAMETER ProjectNumber
The GCP project number.

.PARAMETER WorkloadIdentityPoolId
The GCP workload identity pool ID.

.PARAMETER PoolProviderId
The GCP pool provider ID.

.PARAMETER ServiceAccountEmail
The service account email.

.PARAMETER State
The initial state of the secret store (ENABLED or DISABLED).

.EXAMPLE
New-GcpSecretStore -Name "Dev-GCP-Secrets" -ProjectName "my-project" -ProjectNumber "123456789" -WorkloadIdentityPoolId "my-pool" -PoolProviderId "my-provider" -ServiceAccountEmail "service@project.iam.gserviceaccount.com"

.NOTES
Requires appropriate GCP permissions and service account setup.
#>

function New-GcpSecretStore {
    [CmdletBinding(SupportsShouldProcess)]
    param(
        [Parameter(Mandatory = $true)]
        [string]$Name,

        [Parameter()]
        [string]$Description,

        [Parameter(Mandatory = $true)]
        [string]$ProjectName,

        [Parameter(Mandatory = $true)]
        [string]$ProjectNumber,

        [Parameter(Mandatory = $true)]
        [string]$WorkloadIdentityPoolId,

        [Parameter(Mandatory = $true)]
        [string]$PoolProviderId,

        [Parameter(Mandatory = $true)]
        [string]$ServiceAccountEmail,

        [Parameter()]
        [ValidateSet('ENABLED', 'DISABLED')]
        [string]$State = 'ENABLED'
    )

    begin {
        Test-SecretsHubConnection
    }

    process {
        try {
            if ($PSCmdlet.ShouldProcess($Name, "Create GCP Secret Store")) {
                $Body = @{
                    type = "GCP_GSM"
                    name = $Name
                    state = $State
                    data = @{
                        gcpProjectName = $ProjectName
                        gcpProjectNumber = $ProjectNumber
                        gcpWorkloadIdentityPoolId = $WorkloadIdentityPoolId
                        gcpPoolProviderId = $PoolProviderId
                        serviceAccountEmail = $ServiceAccountEmail
                        connectionConfig = @{
                            connectionType = "PUBLIC"
                        }
                    }
                }

                if ($Description) {
                    $Body.description = $Description
                }

                $Result = Invoke-SecretsHubApi -Uri "api/secret-stores" -Method POST -Body $Body
                Write-Information "Successfully created GCP secret store: $Name" -InformationAction Continue
                return $Result
            }
        }
        catch {
            Write-SecretsHubError -ErrorRecord $_ -Operation "New-GcpSecretStore"
            throw
        }
    }
}