Skip to content

Commit e3ed23d

Browse files
Added import.ps1 (#20)
* Added import.ps1 First version importscripts * Update README.md * Update README.md * Update README.md Added Rick's changes
1 parent 2529dc5 commit e3ed23d

File tree

2 files changed

+200
-0
lines changed

2 files changed

+200
-0
lines changed

README.md

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,17 @@ _HelloID-Conn-Prov-Target-AFAS-Profit-Employees is a _target_ connector. _AFAS-P
3535
| ----------------------------- | ----------- |
3636
| profitrestservices/connectors | |
3737

38+
Supported features:
39+
| Feature | Supported | Actions | Remarks |
40+
| ----------------------------------- | --------- | --------------------------------------------------------------------------- | ------- |
41+
| **Account Lifecycle** || Create, Update, Delete | |
42+
| **Permissions** || - | |
43+
| **Resources** || - | |
44+
| **Entitlement Import: Accounts** || - | |
45+
| **Entitlement Import: Permissions** || - | |
46+
47+
48+
3849
The following lifecycle actions are available:
3950

4051
| Action | Description |

import.ps1

Lines changed: 189 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,189 @@
1+
#################################################
2+
# HelloID-Conn-Prov-Target-AFAS-Profit-Employees-Import
3+
# PowerShell V2
4+
#################################################
5+
6+
# Enable TLS1.2
7+
[System.Net.ServicePointManager]::SecurityProtocol = [System.Net.ServicePointManager]::SecurityProtocol -bor [System.Net.SecurityProtocolType]::Tls12
8+
9+
function Get-AFASConnectorData {
10+
param(
11+
[parameter(Mandatory = $true)]$Token,
12+
[parameter(Mandatory = $true)]$BaseUri,
13+
[parameter(Mandatory = $true)]$Connector,
14+
[parameter(Mandatory = $true)]$OrderByFieldIds,
15+
[parameter(Mandatory = $true)]$Filter,
16+
[parameter(Mandatory = $true)][ref]$data
17+
)
18+
19+
try {
20+
Write-Verbose "Starting downloading objects through get-connector [$connector]"
21+
$encodedToken = [System.Convert]::ToBase64String([System.Text.Encoding]::ASCII.GetBytes($Token))
22+
$authValue = "AfasToken $encodedToken"
23+
$Headers = @{ Authorization = $authValue }
24+
$Headers.Add("IntegrationId", "45963_140664") # Fixed value - Tools4ever Partner Integration ID
25+
26+
$take = 1000
27+
$skip = 0
28+
29+
$uri = $BaseUri + "/connectors/" + $Connector + "?$filter&skip=$skip&take=$take&orderbyfieldids=$OrderByFieldIds"
30+
31+
$dataset = Invoke-RestMethod -Method Get -Uri $uri -Headers $Headers -UseBasicParsing
32+
33+
foreach ($record in $dataset.rows) { [void]$data.Value.add($record) }
34+
35+
$skip += $take
36+
while (@($dataset.rows).count -eq $take) {
37+
$uri = $BaseUri + "/connectors/" + $Connector + "?$filter&skip=$skip&take=$take&orderbyfieldids=$OrderByFieldIds"
38+
39+
$dataset = Invoke-RestMethod -Method Get -Uri $uri -Headers $Headers -UseBasicParsing
40+
41+
$skip += $take
42+
43+
foreach ($record in $dataset.rows) { [void]$data.Value.add($record) }
44+
}
45+
Write-Verbose "Downloaded [$($data.Value.count)] records through get-connector [$connector]"
46+
}
47+
catch {
48+
$data.Value = $null
49+
50+
$ex = $PSItem
51+
$errorMessage = Get-ErrorMessage -ErrorObject $ex
52+
53+
Write-Verbose "Error at Line [$($ex.InvocationInfo.ScriptLineNumber)]: $($ex.InvocationInfo.Line). Error: $($errorMessage.VerboseErrorMessage)"
54+
55+
throw "Error querying data from [$uri]. Error Message: $($errorMessage.AuditErrorMessage)"
56+
}
57+
}
58+
59+
function Resolve-HTTPError {
60+
[CmdletBinding()]
61+
param (
62+
[Parameter(Mandatory,
63+
ValueFromPipeline
64+
)]
65+
[object]$ErrorObject
66+
)
67+
process {
68+
$httpErrorObj = [PSCustomObject]@{
69+
FullyQualifiedErrorId = $ErrorObject.FullyQualifiedErrorId
70+
MyCommand = $ErrorObject.InvocationInfo.MyCommand
71+
RequestUri = $ErrorObject.TargetObject.RequestUri
72+
ScriptStackTrace = $ErrorObject.ScriptStackTrace
73+
ErrorMessage = ''
74+
}
75+
if ($ErrorObject.Exception.GetType().FullName -eq 'Microsoft.PowerShell.Commands.HttpResponseException') {
76+
$httpErrorObj.ErrorMessage = $ErrorObject.ErrorDetails.Message
77+
}
78+
elseif ($ErrorObject.Exception.GetType().FullName -eq 'System.Net.WebException') {
79+
$httpErrorObj.ErrorMessage = [System.IO.StreamReader]::new($ErrorObject.Exception.Response.GetResponseStream()).ReadToEnd()
80+
}
81+
Write-Output $httpErrorObj
82+
}
83+
}
84+
85+
function Resolve-AFASErrorMessage {
86+
[CmdletBinding()]
87+
param (
88+
[Parameter(Mandatory,
89+
ValueFromPipeline
90+
)]
91+
[object]$ErrorObject
92+
)
93+
process {
94+
try {
95+
$errorObjectConverted = $ErrorObject | ConvertFrom-Json -ErrorAction Stop
96+
97+
if ($null -ne $errorObjectConverted.externalMessage) {
98+
$errorMessage = $errorObjectConverted.externalMessage
99+
}
100+
else {
101+
$errorMessage = $errorObjectConverted
102+
}
103+
}
104+
catch {
105+
$errorMessage = "$($ErrorObject.Exception.Message)"
106+
}
107+
108+
Write-Output $errorMessage
109+
}
110+
}
111+
112+
function Get-ErrorMessage {
113+
[CmdletBinding()]
114+
param (
115+
[Parameter(Mandatory,
116+
ValueFromPipeline
117+
)]
118+
[object]$ErrorObject
119+
)
120+
process {
121+
$errorMessage = [PSCustomObject]@{
122+
VerboseErrorMessage = $null
123+
AuditErrorMessage = $null
124+
}
125+
126+
if ( $($ErrorObject.Exception.GetType().FullName -eq 'Microsoft.PowerShell.Commands.HttpResponseException') -or $($ErrorObject.Exception.GetType().FullName -eq 'System.Net.WebException')) {
127+
$httpErrorObject = Resolve-HTTPError -ErrorObject $ErrorObject
128+
129+
if (-not[String]::IsNullOrEmpty($httpErrorObject.ErrorMessage)) {
130+
$errorMessage.VerboseErrorMessage = $httpErrorObject.ErrorMessage
131+
$errorMessage.AuditErrorMessage = Resolve-AFASErrorMessage -ErrorObject $httpErrorObject.ErrorMessage
132+
}
133+
else {
134+
$errorMessage.VerboseErrorMessage = $ErrorObject.Exception.Message
135+
$errorMessage.AuditErrorMessage = $ErrorObject.Exception.Message
136+
}
137+
}
138+
139+
# If error message empty, fall back on $ex.Exception.Message
140+
if ([String]::IsNullOrEmpty($errorMessage.VerboseErrorMessage)) {
141+
$errorMessage.VerboseErrorMessage = $ErrorObject.Exception.Message
142+
}
143+
if ([String]::IsNullOrEmpty($errorMessage.AuditErrorMessage)) {
144+
$errorMessage.AuditErrorMessage = $ErrorObject.Exception.Message
145+
}
146+
147+
Write-Output $errorMessage
148+
}
149+
}
150+
#endregion functions
151+
152+
try {
153+
Write-Information 'Starting AFAS Employees account entitlement import'
154+
155+
#Query persons / accounts
156+
$importedAccounts = [System.Collections.ArrayList]::new()
157+
158+
#Filter - Determine what defines an account entitlement, copy from AFAS Connect cURL
159+
$Filter = "filterfieldids=Email_werk&filtervalues=%5Bis%20niet%20leeg%5D&operatortypes=9"
160+
161+
Get-AFASConnectorData -Token $($actionContext.Configuration.Token) -BaseUri $($actionContext.Configuration.BaseUri) -Connector $($actionContext.Configuration.GetConnector) -OrderByFieldIds "Medewerker" ([ref]$importedAccounts) -Filter $Filter
162+
163+
foreach ($importedAccount in $importedAccounts) {
164+
$data = @{}
165+
166+
$importedAccount | Add-Member -MemberType NoteProperty -Name "EmAd" -Value $($importedAccount.Email_werk) -Force
167+
168+
foreach ($field in $actionContext.ImportFields) {
169+
$data[$field] = $importedAccount."$field"
170+
}
171+
172+
# Return the result
173+
Write-Output @{
174+
AccountReference = $importedAccount.Medewerker
175+
DisplayName = $importedAccount.DisplayName
176+
UserName = $importedAccount.Email_werk
177+
Enabled = $false
178+
Data = $data
179+
}
180+
}
181+
182+
Write-Information 'AFAS Employees account entitlement import completed'
183+
} catch {
184+
$ex = $PSItem
185+
$errorMessage = Get-ErrorMessage -ErrorObject $ex
186+
187+
Write-Warning "Error at Line [$($ex.InvocationInfo.ScriptLineNumber)]: $($ex.InvocationInfo.Line). Error: $($errorMessage.VerboseErrorMessage)"
188+
Write-Error "Could not import AFAS Employees account entitlements. Error: $($errorMessage.VerboseErrorMessage)"
189+
}

0 commit comments

Comments
 (0)