diff --git a/Test/private/mocks/invoke-getitem-PVTI_lADOAlIw4c4A0Lf4zgYNTc0.json b/Test/private/mocks/invoke-getitem-PVTI_lADOAlIw4c4A0Lf4zgYNTc0.json new file mode 100644 index 0000000..06d0aac --- /dev/null +++ b/Test/private/mocks/invoke-getitem-PVTI_lADOAlIw4c4A0Lf4zgYNTc0.json @@ -0,0 +1,128 @@ +{ + "data": { + "node": { + "id": "PVTI_lADOAlIw4c4A0Lf4zgYNTc0", + "type": "DRAFT_ISSUE", + "project": { + "id": "PVT_kwDOAlIw4c4A0Lf4", + "url": "https://github.com/orgs/octodemo/projects/625" + }, + "content": { + "__typename": "DraftIssue", + "id": "DI_lADOAlIw4c4A0Lf4zgJQEVU", + "body": "", + "title": "Target Item", + "updatedAt": "2025-03-12T10:36:49Z", + "createdAt": "2025-03-12T10:36:25Z" + }, + "fieldValues": { + "nodes": [ + { + "__typename": "ProjectV2ItemFieldTextValue", + "text": "Target Item", + "field": { + "__typename": "ProjectV2Field", + "id": "PVTF_lADOAlIw4c4A0Lf4zgp2lTg", + "name": "Title", + "dataType": "TITLE" + } + }, + { + "__typename": "ProjectV2ItemFieldTextValue", + "text": "Value 1", + "field": { + "__typename": "ProjectV2Field", + "id": "PVTF_lADOAlIw4c4A0Lf4zgp6aFk", + "name": "Text1", + "dataType": "TEXT" + } + }, + { + "__typename": "ProjectV2ItemFieldSingleSelectValue", + "name": "Option1", + "field": { + "__typename": "ProjectV2SingleSelectField", + "id": "PVTSSF_lADOAlIw4c4A0Lf4zgp9CRc", + "name": "IntSS", + "dataType": "SINGLE_SELECT", + "options": [ + { + "id": "ae9ef0df", + "name": "Option1" + }, + { + "id": "9f685ff0", + "name": "Option2" + }, + { + "id": "e8a519ad", + "name": "Option3" + } + ] + } + }, + { + "__typename": "ProjectV2ItemFieldNumberValue", + "number": 0.0, + "field": { + "__typename": "ProjectV2Field", + "id": "PVTF_lADOAlIw4c4A0Lf4zgp6aIw", + "name": "Int2", + "dataType": "NUMBER" + } + }, + { + "__typename": "ProjectV2ItemFieldDateValue", + "date": "2025-03-15", + "field": { + "__typename": "ProjectV2Field", + "id": "PVTF_lADOAlIw4c4A0Lf4zgqDG_s", + "name": "DueDate", + "dataType": "DATE" + } + }, + { + "__typename": "ProjectV2ItemFieldSingleSelectValue", + "name": "Overdue", + "field": { + "__typename": "ProjectV2SingleSelectField", + "id": "PVTSSF_lADOAlIw4c4A0Lf4zgp2lTo", + "name": "Status", + "dataType": "SINGLE_SELECT", + "options": [ + { + "id": "9893bd57", + "name": "ActionRequired" + }, + { + "id": "59a06e8d", + "name": "Overdue" + }, + { + "id": "f75ad846", + "name": "Todo" + }, + { + "id": "47fc9ee4", + "name": "In Progress" + }, + { + "id": "98236657", + "name": "Done" + }, + { + "id": "b057b134", + "name": "Planned" + }, + { + "id": "090b4a67", + "name": "Follow-up" + } + ] + } + } + ] + } + } + } +} diff --git a/Test/private/mocks/invoke-getitem-PVTI_lADOAlIw4c4A0Lf4zgYNTxI.json b/Test/private/mocks/invoke-getitem-PVTI_lADOAlIw4c4A0Lf4zgYNTxI.json new file mode 100644 index 0000000..b2ac6fe --- /dev/null +++ b/Test/private/mocks/invoke-getitem-PVTI_lADOAlIw4c4A0Lf4zgYNTxI.json @@ -0,0 +1,84 @@ +{ + "data": { + "node": { + "id": "PVTI_lADOAlIw4c4A0Lf4zgYNTxI", + "type": "DRAFT_ISSUE", + "project": { + "id": "PVT_kwDOAlIw4c4A0Lf4", + "url": "https://github.com/orgs/octodemo/projects/625" + }, + "content": { + "__typename": "DraftIssue", + "id": "DI_lADOAlIw4c4A0Lf4zgJQEX4", + "body": "", + "title": "draft2", + "updatedAt": "2025-03-12T10:38:22Z", + "createdAt": "2025-03-12T10:38:22Z" + }, + "fieldValues": { + "nodes": [ + { + "__typename": "ProjectV2ItemFieldTextValue", + "text": "draft2", + "field": { + "__typename": "ProjectV2Field", + "id": "PVTF_lADOAlIw4c4A0Lf4zgp2lTg", + "name": "Title", + "dataType": "TITLE" + } + }, + { + "__typename": "ProjectV2ItemFieldDateValue", + "date": "2025-03-26", + "field": { + "__typename": "ProjectV2Field", + "id": "PVTF_lADOAlIw4c4A0Lf4zgqDG_s", + "name": "DueDate", + "dataType": "DATE" + } + }, + { + "__typename": "ProjectV2ItemFieldSingleSelectValue", + "name": "ActionRequired", + "field": { + "__typename": "ProjectV2SingleSelectField", + "id": "PVTSSF_lADOAlIw4c4A0Lf4zgp2lTo", + "name": "Status", + "dataType": "SINGLE_SELECT", + "options": [ + { + "id": "9893bd57", + "name": "ActionRequired" + }, + { + "id": "59a06e8d", + "name": "Overdue" + }, + { + "id": "f75ad846", + "name": "Todo" + }, + { + "id": "47fc9ee4", + "name": "In Progress" + }, + { + "id": "98236657", + "name": "Done" + }, + { + "id": "b057b134", + "name": "Planned" + }, + { + "id": "090b4a67", + "name": "Follow-up" + } + ] + } + } + ] + } + } + } +} diff --git a/Test/private/mocks/invoke-getitem-PVTI_lADOBCrGTM4ActQazgMuXXc.json b/Test/private/mocks/invoke-getitem-PVTI_lADOBCrGTM4ActQazgMuXXc.json new file mode 100644 index 0000000..c240403 --- /dev/null +++ b/Test/private/mocks/invoke-getitem-PVTI_lADOBCrGTM4ActQazgMuXXc.json @@ -0,0 +1,182 @@ +{ + "data": { + "node": { + "id": "PVTI_lADOBCrGTM4ActQazgMuXXc", + "type": "DRAFT_ISSUE", + "project": { + "id": "PVT_kwDOBCrGTM4ActQa", + "url": "https://github.com/orgs/SolidifyDemo/projects/164" + }, + "content": { + "__typename": "DraftIssue", + "id": "DI_lADOBCrGTM4ActQazgFYYPQ", + "body": "Description fo the Idea that triggered this Draft", + "title": "kk text", + "updatedAt": "2024-03-21T14:03:49Z", + "createdAt": "2024-02-15T12:00:46Z" + }, + "fieldValues": { + "nodes": [ + { + "__typename": "ProjectV2ItemFieldUserValue", + "users": { + "nodes": [ + { + "login": "rulasg" + } + ] + }, + "field": { + "__typename": "ProjectV2Field", + "id": "PVTF_lADOBCrGTM4ActQazgSkYnA", + "name": "Assignees", + "dataType": "ASSIGNEES" + } + }, + { + "__typename": "ProjectV2ItemFieldTextValue", + "text": "kk text", + "field": { + "__typename": "ProjectV2Field", + "id": "PVTF_lADOBCrGTM4ActQazgSkYm8", + "name": "Title", + "dataType": "TITLE" + } + }, + { + "__typename": "ProjectV2ItemFieldSingleSelectValue", + "name": "Todo", + "field": { + "__typename": "ProjectV2SingleSelectField", + "id": "PVTSSF_lADOBCrGTM4ActQazgSkYnE", + "name": "Status", + "dataType": "SINGLE_SELECT", + "options": [ + { + "id": "08542ce3", + "name": "New" + }, + { + "id": "f75ad846", + "name": "Todo" + }, + { + "id": "47fc9ee4", + "name": "In Progress" + }, + { + "id": "98236657", + "name": "Done" + }, + { + "id": "92093fe5", + "name": "Planned" + }, + { + "id": "554bc3ca", + "name": "Waiting" + } + ] + } + }, + { + "__typename": "ProjectV2ItemFieldTextValue", + "text": "comment for draft 1", + "field": { + "__typename": "ProjectV2Field", + "id": "PVTF_lADOBCrGTM4ActQazgSl5GU", + "name": "Comment", + "dataType": "TEXT" + } + }, + { + "__typename": "ProjectV2ItemFieldSingleSelectValue", + "name": "🥵High", + "field": { + "__typename": "ProjectV2SingleSelectField", + "id": "PVTSSF_lADOBCrGTM4ActQazgSl5LY", + "name": "Priority", + "dataType": "SINGLE_SELECT", + "options": [ + { + "id": "68c3924b", + "name": "🔥Critical" + }, + { + "id": "52dc7b6d", + "name": "🥵High" + }, + { + "id": "d99c38e6", + "name": "😊Normal" + }, + { + "id": "ab2e6f64", + "name": "🥶Low" + } + ] + } + }, + { + "__typename": "ProjectV2ItemFieldSingleSelectValue", + "name": "Nice⭐️", + "field": { + "__typename": "ProjectV2SingleSelectField", + "id": "PVTSSF_lADOBCrGTM4ActQazgSl5ME", + "name": "Severity", + "dataType": "SINGLE_SELECT", + "options": [ + { + "id": "2d190e20", + "name": "Critical⭐️⭐️⭐️⭐️" + }, + { + "id": "94d0bf94", + "name": "Important⭐️⭐️⭐️" + }, + { + "id": "ea848251", + "name": "Needed⭐️⭐️" + }, + { + "id": "c99f6d55", + "name": "Nice⭐️" + } + ] + } + }, + { + "__typename": "ProjectV2ItemFieldNumberValue", + "number": 8.0, + "field": { + "__typename": "ProjectV2Field", + "id": "PVTF_lADOBCrGTM4ActQazgSl5WM", + "name": "StoryPoints", + "dataType": "NUMBER" + } + }, + { + "__typename": "ProjectV2ItemFieldNumberValue", + "number": 666.0, + "field": { + "__typename": "ProjectV2Field", + "id": "PVTF_lADOBCrGTM4ActQazgSkglc", + "name": "TimeTracker", + "dataType": "NUMBER" + } + }, + { + "__typename": "ProjectV2ItemFieldDateValue", + "date": "2024-04-23", + "field": { + "__typename": "ProjectV2Field", + "id": "PVTF_lADOBCrGTM4ActQazgSmAsE", + "name": "Next Action Date", + "dataType": "DATE" + } + } + ] + } + } + } +} diff --git a/Test/private/mocks/invoke-getitem-id1.json b/Test/private/mocks/invoke-getitem-id1.json new file mode 100644 index 0000000..1269078 --- /dev/null +++ b/Test/private/mocks/invoke-getitem-id1.json @@ -0,0 +1,138 @@ +{ + "data": { + "node": { + "id": "id1", + "type": "DRAFT_ISSUE", + "project": { + "id": "PVT_kwDOAlIw4c4A0Lf4", + "url": "https://github.com/orgs/octodemo/projects/625" + }, + "content": { + "__typename": "DraftIssue", + "id": "DI_lADOAlIw4c4A0Lf4zgJQEVU", + "body": "", + "title": "Target Item", + "updatedAt": "2025-03-12T10:36:49Z", + "createdAt": "2025-03-12T10:36:25Z" + }, + "fieldValues": { + "nodes": [ + { + "__typename": "ProjectV2ItemFieldTextValue", + "text": "Target Item", + "field": { + "__typename": "ProjectV2Field", + "id": "PVTF_lADOAlIw4c4A0Lf4zgp2lTg", + "name": "Title", + "dataType": "TITLE" + } + }, + { + "__typename": "ProjectV2ItemFieldTextValue", + "text": "Value 1", + "field": { + "__typename": "ProjectV2Field", + "id": "sf_Text1_id", + "name": "sf_Text1", + "dataType": "TEXT" + } + }, + { + "__typename": "ProjectV2ItemFieldTextValue", + "text": "Value 1", + "field": { + "__typename": "ProjectV2Field", + "id": "sf_Text2_id", + "name": "sf_Text2", + "dataType": "TEXT" + } + }, + { + "__typename": "ProjectV2ItemFieldSingleSelectValue", + "name": "Option1", + "field": { + "__typename": "ProjectV2SingleSelectField", + "id": "PVTSSF_lADOAlIw4c4A0Lf4zgp9CRc", + "name": "IntSS", + "dataType": "SINGLE_SELECT", + "options": [ + { + "id": "ae9ef0df", + "name": "Option1" + }, + { + "id": "9f685ff0", + "name": "Option2" + }, + { + "id": "e8a519ad", + "name": "Option3" + } + ] + } + }, + { + "__typename": "ProjectV2ItemFieldNumberValue", + "number": 0.0, + "field": { + "__typename": "ProjectV2Field", + "id": "PVTF_lADOAlIw4c4A0Lf4zgp6aIw", + "name": "Int2", + "dataType": "NUMBER" + } + }, + { + "__typename": "ProjectV2ItemFieldDateValue", + "date": "2025-03-15", + "field": { + "__typename": "ProjectV2Field", + "id": "PVTF_lADOAlIw4c4A0Lf4zgqDG_s", + "name": "DueDate", + "dataType": "DATE" + } + }, + { + "__typename": "ProjectV2ItemFieldSingleSelectValue", + "name": "Overdue", + "field": { + "__typename": "ProjectV2SingleSelectField", + "id": "PVTSSF_lADOAlIw4c4A0Lf4zgp2lTo", + "name": "Status", + "dataType": "SINGLE_SELECT", + "options": [ + { + "id": "9893bd57", + "name": "ActionRequired" + }, + { + "id": "59a06e8d", + "name": "Overdue" + }, + { + "id": "f75ad846", + "name": "Todo" + }, + { + "id": "47fc9ee4", + "name": "In Progress" + }, + { + "id": "98236657", + "name": "Done" + }, + { + "id": "b057b134", + "name": "Planned" + }, + { + "id": "090b4a67", + "name": "Follow-up" + } + ] + } + } + ] + } + } + } +} diff --git a/Test/private/mocks/invoke-getitem-id2.json b/Test/private/mocks/invoke-getitem-id2.json new file mode 100644 index 0000000..24cd8ce --- /dev/null +++ b/Test/private/mocks/invoke-getitem-id2.json @@ -0,0 +1,138 @@ +{ + "data": { + "node": { + "id": "id2", + "type": "DRAFT_ISSUE", + "project": { + "id": "PVT_kwDOAlIw4c4A0Lf4", + "url": "https://github.com/orgs/octodemo/projects/625" + }, + "content": { + "__typename": "DraftIssue", + "id": "DI_lADOAlIw4c4A0Lf4zgJQEVU_id2", + "body": "", + "title": "Target Item", + "updatedAt": "2025-03-12T10:36:49Z", + "createdAt": "2025-03-12T10:36:25Z" + }, + "fieldValues": { + "nodes": [ + { + "__typename": "ProjectV2ItemFieldTextValue", + "text": "Target Item", + "field": { + "__typename": "ProjectV2Field", + "id": "PVTF_lADOAlIw4c4A0Lf4zgp2lTg", + "name": "Title", + "dataType": "TITLE" + } + }, + { + "__typename": "ProjectV2ItemFieldTextValue", + "text": "Value 1", + "field": { + "__typename": "ProjectV2Field", + "id": "sf_Text1_id", + "name": "sf_Text1", + "dataType": "TEXT" + } + }, + { + "__typename": "ProjectV2ItemFieldTextValue", + "text": "Value 1", + "field": { + "__typename": "ProjectV2Field", + "id": "sf_Text2_id", + "name": "sf_Text2", + "dataType": "TEXT" + } + }, + { + "__typename": "ProjectV2ItemFieldSingleSelectValue", + "name": "Option1", + "field": { + "__typename": "ProjectV2SingleSelectField", + "id": "PVTSSF_lADOAlIw4c4A0Lf4zgp9CRc", + "name": "IntSS", + "dataType": "SINGLE_SELECT", + "options": [ + { + "id": "ae9ef0df", + "name": "Option1" + }, + { + "id": "9f685ff0", + "name": "Option2" + }, + { + "id": "e8a519ad", + "name": "Option3" + } + ] + } + }, + { + "__typename": "ProjectV2ItemFieldNumberValue", + "number": 0.0, + "field": { + "__typename": "ProjectV2Field", + "id": "PVTF_lADOAlIw4c4A0Lf4zgp6aIw", + "name": "Int2", + "dataType": "NUMBER" + } + }, + { + "__typename": "ProjectV2ItemFieldDateValue", + "date": "2025-03-15", + "field": { + "__typename": "ProjectV2Field", + "id": "PVTF_lADOAlIw4c4A0Lf4zgqDG_s", + "name": "DueDate", + "dataType": "DATE" + } + }, + { + "__typename": "ProjectV2ItemFieldSingleSelectValue", + "name": "Overdue", + "field": { + "__typename": "ProjectV2SingleSelectField", + "id": "PVTSSF_lADOAlIw4c4A0Lf4zgp2lTo", + "name": "Status", + "dataType": "SINGLE_SELECT", + "options": [ + { + "id": "9893bd57", + "name": "ActionRequired" + }, + { + "id": "59a06e8d", + "name": "Overdue" + }, + { + "id": "f75ad846", + "name": "Todo" + }, + { + "id": "47fc9ee4", + "name": "In Progress" + }, + { + "id": "98236657", + "name": "Done" + }, + { + "id": "b057b134", + "name": "Planned" + }, + { + "id": "090b4a67", + "name": "Follow-up" + } + ] + } + } + ] + } + } + } +} diff --git a/Test/public/getPrompt.test.ps1 b/Test/public/getPrompt.test.ps1 index 8207dd9..8a586f2 100644 --- a/Test/public/getPrompt.test.ps1 +++ b/Test/public/getPrompt.test.ps1 @@ -8,6 +8,8 @@ function Test_GetProjecthelperPrompt { $s = $ProjecthelperPromoptSettings MockCall_GitHubOrgProjectWithFields -Owner $owner -ProjectNumber $projectNumber -FileName "invoke-GitHubOrgProjectWithFields-octodemo-625-skipitems.json" -SkipItems + MockCallJson -Command 'Invoke-GetItem -itemid id1' -FileName "invoke-getitem-id1.json" + MockCallJson -Command 'Invoke-GetItem -itemid id2' -FileName "invoke-getitem-id2.json" # No environment, return null $result = Invoke-WriteProjecthelperPrompt diff --git a/Test/public/integrations/Edit-ProjectItemWithValues.test.ps1 b/Test/public/integrations/Edit-ProjectItemWithValues.test.ps1 index 1ba68b4..18817c5 100644 --- a/Test/public/integrations/Edit-ProjectItemWithValues.test.ps1 +++ b/Test/public/integrations/Edit-ProjectItemWithValues.test.ps1 @@ -11,6 +11,9 @@ function Test_EditProjectItemWithValues_Integration { MockCall_GitHubOrgProjectWithFields -Owner $owner -ProjectNumber $projectNumber -FileName "invoke-GitHubOrgProjectWithFields-$Owner-$ProjectNumber.2-skipitems.json" -SkipItems + # Mock the direct call for item + MockCallJson -Command "Invoke-GetItem -itemid $itemId" -FileName "invoke-getitem-$itemId.json" + $data = @{ "Text1" = "value1" "Text2" = "value2" diff --git a/Test/public/integrations/update-ProjectImtesWithInjection.test.ps1 b/Test/public/integrations/update-ProjectImtesWithInjection.test.ps1 index 44f6930..bec543b 100644 --- a/Test/public/integrations/update-ProjectImtesWithInjection.test.ps1 +++ b/Test/public/integrations/update-ProjectImtesWithInjection.test.ps1 @@ -33,7 +33,7 @@ function Test_UpdateProjectWithInjection{ Edit-ProjectItem @params } -function global:Invoke-ProjectInjection_2 { + function global:Invoke-ProjectInjection_2 { [CmdletBinding()] param( [Parameter()][string]$Owner, @@ -156,11 +156,15 @@ function Test_InvokeProjectInjection{ Reset-InvokeCommandMock Mock_DatabaseRoot - $owner = "octodemo" + $owner = "octodemo" $projectNumber = "625" + $itemId = "PVTI_lADOAlIw4c4A0Lf4zgYNTxI" + MockCall_GitHubOrgProjectWithFields -Owner $owner -ProjectNumber $projectNumber -FileName "invoke-GitHubOrgProjectWithFields-$owner-$projectNumber-skipitems.json" -skipitems + MockCallJson -Command "Invoke-GetItem -itemid $itemId" -FileName "invoke-getitem-$itemId.json" + function global:Invoke-ProjectInjection_1 { [CmdletBinding()] param( @@ -171,7 +175,7 @@ function Test_InvokeProjectInjection{ "String from integration1" | Write-Host $params = @{ - ItemId = "PVTI_lADOAlIw4c4A0Lf4zgYNTxI" + ItemId = $itemId Owner = $Owner ProjectNumber = $ProjectNumber FieldName = "sf_Text1" diff --git a/Test/public/project_item.test.ps1 b/Test/public/project_item.test.ps1 index 56809e4..2aedb35 100644 --- a/Test/public/project_item.test.ps1 +++ b/Test/public/project_item.test.ps1 @@ -9,60 +9,46 @@ function Test_GetProjectItem_SUCCESS{ $itemId = "PVTI_lADOBCrGTM4ActQazgMuXXc" - $fieldTitleValue = "A draft in the project" - $fieldCommentValue = "This" + $projectFieldTitleValue = "A draft in the project" + $projectFieldCommentValue = "This" + $itemFieldTitleValue = "kk text" + $itemFieldCommentValue = "comment for draft 1" - # allow get project with skipitems - MockCall_GitHubOrgProjectWithFields -Owner $owner -ProjectNumber $projectNumber -FileName 'projectV2-skipitems.json' -skipitems - - # Allow to get project with items for the FORCE + # allow get project MockCall_GitHubOrgProjectWithFields -Owner $owner -ProjectNumber $projectNumber -FileName 'projectV2.json' - $result = Get-ProjectItem -Owner $Owner -ProjectNumber $ProjectNumber -ItemId $itemId -Force - - Assert-AreEqual -Expected $itemId -Presented $result.id - Assert-AreEqual -Expected $fieldCommentValue -Presented $result.$fieldComment - Assert-AreEqual -Expected $fieldTitleValue -Presented $result.$fieldTitle - - # Edit to see the staged references - $fieldCommentValue = "new value of the comment 10.1" - $fieldTitleValue = "new value of the title 10.1" - Edit-ProjectItem -Owner $owner -ProjectNumber $projectNumber $itemId $fieldComment $fieldCommentValue - Edit-ProjectItem -Owner $owner -ProjectNumber $projectNumber $itemId $fieldTitle $fieldTitleValue + # Even if id is in project we make a direct call when with Force + MockCallJson -Command "Invoke-GetItem -itemid $itemId" -FileName "invoke-getitem-$itemId.json" + + # Act get value from project $result = Get-ProjectItem -Owner $Owner -ProjectNumber $ProjectNumber -ItemId $itemId Assert-AreEqual -Expected $itemId -Presented $result.id - Assert-AreEqual -Expected $fieldCommentValue -Presented $result.$fieldComment - Assert-AreEqual -Expected $fieldTitleValue -Presented $result.$fieldTitle -} + Assert-AreEqual -Expected $projectFieldCommentValue -Presented $result.$fieldComment + Assert-AreEqual -Expected $projectFieldTitleValue -Presented $result.$fieldTitle -function Test_GetProjectItem_SUCCESS_CacheItem{ - Reset-InvokeCommandMock - Mock_DatabaseRoot - - $Owner = "octodemo" ; $ProjectNumber = 700 ; - $itemId ="PVTI_lADOAlIw4c4BCe3Vzgeio4o" + # Act with force - get value from direct call + $result = Get-ProjectItem -Owner $Owner -ProjectNumber $ProjectNumber -ItemId $itemId -Force - # Cache project with no items - MockCall_GitHubOrgProjectWithFields -Owner $owner -ProjectNumber $ProjectNumber -skipitems -FileName "invoke-GitHubOrgProjectWithFields-octodemo-700-skipitems.json" - $null = Get-Project -Owner $Owner -ProjectNumber $ProjectNumber -SkipItems + Assert-AreEqual -Expected $itemId -Presented $result.id + Assert-AreEqual -Expected $itemFieldCommentValue -Presented $result.$fieldComment + Assert-AreEqual -Expected $itemFieldTitleValue -Presented $result.$fieldTitle - # Get item direct call - Set-InvokeCommandMock -Command "Get-MockFileContentJson -filename invoke-getitem-$itemId.json" -Alias "Invoke-GetItem -ItemId $itemId" + # Edit to see the staged references + $newFieldCommentValue = "new value of the comment 10.1" + $newFieldTitleValue = "new value of the title 10.1" + Edit-ProjectItem -Owner $owner -ProjectNumber $projectNumber $itemId $fieldComment $newFieldCommentValue + Edit-ProjectItem -Owner $owner -ProjectNumber $projectNumber $itemId $fieldTitle $newFieldTitleValue - # Act + # Act getting from cached project with staged values $result = Get-ProjectItem -Owner $Owner -ProjectNumber $ProjectNumber -ItemId $itemId - # Check return value is item Assert-AreEqual -Expected $itemId -Presented $result.id - - # Check that the item is cached - # As the project db did not have any item, now it should have one - $db = Get-Project -Owner $Owner -ProjectNumber $ProjectNumber - Assert-Count -Expected 1 -Presented $db.items.Keys - Assert-IsNotNull -Object $db.items.$itemId + Assert-AreEqual -Expected $newFieldCommentValue -Presented $result.$fieldComment + Assert-AreEqual -Expected $newFieldTitleValue -Presented $result.$fieldTitle } + function Test_EditProjetItems_SUCCESS{ Reset-InvokeCommandMock Mock_DatabaseRoot @@ -151,6 +137,9 @@ function Test_EditProejctItems_NumberDecimals{ $itemId = "PVTI_lADOBCrGTM4ActQazgMuXXc" + # Mock the direct call for item + MockCallJson -Command "Invoke-GetItem -itemid $itemId" -FileName "invoke-getitem-$itemId.json" + # [DBG]:> $prj.fields.PVTF_lADOBCrGTM4ActQazgSkglc # Name Value # ---- ----- @@ -203,6 +192,9 @@ function Test_EditProejctItems_Direct{ $itemId = "PVTI_lADOBCrGTM4ActQazgMuXXc" $fieldComment = "Comment" ; $fieldCommentValue = "new value of the comment 10.1" + # Mock the direct call for item + MockCallJson -Command "Invoke-GetItem -itemid $itemId" -FileName "invoke-getitem-$itemId.json" + # Direct edit of the item Edit-ProjectItem -Owner $owner -ProjectNumber $projectNumber -ItemId $itemId -FieldName $fieldComment -Value $fieldCommentValue diff --git a/include/openFilesUrls.ps1 b/include/openFilesUrls.ps1 new file mode 100644 index 0000000..62606dc --- /dev/null +++ b/include/openFilesUrls.ps1 @@ -0,0 +1,111 @@ +function Open-Url { + [CmdletBinding()] + param ( + [Parameter(Mandatory = $true, Position = 0, ValueFromPipeline = $true)] + [ValidateNotNullOrEmpty()] + [string]$Url + ) + + process { + try { + # Determine the operating system + if ($IsWindows -or $env:OS -match "Windows") { + # Windows - use Start-Process + Start-Process $Url + } + elseif ($IsMacOS) { + # macOS - use open command + Start-Process "open" -ArgumentList $Url + } + elseif ($IsLinux) { + # Linux - try xdg-open + Start-Process "xdg-open" -ArgumentList $Url + } + else { + # Fallback for older PowerShell versions without OS variables + switch ([System.Environment]::OSVersion.Platform) { + "Win32NT" { + Start-Process $Url + } + "Unix" { + # Try to determine if macOS or Linux + if (Test-Path "/System/Library/CoreServices/Finder.app") { + # macOS + Start-Process "open" -ArgumentList $Url + } + else { + # Assume Linux + Start-Process "xdg-open" -ArgumentList $Url + } + } + default { + throw "Unsupported operating system" + } + } + } + } + catch { + Write-Error "Failed to open URL: $_" + } + } +} Export-ModuleMember -Function 'Open-Url' + +function Open-File { + [CmdletBinding()] + param ( + [Parameter(Mandatory = $true, Position = 0, ValueFromPipeline = $true)] + [ValidateNotNullOrEmpty()] + [string]$Path + ) + + process { + try { + # Ensure the file exists + if (-not (Test-Path -Path $Path)) { + throw "File not found: $Path" + } + + # Get absolute path + $absolutePath = (Resolve-Path -Path $Path).Path + + # Determine the operating system + if ($IsWindows -or $env:OS -match "Windows") { + # Windows - use Invoke-Item + Invoke-Item -Path $absolutePath + } + elseif ($IsMacOS) { + # macOS - use open command + Start-Process "open" -ArgumentList $absolutePath + } + elseif ($IsLinux) { + # Linux - try xdg-open + Start-Process "xdg-open" -ArgumentList $absolutePath + } + else { + # Fallback for older PowerShell versions without OS variables + switch ([System.Environment]::OSVersion.Platform) { + "Win32NT" { + Invoke-Item -Path $absolutePath + } + "Unix" { + # Try to determine if macOS or Linux + if (Test-Path "/System/Library/CoreServices/Finder.app") { + # macOS + Start-Process "open" -ArgumentList $absolutePath + } + else { + # Assume Linux + Start-Process "xdg-open" -ArgumentList $absolutePath + } + } + default { + throw "Unsupported operating system" + } + } + } + } + catch { + Write-Error "Failed to open file: $_" + } + } +} Export-ModuleMember -Function 'Open-File' diff --git a/public/project/getproject.ps1 b/public/project/getproject.ps1 index 6bcdf0d..adf4f53 100644 --- a/public/project/getproject.ps1 +++ b/public/project/getproject.ps1 @@ -79,4 +79,21 @@ function Open-Project{ Write-Host "URL: $projectUrl" } -} Export-ModuleMember -Function Open-Project \ No newline at end of file +} Export-ModuleMember -Function Open-Project + +function Set-Project { + [CmdletBinding()] + param( + [Parameter()][string]$Owner, + [Parameter(ValueFromPipeline,Position=1)][int]$ProjectNumber + ) + + process { + + ($Owner, $ProjectNumber) = Get-OwnerAndProjectNumber -Owner $Owner -ProjectNumber $ProjectNumber + if ([string]::IsNullOrWhiteSpace($owner) -or [string]::IsNullOrWhiteSpace($ProjectNumber)) { + throw "Owner and ProjectNumber are required on Open-Project" + } + } + +} Export-ModuleMember -Function Set-Project \ No newline at end of file diff --git a/public/project_item.ps1 b/public/project_item.ps1 index 50eef53..d9b2965 100644 --- a/public/project_item.ps1 +++ b/public/project_item.ps1 @@ -9,34 +9,35 @@ Set-MyInvokeCommandAlias -Alias GetItem -Command 'Invoke-GetItem -ItemId {itemid Fields will show th emerge between Project and Staged Item fields values .EXAMPLE Get-ProjectItem -Owner "someOwner" -ProjectNumber 164 -ItemId PVTI_lADOBCrGTM4ActQazgMuXXc - #> -function Get-ProjectItem{ +#> +function Get-ProjectItem { [CmdletBinding()] param( - [Parameter(Mandatory,ValueFromPipeline,Position = 0)][string]$ItemId, + [Parameter(Mandatory, ValueFromPipeline, Position = 0)][string]$ItemId, [Parameter()][string]$Owner, [Parameter()][string]$ProjectNumber, [Parameter()][switch]$Force ) - begin{ - ($Owner,$ProjectNumber) = Get-OwnerAndProjectNumber -Owner $Owner -ProjectNumber $ProjectNumber - if([string]::IsNullOrWhiteSpace($owner) -or [string]::IsNullOrWhiteSpace($ProjectNumber)){ "Owner and ProjectNumber are required" | Write-MyError; return $null} + begin { + ($Owner, $ProjectNumber) = Get-OwnerAndProjectNumber -Owner $Owner -ProjectNumber $ProjectNumber + if ([string]::IsNullOrWhiteSpace($owner) -or [string]::IsNullOrWhiteSpace($ProjectNumber)) { "Owner and ProjectNumber are required" | Write-MyError; return $null } # Get Item from Project database - $db = Get-Project -Owner $Owner -ProjectNumber $ProjectNumber -Force:$Force + $db = Get-Project -Owner $Owner -ProjectNumber $ProjectNumber # Durty flag - $durty= $false + $durty = $false } - process{ - if($db){ + process { + if ($db) { $item = Get-Item $db $itemId } - if($null -eq $item){ - "Item [$ItemId] not found in cache, fetching from API" | Write-Verbose + + if (( ! $item ) -or $Force) { + "Fetching item [$ItemId] from API" | Write-Verbose # Get direct. No cache as we are in a database modification context $item = Get-ProjectItemDirect -ItemId $ItemId @@ -44,13 +45,16 @@ function Get-ProjectItem{ # Add to database Set-Item $db $item $durty = $true + + # Get item again to allow the merge between staged and project fields + $item = Get-Item $db $itemId } return $item } - end{ - if($durty){ + end { + if ($durty) { "Saving durty database" | Write-Verbose Save-ProjectDatabase -Database $db } @@ -58,15 +62,15 @@ function Get-ProjectItem{ } Export-ModuleMember -Function Get-ProjectItem -function Set-ProjectItem{ +function Set-ProjectItem { [CmdletBinding()] param( - [Parameter(Mandatory,ValueFromPipeline,Position = 0)][object]$Item, + [Parameter(Mandatory, ValueFromPipeline, Position = 0)][object]$Item, [Parameter()][string]$Owner, [Parameter()][string]$ProjectNumber ) - ($Owner,$ProjectNumber) = Get-OwnerAndProjectNumber -Owner $Owner -ProjectNumber $ProjectNumber - if([string]::IsNullOrWhiteSpace($owner) -or [string]::IsNullOrWhiteSpace($ProjectNumber)){ "Owner and ProjectNumber are required" | Write-MyError; return $null} + ($Owner, $ProjectNumber) = Get-OwnerAndProjectNumber -Owner $Owner -ProjectNumber $ProjectNumber + if ([string]::IsNullOrWhiteSpace($owner) -or [string]::IsNullOrWhiteSpace($ProjectNumber)) { "Owner and ProjectNumber are required" | Write-MyError; return $null } $db = Get-Project -Owner $Owner -ProjectNumber $ProjectNumber @@ -75,54 +79,55 @@ function Set-ProjectItem{ Save-ProjectDatabase -Database $db } -function Remove-ProjectItem{ +function Remove-ProjectItem { [CmdletBinding()] param( - [Parameter(Mandatory,ValueFromPipeline,Position = 0)][string]$ItemId, + [Parameter(Mandatory, ValueFromPipeline, Position = 0)][string]$ItemId, [Parameter()][string]$Owner, [Parameter()][string]$ProjectNumber ) - begin{ - ($Owner,$ProjectNumber) = Get-OwnerAndProjectNumber -Owner $Owner -ProjectNumber $ProjectNumber - if([string]::IsNullOrWhiteSpace($owner) -or [string]::IsNullOrWhiteSpace($ProjectNumber)){ "Owner and ProjectNumber are required" | Write-MyError; return $null} + begin { + ($Owner, $ProjectNumber) = Get-OwnerAndProjectNumber -Owner $Owner -ProjectNumber $ProjectNumber + if ([string]::IsNullOrWhiteSpace($owner) -or [string]::IsNullOrWhiteSpace($ProjectNumber)) { "Owner and ProjectNumber are required" | Write-MyError; return $null } $db = Get-Project -Owner $Owner -ProjectNumber $ProjectNumber } - process{ + process { Remove-Item $db $itemId } - end{ + end { Save-ProjectDatabase -Database $db } } -function Find-ProjectItem{ +function Find-ProjectItem { [CmdletBinding()] param( [Parameter()][string]$Owner, [Parameter()][string]$ProjectNumber, - [Parameter(Mandatory,Position = 0)][string]$Title, + [Parameter(Mandatory, Position = 0)][string]$Title, [Parameter()][switch]$IncludeDone, [Parameter()][switch]$Match, [Parameter()][switch]$Force ) - ($Owner,$ProjectNumber) = Get-OwnerAndProjectNumber -Owner $Owner -ProjectNumber $ProjectNumber - if([string]::IsNullOrWhiteSpace($owner) -or [string]::IsNullOrWhiteSpace($ProjectNumber)){ "Owner and ProjectNumber are required" | Write-MyError; return $null} + ($Owner, $ProjectNumber) = Get-OwnerAndProjectNumber -Owner $Owner -ProjectNumber $ProjectNumber + if ([string]::IsNullOrWhiteSpace($owner) -or [string]::IsNullOrWhiteSpace($ProjectNumber)) { "Owner and ProjectNumber are required" | Write-MyError; return $null } $items = Get-ProjectItemList -Owner $Owner -ProjectNumber $ProjectNumber -Force:$Force -ExcludeDone:$(-not $IncludeDone) # return if #items is null - if($null -eq $items){ return $null} + if ($null -eq $items) { return $null } # Find item in the database - if($Match){ + if ($Match) { $found = $items.Values | Where-Object { $_.Title -eq $Title } - } else { + } + else { $found = $items.Values | Where-Object { $_.Title -like "$Title" } } @@ -133,34 +138,96 @@ function Find-ProjectItem{ return $ret } Export-ModuleMember -Function Find-ProjectItem -function Search-ProjectItem{ +function Search-ProjectItem { [CmdletBinding()] param( - [Parameter(Mandatory,Position = 0)] [string]$Filter, + [Parameter(Mandatory, Position = 0)] [string]$Filter, [Parameter()][string]$Owner, [Parameter()][string]$ProjectNumber, [Parameter()][switch]$IncludeDone, [Parameter()][switch]$Force ) - ($Owner,$ProjectNumber) = Get-OwnerAndProjectNumber -Owner $Owner -ProjectNumber $ProjectNumber - if([string]::IsNullOrWhiteSpace($owner) -or [string]::IsNullOrWhiteSpace($ProjectNumber)){ "Owner and ProjectNumber are required" | Write-MyError; return $null} + ($Owner, $ProjectNumber) = Get-OwnerAndProjectNumber -Owner $Owner -ProjectNumber $ProjectNumber + if ([string]::IsNullOrWhiteSpace($owner) -or [string]::IsNullOrWhiteSpace($ProjectNumber)) { "Owner and ProjectNumber are required" | Write-MyError; return $null } $items = Get-ProjectItemList -Owner $Owner -ProjectNumber $ProjectNumber -Force:$Force -ExcludeDone:$(-not $IncludeDone) # return if #items is null - if($null -eq $items){ return $null} + if ($null -eq $items) { return $null } $found = $items.Values | Where-Object { Test-ProjectItemIsLikeAnyField -Item $_ -Value $Filter } $ret = @($found | ForEach-Object { - [PSCustomObject]$_ - }) + [PSCustomObject]$_ + }) return $ret } Export-ModuleMember -Function Search-ProjectItem +function Get-ProjectItems { + [CmdletBinding()] + param( + [Parameter()][string]$Owner, + [Parameter()][string]$ProjectNumber, + [Parameter()][switch]$IncludeDone, + [Parameter()][switch]$Force + ) + + ($Owner, $ProjectNumber) = Get-OwnerAndProjectNumber -Owner $Owner -ProjectNumber $ProjectNumber + if ([string]::IsNullOrWhiteSpace($owner) -or [string]::IsNullOrWhiteSpace($ProjectNumber)) { "Owner and ProjectNumber are required" | Write-MyError; return $null } + + $items = Get-ProjectItemList -Owner $Owner -ProjectNumber $ProjectNumber -Force:$Force -ExcludeDone:$(-not $IncludeDone) + + # return if #items is null + if ($null -eq $items) { return $null } + + $ret = @($items.Values | ForEach-Object { + [PSCustomObject]$_ + } ) + + return $ret + +} Export-ModuleMember -Function Get-ProjectItems + +function Open-ProjectItem { + [CmdletBinding()] + param( + [Parameter()][string]$Owner, + [Parameter()][int]$ProjectNumber, + [Parameter(Mandatory, ValueFromPipelineByPropertyName, ValueFromPipeline, Position = 0)] + [string]$ItemId + ) + + begin { + + "Project set to [$owner/$ProjectNumber]" | Write-Verbose + + ($Owner, $ProjectNumber) = Get-OwnerAndProjectNumber -Owner $Owner -ProjectNumber $ProjectNumber + if ([string]::IsNullOrWhiteSpace($owner) -or [string]::IsNullOrWhiteSpace($ProjectNumber)) { + throw "Owner and ProjectNumber are required on Open-ProjectItem" + } + } + + process { + + "Opening item [$ItemId] in project [$Owner/$ProjectNumber]" | Write-Verbose + + $item = Get-ProjectItem -Owner $Owner -ProjectNumber $ProjectNumber -ItemId $ItemId + if (-not $item) { + throw "Item not found for Owner [$Owner], ProjectNumber [$ProjectNumber] and ItemId [$ItemId]" + } + + if (-not $item.url) { + "No URL found for Item [$ItemId] type $($item.type)" | Write-Error + return + } + + Open-Url -Url $item.url + } +} Export-ModuleMember -Function Open-ProjectItem + <# .SYNOPSIS Edit a project item @@ -168,7 +235,7 @@ function Search-ProjectItem{ Edit-ProjectItem -Owner "someOwner" -ProjectNumber 164 -Title "Item 1 - title" -FieldName "comment" -Value "new value of the comment" Edit-ProjectItem -Owner "someOwner" -ProjectNumber 164 -Title "Item 1 - title" -FieldName "title" -Value "new value of the title" #> -function Edit-ProjectItem{ +function Edit-ProjectItem { [CmdletBinding()] param( [Parameter()][string]$Owner, @@ -178,28 +245,24 @@ function Edit-ProjectItem{ [Parameter(Position = 3)][string]$Value, [Parameter()][switch]$Force ) - ($Owner,$ProjectNumber) = Get-OwnerAndProjectNumber -Owner $Owner -ProjectNumber $ProjectNumber - if([string]::IsNullOrWhiteSpace($owner) -or [string]::IsNullOrWhiteSpace($ProjectNumber)){ "Owner and ProjectNumber are required" | Write-MyError; return $null} + ($Owner, $ProjectNumber) = Get-OwnerAndProjectNumber -Owner $Owner -ProjectNumber $ProjectNumber + if ([string]::IsNullOrWhiteSpace($owner) -or [string]::IsNullOrWhiteSpace($ProjectNumber)) { "Owner and ProjectNumber are required" | Write-MyError; return $null } # Force cache update # Full sync if force. Skip items if not force $db = Get-Project -Owner $Owner -ProjectNumber $ProjectNumber -Force:$Force -SkipItems:$(-not $Force) # Find the actual value of the item. Item+Staged - $item = Get-Item $db $ItemId - # $itemStaged = Get-ItemStaged $db $ItemId + $item = Get-ProjectItem -ItemId $ItemId -Owner $Owner -ProjectNumber $ProjectNumber + # if the item is not found - # if($null -eq $item){ "Item [$ItemId] not found" | Write-MyError; return $null} + if($null -eq $item){ "Item [$ItemId] not found" | Write-MyError; return $null} - # Check if item exists in cache and if so if the value is the same as the target value and we avoid update - if($item){ - if( IsEqual -Object1:$item.$FieldName -Object2:$Value){ - "The value is the same, no need to stage it" | Write-Verbose - return - } - } else { - "Staging - Item [$ItemId] not found in project [$Owner/$ProjectNumber] " | Write-Verbose + # Check if value is the same + if ( IsEqual -Object1:$item.$FieldName -Object2:$Value) { + "The value is the same, no need to stage it" | Write-Verbose + return } # save the new value @@ -210,32 +273,32 @@ function Edit-ProjectItem{ } Export-ModuleMember -Function Edit-ProjectItem -function Add-ProjectItemDirect{ +function Add-ProjectItemDirect { [CmdletBinding()] - [alias("Add-ProjectItem","api")] + [alias("Add-ProjectItem", "api")] param( - [Parameter(ValueFromPipeline,Position = 0)][string]$Url, + [Parameter(ValueFromPipeline, Position = 0)][string]$Url, [Parameter()][string]$Owner, [Parameter()][string]$ProjectNumber, [Parameter()][switch]$NoCache ) - process{ + process { - ($Owner,$ProjectNumber) = Get-OwnerAndProjectNumber -Owner $Owner -ProjectNumber $ProjectNumber - if([string]::IsNullOrWhiteSpace($owner) -or [string]::IsNullOrWhiteSpace($ProjectNumber)){ "Owner and ProjectNumber are required" | Write-MyError; return $null} + ($Owner, $ProjectNumber) = Get-OwnerAndProjectNumber -Owner $Owner -ProjectNumber $ProjectNumber + if ([string]::IsNullOrWhiteSpace($owner) -or [string]::IsNullOrWhiteSpace($ProjectNumber)) { "Owner and ProjectNumber are required" | Write-MyError; return $null } # Get project id $db = Get-Project -Owner $Owner -ProjectNumber $ProjectNumber $projectId = $db.ProjectId - if(-not $projectId){ + if (-not $projectId) { "Project ID not found for Owner [$Owner] and ProjectNumber [$ProjectNumber]" | Write-MyError return $null } # Get item id $contentId = Get-ContentIdFromUrl -Url $Url - if(-not $contentId){ + if (-not $contentId) { "Content ID not found for URL [$Url]" | Write-MyError return $null } @@ -244,18 +307,17 @@ function Add-ProjectItemDirect{ $response = Invoke-MyCommand -Command AddItemToProject -Parameters @{ projectid = $projectId ; contentid = $contentId } # check if the response is null - if($response.errors){ + if ($response.errors) { "[$($response.errors[0].type)] $($response.errors[0].message)" | Write-MyError return $null } $item = $response.data.addProjectV2ItemById.item - if($item) - { + if ($item) { $ret = $item.id - if(! $NoCache){ + if (! $NoCache) { "Adding item [$ret] to cache" | Write-Verbose $item = $item | Convert-NodeItemToHash @@ -266,20 +328,18 @@ function Add-ProjectItemDirect{ } - "Setting global variable ItemId to [$ret]" | Write-Verbose - $global:ItemId = $ret - return $ret - - } else { + + } + else { "Item not added to project" | Write-MyError return $null } } -} Export-ModuleMember -Function Add-ProjectItemDirect -Alias "Add-ProjectItem","api" +} Export-ModuleMember -Function Add-ProjectItemDirect -Alias "Add-ProjectItem", "api" -function Remove-ProjectItemDirect{ +function Remove-ProjectItemDirect { [CmdletBinding()] param( [Parameter()][string]$Owner, @@ -288,22 +348,23 @@ function Remove-ProjectItemDirect{ [Parameter()][switch]$NoCache ) - begin{ - ($Owner,$ProjectNumber) = Get-OwnerAndProjectNumber -Owner $Owner -ProjectNumber $ProjectNumber - if([string]::IsNullOrWhiteSpace($owner) -or [string]::IsNullOrWhiteSpace($ProjectNumber)){ "Owner and ProjectNumber are required" | Write-MyError; return $null} + begin { + ($Owner, $ProjectNumber) = Get-OwnerAndProjectNumber -Owner $Owner -ProjectNumber $ProjectNumber + if ([string]::IsNullOrWhiteSpace($owner) -or [string]::IsNullOrWhiteSpace($ProjectNumber)) { "Owner and ProjectNumber are required" | Write-MyError; return $null } # Get project id $db = Get-Project -Owner $Owner -ProjectNumber $ProjectNumber - if($db){ + if ($db) { $projectId = $db.ProjectId - } else { + } + else { throw "Project not found for Owner [$Owner] and ProjectNumber [$ProjectNumber]" } } - process{ + process { - if (-not $projectId){ + if (-not $projectId) { "Project ID not found for Owner [$Owner] and ProjectNumber [$ProjectNumber]" | Write-MyError return } @@ -312,19 +373,19 @@ function Remove-ProjectItemDirect{ $response = Invoke-MyCommand -Command RemoveItemFromProject -Parameters @{ projectid = $projectId ; itemid = $ItemId } # check if the response is null - if($response.errors){ + if ($response.errors) { "[$($response.errors[0].type)] $($response.errors[0].message)" | Write-MyError return $null } - if($response.data.deleteProjectV2Item.deletedItemId -ne $ItemId){ + if ($response.data.deleteProjectV2Item.deletedItemId -ne $ItemId) { "Some issue removing [$ItemId] from project" | Write-MyError return $null } - $ret = $response.data.deleteProjectV2Item.deletedItemId + $ret = $response.data.deleteProjectV2Item.deletedItemId - if(! $NoCache){ + if (! $NoCache) { # Remove item from cache "Removing item [$ItemId] from cache" | Write-Verbose Remove-Item $db $ItemId @@ -336,10 +397,10 @@ function Remove-ProjectItemDirect{ } Export-ModuleMember -Function Remove-ProjectItemDirect -function Get-ProjectItemDirect{ +function Get-ProjectItemDirect { [CmdletBinding()] param( - [Parameter(Mandatory,ValueFromPipeline,Position = 0)][string]$ItemId + [Parameter(Mandatory, ValueFromPipeline, Position = 0)][string]$ItemId ) $response = Invoke-MyCommand -Command GetItem -Parameters @{ @@ -347,12 +408,12 @@ function Get-ProjectItemDirect{ } # check if the response is null - if($response.errors){ + if ($response.errors) { "[$($response.errors[0].type)] $($response.errors[0].message)" | Write-MyError return $null } - if($response.data.node.id -ne $ItemId){ + if ($response.data.node.id -ne $ItemId) { "Item [$ItemId] not found" | Write-MyError return $null } @@ -362,7 +423,7 @@ function Get-ProjectItemDirect{ return $item } Export-ModuleMember -Function Get-ProjectItemDirect -function Show-ProjectItem{ +function Show-ProjectItem { [CmdletBinding()] param( [Parameter(Position = 0)][string]$Owner, @@ -371,11 +432,11 @@ function Show-ProjectItem{ [Parameter()][string[]]$AdditionalFields ) - begin{ + begin { $fields = Get-EnvironmentDisplayFields -Fields $AdditionalFields } - process{ + process { $ret = $item | Select-Object -Property $Fields return $ret @@ -383,13 +444,13 @@ function Show-ProjectItem{ } Export-ModuleMember -Function Show-ProjectItem -function Test-ProjectItemIsLikeAnyField{ +function Test-ProjectItemIsLikeAnyField { param( - [Parameter(Mandatory,ValueFromPipeline)] [object]$Item, - [Parameter(Mandatory,Position = 0)][string]$Value + [Parameter(Mandatory, ValueFromPipeline)] [object]$Item, + [Parameter(Mandatory, Position = 0)][string]$Value ) - foreach($key in $item.Keys){ - if($item.$key -Like "*$Value*"){ + foreach ($key in $item.Keys) { + if ($item.$key -Like "*$Value*") { return $true } } @@ -399,7 +460,7 @@ function Test-ProjectItemIsLikeAnyField{ } -function IsEqual{ +function IsEqual { param( [object]$Object1, [object]$Object2