lib/documents.ps1
function Set-CosmosDbDocumentType { [CmdletBinding()] param ( [Parameter(Mandatory = $true)] $Document ) foreach ($item in $Document) { $item.PSObject.TypeNames.Insert(0, 'CosmosDB.Document') } return $Document } function Get-CosmosDbDocumentResourcePath { [CmdletBinding()] [OutputType([System.String])] param ( [Parameter(Mandatory = $true)] [ValidateNotNullOrEmpty()] [System.String] $Database, [Parameter(Mandatory = $true)] [ValidateNotNullOrEmpty()] [System.String] $CollectionId, [Parameter(Mandatory = $true)] [ValidateNotNullOrEmpty()] [System.String] $Id ) return ('dbs/{0}/colls/{1}/docs/{2}' -f $Database, $CollectionId, $Id) } function Get-CosmosDbDocument { [CmdletBinding(DefaultParameterSetName = 'Context')] [OutputType([Object])] param ( [Alias("Connection")] [Parameter(Mandatory = $true, ParameterSetName = 'Context')] [ValidateNotNullOrEmpty()] [CosmosDb.Context] $Context, [Parameter(Mandatory = $true, ParameterSetName = 'Account')] [ValidateNotNullOrEmpty()] [System.String] $Account, [Parameter()] [ValidateNotNullOrEmpty()] [System.Security.SecureString] $Key, [Parameter()] [ValidateSet('master', 'resource')] [System.String] $KeyType = 'master', [Parameter()] [ValidateNotNullOrEmpty()] [System.String] $Database, [Parameter(Mandatory = $true)] [ValidateNotNullOrEmpty()] [System.String] $CollectionId, [Parameter()] [ValidateNotNullOrEmpty()] [System.String] $Id, [Parameter()] [ValidateNotNullOrEmpty()] [System.String[]] $PartitionKey, [Parameter()] [ValidateNotNullOrEmpty()] [System.Int32] $MaxItemCount = -1, [Parameter()] [ValidateNotNullOrEmpty()] [System.String] $ContinuationToken, [Parameter()] [ValidateSet('Strong', 'Bounded', 'Session', 'Eventual')] [System.String] $ConsistencyLevel, [Parameter()] [ValidateNotNullOrEmpty()] [System.String] $SessionToken, [Parameter()] [ValidateNotNullOrEmpty()] [System.String] $PartitionKeyRangeId, [Parameter()] [ValidateNotNullOrEmpty()] [System.String] $Query, [Parameter()] [ValidateNotNullOrEmpty()] [Hashtable[]] $QueryParameters, [Parameter()] [ValidateNotNullOrEmpty()] [System.Boolean] $QueryEnableCrossPartition = $False, [Parameter()] [ref] $ResultHeaders ) $null = $PSBoundParameters.Remove('Id') $null = $PSBoundParameters.Remove('CollectionId') $null = $PSBoundParameters.Remove('MaxItemCount') $null = $PSBoundParameters.Remove('ContinuationToken') $null = $PSBoundParameters.Remove('ConsistencyLevel') $null = $PSBoundParameters.Remove('SessionToken') $null = $PSBoundParameters.Remove('PartitionKeyRangeId') $null = $PSBoundParameters.Remove('Query') $null = $PSBoundParameters.Remove('QueryParameters') $null = $PSBoundParameters.Remove('QueryEnableCrossPartition') if ($PSBoundParameters.ContainsKey('ResultHeaders')) { $resultHeadersPassed = $true $null = $PSBoundParameters.Remove('ResultHeaders') } $resourcePath = ('colls/{0}/docs' -f $CollectionId) $method = 'Get' $headers = @{} if (-not [String]::IsNullOrEmpty($Id)) { # A document Id has been specified if ($PSBoundParameters.ContainsKey('PartitionKey')) { $headers += @{ 'x-ms-documentdb-partitionkey' = '["' + ($PartitionKey -join '","') + '"]' } $null = $PSBoundParameters.Remove('PartitionKey') } $result = Invoke-CosmosDbRequest @PSBoundParameters ` -Method $method ` -Headers $headers ` -ResourceType 'docs' ` -ResourcePath ('{0}/{1}' -f $resourcePath, $Id) $document = ConvertFrom-JSON -InputObject $result.Content } else { $body = '' if (-not [String]::IsNullOrEmpty($Query)) { # A query has been specified $method = 'Post' $headers += @{ 'x-ms-documentdb-isquery' = $True } if ($QueryEnableCrossPartition -eq $True) { $headers += @{ 'x-ms-documentdb-query-enablecrosspartition' = $True } } # Set the content type to application/query+json for querying $null = $PSBoundParameters.Add('ContentType', 'application/query+json') # Create the body JSON for the query $bodyObject = @{ query = $Query } if (-not [String]::IsNullOrEmpty($QueryParameters)) { $bodyObject += @{ parameters = $QueryParameters } } $body = ConvertTo-Json -InputObject $bodyObject } else { if (-not [String]::IsNullOrEmpty($PartitionKeyRangeId)) { $headers += @{ 'x-ms-documentdb-partitionkeyrangeid' = $PartitionKeyRangeId } } } # The following headers apply when querying documents or just getting a list if ($PSBoundParameters.ContainsKey('PartitionKey')) { $headers += @{ 'x-ms-documentdb-partitionkey' = '["' + ($PartitionKey -join '","') + '"]' } $null = $PSBoundParameters.Remove('PartitionKey') } $headers += @{ 'x-ms-max-item-count' = $MaxItemCount } if (-not [String]::IsNullOrEmpty($ContinuationToken)) { $headers += @{ 'x-ms-continuation' = $ContinuationToken } } if (-not [String]::IsNullOrEmpty($ConsistencyLevel)) { $headers += @{ 'x-ms-consistency-level' = $ConsistencyLevel } } if (-not [String]::IsNullOrEmpty($SessionToken)) { $headers += @{ 'x-ms-session-token' = $SessionToken } } # Because the headers of this request will contain important information # then we need to use a plain web request. $result = Invoke-CosmosDbRequest @PSBoundParameters ` -Method $method ` -ResourceType 'docs' ` -ResourcePath $resourcePath ` -Headers $headers ` -Body $body $body = ConvertFrom-JSON -InputObject $result.Content $document = $body.Documents if ($resultHeadersPassed) { # Return the result headers $ResultHeaders.value = $result.Headers } } if ($document) { return (Set-CosmosDbDocumentType -Document $document) } } function New-CosmosDbDocument { [CmdletBinding(DefaultParameterSetName = 'Context')] [OutputType([Object])] param ( [Alias("Connection")] [Parameter(Mandatory = $true, ParameterSetName = 'Context')] [ValidateNotNullOrEmpty()] [CosmosDb.Context] $Context, [Parameter(Mandatory = $true, ParameterSetName = 'Account')] [ValidateNotNullOrEmpty()] [System.String] $Account, [Parameter()] [ValidateSet('master', 'resource')] [System.String] $KeyType = 'master', [Parameter()] [ValidateNotNullOrEmpty()] [System.Security.SecureString] $Key, [Parameter()] [ValidateNotNullOrEmpty()] [System.String] $Database, [Parameter(Mandatory = $true)] [ValidateNotNullOrEmpty()] [System.String] $CollectionId, [Parameter(Mandatory = $true)] [ValidateNotNullOrEmpty()] [System.String] $DocumentBody, [Parameter()] [ValidateSet('Include', 'Exclude')] [System.String] $IndexingDirective, [Parameter()] [System.Boolean] $Upsert, [Parameter()] [ValidateNotNullOrEmpty()] [System.String[]] $PartitionKey ) $null = $PSBoundParameters.Remove('CollectionId') $null = $PSBoundParameters.Remove('Id') $null = $PSBoundParameters.Remove('DocumentBody') $resourcePath = ('colls/{0}/docs' -f $CollectionId) $headers = @{} if ($PSBoundParameters.ContainsKey('Upsert')) { $headers += @{ 'x-ms-documentdb-is-upsert' = $Upsert } $null = $PSBoundParameters.Remove('Upsert') } if ($PSBoundParameters.ContainsKey('IndexingDirective')) { $headers += @{ 'x-ms-indexing-directive' = $IndexingDirective } $null = $PSBoundParameters.Remove('IndexingDirective') } if ($PSBoundParameters.ContainsKey('PartitionKey')) { $headers += @{ 'x-ms-documentdb-partitionkey' = '["' + ($PartitionKey -join '","') + '"]' } $null = $PSBoundParameters.Remove('PartitionKey') } $result = Invoke-CosmosDbRequest @PSBoundParameters ` -Method 'Post' ` -ResourceType 'docs' ` -ResourcePath $resourcePath ` -Body $DocumentBody ` -Headers $headers $document = ConvertFrom-Json -InputObject $result.Content if ($document) { return (Set-CosmosDbDocumentType -Document $document) } } function Remove-CosmosDbDocument { [CmdletBinding(DefaultParameterSetName = 'Context')] param ( [Alias("Connection")] [Parameter(Mandatory = $true, ParameterSetName = 'Context')] [ValidateNotNullOrEmpty()] [CosmosDb.Context] $Context, [Parameter(Mandatory = $true, ParameterSetName = 'Account')] [ValidateNotNullOrEmpty()] [System.String] $Account, [Parameter()] [ValidateNotNullOrEmpty()] [System.String] $Database, [Parameter()] [ValidateNotNullOrEmpty()] [System.Security.SecureString] $Key, [Parameter()] [ValidateSet('master', 'resource')] [System.String] $KeyType = 'master', [Parameter(Mandatory = $true)] [ValidateNotNullOrEmpty()] [System.String] $CollectionId, [Parameter()] [ValidateNotNullOrEmpty()] [System.String] $Id, [Parameter()] [ValidateNotNullOrEmpty()] [System.String] $PartitionKey ) $null = $PSBoundParameters.Remove('CollectionId') $null = $PSBoundParameters.Remove('Id') $resourcePath = ('colls/{0}/docs/{1}' -f $CollectionId, $Id) $headers = @{} if ($PSBoundParameters.ContainsKey('PartitionKey')) { $headers += @{ 'x-ms-documentdb-partitionkey' = '["' + ($PartitionKey -join '","') + '"]' } $null = $PSBoundParameters.Remove('PartitionKey') } $null = Invoke-CosmosDbRequest @PSBoundParameters ` -Method 'Delete' ` -ResourceType 'docs' ` -ResourcePath $resourcePath ` -Headers $headers } function Set-CosmosDbDocument { [CmdletBinding(DefaultParameterSetName = 'Context')] [OutputType([Object])] param ( [Alias("Connection")] [Parameter(Mandatory = $true, ParameterSetName = 'Context')] [ValidateNotNullOrEmpty()] [CosmosDb.Context] $Context, [Parameter(Mandatory = $true, ParameterSetName = 'Account')] [ValidateNotNullOrEmpty()] [System.String] $Account, [Parameter()] [ValidateNotNullOrEmpty()] [System.String] $Database, [Parameter()] [ValidateNotNullOrEmpty()] [System.Security.SecureString] $Key, [Parameter(ParameterSetName = 'Account')] [ValidateSet('master', 'resource')] [System.String] $KeyType = 'master', [Parameter(Mandatory = $true)] [ValidateNotNullOrEmpty()] [System.String] $CollectionId, [Parameter(Mandatory = $true)] [ValidateNotNullOrEmpty()] [System.String] $Id, [Parameter(Mandatory = $true)] [ValidateNotNullOrEmpty()] [System.String] $DocumentBody, [Parameter()] [ValidateSet('Include', 'Exclude')] [System.String] $IndexingDirective, [Parameter()] [ValidateNotNullOrEmpty()] [System.String] $PartitionKey ) $null = $PSBoundParameters.Remove('CollectionId') $null = $PSBoundParameters.Remove('Id') $null = $PSBoundParameters.Remove('DocumentBody') $resourcePath = ('colls/{0}/docs/{1}' -f $CollectionId, $Id) $headers = @{} if ($PSBoundParameters.ContainsKey('IndexingDirective')) { $headers += @{ 'x-ms-indexing-directive' = $IndexingDirective } $null = $PSBoundParameters.Remove('IndexingDirective') } if ($PSBoundParameters.ContainsKey('PartitionKey')) { $headers += @{ 'x-ms-documentdb-partitionkey' = '["' + ($PartitionKey -join '","') + '"]' } $null = $PSBoundParameters.Remove('PartitionKey') } $result = Invoke-CosmosDbRequest @PSBoundParameters ` -Method 'Put' ` -ResourceType 'docs' ` -ResourcePath $resourcePath ` -Body $DocumentBody ` -Headers $headers $document = ConvertFrom-Json -InputObject $result.Content if ($document) { return (Set-CosmosDbDocumentType -Document $document) } } |