-
Notifications
You must be signed in to change notification settings - Fork 26
Expand file tree
/
Copy pathIDXRemediation+Extensions.swift
More file actions
105 lines (92 loc) · 3.29 KB
/
Copy pathIDXRemediation+Extensions.swift
File metadata and controls
105 lines (92 loc) · 3.29 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
//
// Copyright (c) 2021-Present, Okta, Inc. and/or its affiliates. All rights reserved.
// The Okta software accompanied by this notice is provided pursuant to the Apache License, Version 2.0 (the "License.")
//
// You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0.
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
//
// See the License for the specific language governing permissions and limitations under the License.
//
import Foundation
import AuthFoundation
#if !COCOAPODS
import JSON
#endif
extension Remediation {
func apiRequest() throws -> InteractionCodeFlow.RemediationRequest {
// Inform any capabilities associated with this remediation that it will proceed.
authenticators
.allAuthenticators
.compactMap { $0.capabilities }
.flatMap { $0 }
.forEach { $0.willProceed(to: self) }
return try InteractionCodeFlow.RemediationRequest(remediation: self)
}
}
extension Remediation.Form {
var formValue: JSON {
get throws {
var json = JSON([:])
for field in allFields {
guard let value = try field.formValue
else {
continue
}
json.value += value
}
return json
}
}
}
extension Remediation.Form.Field {
// swiftlint:disable cyclomatic_complexity
var formValue: JSON.Value? {
get throws {
// Unnamed FormValues, which may contain nested options
guard let name = name
else {
if let form = self.form,
!form.allFields.isEmpty
{
return try form.formValue.value
} else {
return value?.jsonValue
}
}
var json = JSON([:])
// Named FormValues with nested forms
if let form = self.form,
!form.allFields.isEmpty
{
var nestedJSON = JSON([:])
for field in form.allFields {
guard let nestedResult = try field.formValue else {
continue
}
nestedJSON.value += nestedResult
}
json[name] = nestedJSON.value
}
// Named form values that consist of multiple child options
else if let selectedOption = selectedOption {
if type == "object" {
json[name] = try selectedOption.formValue
} else {
json[name] = selectedOption.value?.jsonValue
}
}
// Other..
else {
// lots 'o stuff here
json[name] = value?.jsonValue
}
if isRequired && json[name] == nil {
throw InteractionCodeFlowError.missingRequiredParameter(name: name)
}
return json.value
}
}
// swiftlint:enable cyclomatic_complexity
}