Public/Get-TogglProject.ps1
function Get-TogglProject { <# .SYNOPSIS Gets Toggl Projects .DESCRIPTION This Cmdlet queries the Toggl API against projects. If no parameter is given, it returns all projects in the current Workspace. You can search projects by its name (with wildcards) or by its id. To filter for other properties (e.g. "billable", "at"), pipe the result to Where-Object. You can pipe any PSToggl object which belongs to a project to this Cmdlet, like: * Workspace: Queries the given Workspace id for Projects. * Client: Returns projects whose cid matches the id of the piped object * Entry: Returns the Timers project * User (This is a special case, a user contains its projects as array. If not, will query for it and return) .PARAMETER Name The name of the project to return. You will be able to use wildcards soon. .PARAMETER Workspace Defaults to your primary Workspace (configured for this module). If provided, this Cmdlet returns Projects for the given Workspace. .INPUTS PSToggl.Client PSToggl.Workspace PSToggl.Entry PStoggl.User .OUTPUTS PsToggl.Project .EXAMPLE Get-TogglProject -Name "*awesome*" Returns all Projects containing "awesome" in it's name. .EXAMPLE Get-TogglProject | Where-Object billable Uses Where-Object to filter the output to only return projects which are billable. .EXAMPLE Get-TogglClient -name "Customer" | Get-TogglProject Returns all projects for Customer "Customer". Uses Get-TogglProjects Pipe input. .EXAMPLE Get-TogglClient -name "Pete" | Get-TogglProject | Where-Object active -EQ $True Returns all active projects for Client "Pete" .NOTES Version: 1.1 Author: Clijsters Creation Date: 03.04.2017 Purpose/Change: Accept PSToggl.Workspace #> [CmdletBinding(DefaultParametersetName = "all")] [OutputType("PSToggl.Project")] param( [Parameter(ParameterSetName = "byName")] [string] $Name = $null, [Parameter(Mandatory = $false)] [int] $Workspace = $TogglConfiguration.User.Workspace, [Parameter(ParameterSetName = "byId")] [int] $Id, # InputObject [Parameter(ValueFromPipeline = $true, ParameterSetName = "byObject")] [psobject[]] $InputObject ) Begin { New-Item function::local:Write-Verbose -Value ( New-Module -ScriptBlock { param($verb, $fixedName, $verbose) } -ArgumentList @((Get-Command Write-Verbose), $PSCmdlet.MyInvocation.InvocationName, $PSCmdlet.MyInvocation.BoundParameters["Verbose"].IsPresent) ).NewBoundScriptBlock{ param($Message) if ($verbose) { & $verb -Message "=>$fixedName $Message" -Verbose } else { & $verb -Message "=>$fixedName $Message" } } | Write-Verbose Write-Debug "Parameterset: `"$($PsCmdlet.ParameterSetName)`"" $projects = Invoke-TogglMethod -UrlSuffix "workspaces/$($Workspace)/projects" } Process { switch ($PsCmdlet.ParameterSetName) { "byObject" { Write-Verbose "Processing InputObject of type `"$($InputObject[0].psobject.TypeNames[0])`"" switch ($InputObject[0].psobject.TypeNames[0]) { "PSToggl.Entry" { $projectLambda = { param($obj) if ($obj.wid -ne $Workspace) { $projects = Get-TogglProject -Workspace $obj.wid } $projects | Where-Object {$_.id -EQ $obj.pid} } } "PSToggl.Project" { $projectLambda = { param($obj) $obj } } "PSToggl.Client" { $projectLambda = { param($obj) $projects | Where-Object { $_.cid -EQ $obj.id} } } <# As there are no getters, this code is never reached and therefore untested "PSToggl.Workspace" { $projectLambda = { param($obj) $projects | Where-Object {$_.wid -EQ $obj.id} } } "PSToggl.User" { $projectLambda = { param($obj) Throw "Not implemented" } } #> Default { Throw "Not implemented" } } $tmpList = New-Object -TypeName System.Collections.ArrayList foreach ($item in $InputObject) { $projectLambda.Invoke($item) | Foreach-Object {$tmpList.Add($_) | Out-Null} } $projects = $tmpList } "byName" { $projects = $projects | Where-Object {$_.Name -Like $Name} } "byId" { $projects = $projects | Where-Object {$_.Id -EQ $Id} } "all" { $projects = $projects } } } End { return $projects | ConvertTo-TogglProject } } |