Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add Functions for Handling Route WebEvent Data and Serialization in Pode #1386

Open
wants to merge 28 commits into
base: develop
Choose a base branch
from

Conversation

mdaneri
Copy link
Contributor

@mdaneri mdaneri commented Sep 8, 2024

Recovered from #1353

Summary

This pull request adds several new functions to the Pode project for handling web event data and for serializing/deserializing hashtables. The new functions are:

  • Get-PodeBodyData
  • Get-PodeQueryParameter
  • Get-PodePathParameter
  • ConvertTo-PodeSerializedString
  • ConvertFrom-PodeSerializedString

New Functions

Get-PodeBodyData

Retrieves the body data from the current Pode web event. This function is useful for accessing the main content sent in a web request, including PUT, POST, or any other methods that support a body.

Example:

Get-PodeBodyData

# This command returns the body data of the current web route. Equivalent to `$WebEvent.Data`
Get-PodeBodyData -Deserialize -Style 'Matrix'
# Retrieves and deserializes the body data using the 'Matrix' style.
Get-PodeBodyData -Deserialize -NoExplode
# Deserializes the body data without exploding arrays.

Get-PodeQueryParameter

Retrieves a specific query parameter value from the current Pode web event. This function is useful for accessing query parameters passed in the URL of a web request.

Example:

Get-PodeQueryParameter -Name 'userId'

# This command returns the value of the 'userId' query parameter from the current web route. Equivalent to `$WebEvent.Query['userId']`
Get-PodeQueryParameter -Name 'filter' -Deserialize -Style 'SpaceDelimited'
# Retrieves and deserializes the value of the 'filter' query parameter, using the 'SpaceDelimited' style.
Get-PodeQueryParameter -Name 'data' -Deserialize -NoExplode
# Deserializes the 'data' query parameter value without exploding arrays.

Get-PodePathParameter

Retrieves a specific parameter value from the current Pode web event. This function is useful for accessing parameters passed in the body or URL of a web request.

Example:

Get-PodePathParameter -Name 'action'

# This command returns the value of the 'action' parameter from the current web route. Equivalent to `$WebEvent.Parameters['action']`

ConvertTo-PodeSerializedString

Converts a hashtable to a serialized string using a specified serialization style. It supports various serialization styles such as 'Simple', 'Label', 'Matrix', 'Query', 'Form', 'SpaceDelimited', 'PipeDelimited', and 'DeepObject'. An optional 'Explode' switch can be used to modify the serialization format for certain styles.

This function is useful for example for callback scenarios.

Examples:

$hashtable = @{
    name = 'value'
    anotherName = 'anotherValue'
}
$serialized = ConvertTo-PodeSerializedString -Hashtable $hashtable -Style 'Query'
Write-Output $serialized

# This command serializes the hashtable using the 'Query' style.
$hashtable = @{
    name = 'value'
    anotherName = 'anotherValue'
}
$serializedExplode = ConvertTo-PodeSerializedString -Hashtable $hashtable -Style 'DeepObject' -Explode
Write-Output $serializedExplode

# This command serializes the hashtable using the 'DeepObject' style with the 'Explode' switch.

ConvertFrom-PodeSerializedString

Converts a serialized string back into a hashtable, automatically detecting the serialization style based on common delimiters and formats.

This function is useful when receiving complex data as a parameter without using JSON, YAML, or XML encoding.

Examples:

    # Simple style, explode = true
    $serialized = "name=value,anotherName=anotherValue"
    $hashtable = ConvertFrom-PodeSerializedString -SerializedString $serialized -Style 'Simple' -Explode
    Write-Output $hashtable
    # Simple style, explode = false
    $serialized = "name,value,anotherName,anotherValue"
    $hashtable = ConvertFrom-PodeSerializedString -SerializedString $serialized -Style 'Simple'
    Write-Output $hashtable
    # Label style, explode = true
    $serialized = ".name.value.anotherName.anotherValue"
    $hashtable = ConvertFrom-PodeSerializedString -SerializedString $serialized -Style 'Label' -Explode
    Write-Output $hashtable
    # Label style, explode = false
    $serialized = ".name,value,anotherName,anotherValue"
    $hashtable = ConvertFrom-PodeSerializedString -SerializedString $serialized -Style 'Label'
    Write-Output $hashtable
    # Matrix style, explode = true
    $serialized = ";name=value;anotherName=anotherValue"
    $hashtable = ConvertFrom-PodeSerializedString -SerializedString $serialized -Style 'Matrix' -Explode
    Write-Output $hashtable
    # Matrix style, explode = false
    $serialized = ";id=3;id=4;id=5"
    $hashtable = ConvertFrom-PodeSerializedString -SerializedString $serialized -Style 'Matrix'
    Write-Output $hashtable
    # Query style, explode = true
    $serialized = "name=value&anotherName=anotherValue"
    $hashtable = ConvertFrom-PodeSerializedString -SerializedString $serialized -Style 'Query' -Explode
    Write-Output $hashtable
    # Query style, explode = false
    $serialized = "name=value,anotherName=anotherValue"
    $hashtable = ConvertFrom-PodeSerializedString -SerializedString $serialized -Style 'Query'
    Write-Output $hashtable
    # Form style, explode = true
    $serialized = "name=value&anotherName=anotherValue"
    $hashtable = ConvertFrom-PodeSerializedString -SerializedString $serialized -Style 'Form' -Explode
    Write-Output $hashtable
    # Form style, explode = false
    $serialized = "name=value,anotherName=anotherValue"
    $hashtable = ConvertFrom-PodeSerializedString -SerializedString $serialized -Style 'Form'
    Write-Output $hashtable
    # SpaceDelimited style, explode = true
    $serialized = "id=3&id=4&id=5"
    $hashtable = ConvertFrom-PodeSerializedString -SerializedString $serialized -Style 'SpaceDelimited' -Explode
    Write-Output $hashtable
    # SpaceDelimited style, explode = false
    $serialized = "id=3%204%205"
    $hashtable = ConvertFrom-PodeSerializedString -SerializedString $serialized -Style 'SpaceDelimited'
    Write-Output $hashtable
    # PipeDelimited style, explode = true
    $serialized = "id=3&id=4&id=5"
    $hashtable = ConvertFrom-PodeSerializedString -SerializedString $serialized -Style 'PipeDelimited' -Explode
    Write-Output $hashtable
    # PipeDelimited style, explode = false
    $serialized = "id=3|4|5"
    $hashtable = ConvertFrom-PodeSerializedString -SerializedString $serialized -Style 'PipeDelimited'
    Write-Output $hashtable
    # DeepObject style, explode = true
    $serialized = "myId[role]=admin&myId[firstName]=Alex"
    $hashtable = ConvertFrom-PodeSerializedString -SerializedString $serialized -Style 'DeepObject' -Explode -KeyName 'myId'
    Write-Output $hashtable

@Badgerati Badgerati added this to the 2.12.0 milestone Sep 29, 2024
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants