Release/26.7.2 - #318
Conversation
…y-i-os-sdk SK-3005 flow db feature parity i os sdk
|
🔐 Gitleaks Findings: 20 issue(s) detected 🔸 Rule: 🔸 Rule: 🔸 Rule: 🔸 Rule: 🔸 Rule: 🔸 Rule: 🔸 Rule: 🔸 Rule: 🔸 Rule: 🔸 Rule: ...and more. Only showing first 10 findings. |
There was a problem hiding this comment.
Pull request overview
This PR updates the Skyflow iOS SDK to a FlowDB v2-oriented API shape by adding typed response wrappers/callbacks, supporting token-group redactions and typed upsert/additionalFields options, and expanding/adjusting tests and samples accordingly.
Changes:
- Introduces typed response wrappers (
CollectResponse,RevealResponse) and typed callbacks (CollectCallback,RevealCallback), plus request-level token-group redactions for detokenize. - Adds FlowVault v2 request/response plumbing for insert/collect/detokenize (new request body builders + v2 callbacks) and typed upsert/additionalFields models.
- Updates/extends unit tests and sample apps; removes the
GetSamplesample project and AEXML references in several Podfiles.
Reviewed changes
Copilot reviewed 96 out of 101 changed files in this pull request and generated 5 comments.
Show a summary per file
| File | Description |
|---|---|
| Tests/skyflow-iOS-utilTests/skyflow_iOS_utilTests.swift | Adds/updates request-body/upsert validation tests (v2 + dormant v1 helpers). |
| Tests/skyflow-iOS-utilTests/skyflow_iOS_revealApiCallbackTests.swift | Adds unit tests for dormant v1 RevealAPICallback. |
| Tests/skyflow-iOS-utilTests/skyflow_iOS_insertUtilTests 2.swift | Updates insert util tests to FlowVault v2 callback/response shapes. |
| Tests/skyflow-iOS-utilTests/skyflow_iOS_dormantCollectRequestBodyTests.swift | Adds unit tests for dormant v1 CollectRequestBody. |
| Tests/skyflow-iOS-utilTests/skyflow_iOS_dormantCollectApiCallbackTests.swift | Adds unit tests for dormant v1 collect/insert callbacks. |
| Tests/skyflow-iOS-utilTests/MockURLProtocol.swift | Adds URLProtocol-based network mock for tests. |
| Tests/skyflow-iOS-utilTests/DemoImpl.swift | Updates demo callback to capture typed Collect/Reveal responses + adapters. |
| Tests/skyflow-iOS-scenarioTests/DemoImpl.swift | Removes unused XML/AEXML-related state from scenario callback. |
| Tests/skyflow-iOS-scenarioTests/ClientScenario.swift | Whitespace-only adjustment. |
| Tests/skyflow-iOS-revealTests/skyflow_iOS_revealTests.swift | Updates reveal tests for new redaction semantics + typed callback usage. |
| Tests/skyflow-iOS-revealTests/DemoImpl.swift | Updates demo callback to capture typed Collect/Reveal responses + adapters. |
| Tests/skyflow-iOS-getTests/skyflow_iOS_getTests.swift | Adds empty-vaultURL failure-path test for get. |
| Tests/skyflow-iOS-getByIdTests/skyflow_iOS_getByIdTests.swift | Adds empty-vaultURL failure-path test for getById. |
| Tests/skyflow-iOS-errorTests/Skyflow_iOS_revealErrorTests.swift | Updates reveal error tests for new reveal input/ callback behavior. |
| Tests/skyflow-iOS-errorTests/Skyflow_iOS_generalErrorTests.swift | Adds tests for SkyflowError.wrap + API error parsing behavior. |
| Tests/skyflow-iOS-errorTests/DemoImpl.swift | Updates demo callback to capture typed Collect/Reveal responses + adapters. |
| Tests/skyflow-iOS-elementTests/skyflow_iOS_elementTests.swift | Updates reveal element input initialization (no per-element redaction). |
| Tests/skyflow-iOS-composableTests/skyflow_iOS_composableEelementsTests.swift | Updates composable upsert tests to new typed UpsertOption. |
| Tests/skyflow-iOS-collectTests/skyflow_iOS_collectTests.swift | Updates collect tests for typed callbacks/options and FlowVault v2 request body. |
| Tests/skyflow-iOS-collectTests/DemoImpl.swift | Updates demo callback to capture typed Collect/Reveal responses + adapters. |
| Sources/Skyflow/Version.swift | Bumps SDK version string to dev hash suffix. |
| Sources/Skyflow/skyflow_iOS.swift | Removes unused placeholder file. |
| Sources/Skyflow/reveal/TokenGroupRedaction.swift | Adds public model for request-level token-group redactions. |
| Sources/Skyflow/reveal/RevealValueCallback.swift | Changes reveal merge behavior to surface per-token failures alongside records. |
| Sources/Skyflow/reveal/RevealResponse.swift | Adds typed reveal response + typed RevealCallback. |
| Sources/Skyflow/reveal/RevealRequestRecord.swift | Removes per-record redaction from internal detokenize record model. |
| Sources/Skyflow/reveal/RevealRequestBody.swift | Removes per-element redaction field from reveal request payload. |
| Sources/Skyflow/reveal/RevealOptions.swift | Adds optional tokenGroupRedactions to reveal options. |
| Sources/Skyflow/reveal/RevealElementInput.swift | Removes per-element redaction from public reveal element input API. |
| Sources/Skyflow/reveal/RevealContainer.swift | Updates reveal container API to use typed callback and pass token-group redactions. |
| Sources/Skyflow/reveal/RevealApiCallback.swift | Updates dormant v1 reveal callback to fixed PLAIN_TEXT redaction. |
| Sources/Skyflow/reveal/FlowVaultRevealApiCallback.swift | Adds FlowVault v2 detokenize callback implementation. |
| Sources/Skyflow/reveal/FlowVaultDetokenizeRequestBody.swift | Adds FlowVault v2 detokenize request body builder. |
| Sources/Skyflow/errors/ErrorCodes.swift | Adds SkyflowError normalization/wrapping improvements + new upsert error. |
| Sources/Skyflow/elements/SkyflowElement.swift | Renames skyflowID to skyflowId on elements. |
| Sources/Skyflow/elements/core/CollectElementInput.swift | Renames skyflowID to skyflowId in collect element input initializers. |
| Sources/Skyflow/core/Message.swift | Whitespace-only adjustment. |
| Sources/Skyflow/core/InterfaceName.swift | Whitespace-only adjustment. |
| Sources/Skyflow/core/Client.swift | Normalizes vaultURL base + routes insert/detokenize to FlowVault v2 plumbing. |
| Sources/Skyflow/core/APIClient.swift | Switches to FlowVault v2 callbacks for insert/collect/detokenize; adjusts URLs. |
| Sources/Skyflow/composable/ComposableContainer.swift | Updates additionalFields validation to typed model + FlowVault v2 request body. |
| Sources/Skyflow/collect/UpsertOption.swift | Adds typed upsert model (UpsertOption, UpdateType). |
| Sources/Skyflow/collect/InsertOptions.swift | Replaces untyped upsert dicts with typed upsert options. |
| Sources/Skyflow/collect/FlowVaultUpdateRequestBody.swift | Adds FlowVault v2 update request body builder. |
| Sources/Skyflow/collect/FlowVaultInsertRequestBody.swift | Adds FlowVault v2 insert request body builder (data/tableName/upsert). |
| Sources/Skyflow/collect/FlowVaultInsertAPICallback.swift | Adds FlowVault v2 insert callback incl. insert+update merge behavior. |
| Sources/Skyflow/collect/FlowVaultICOptions.swift | Adds internal typed IC options + typed upsert validation. |
| Sources/Skyflow/collect/FlowVaultCollectRequestBody.swift | Adds FlowVault v2 collect request body builder (insert + update payload). |
| Sources/Skyflow/collect/FlowVaultCollectAPICallback.swift | Adds FlowVault v2 collect callback incl. insert+update merge behavior. |
| Sources/Skyflow/collect/CollectResponse.swift | Adds typed collect response + typed CollectCallback. |
| Sources/Skyflow/collect/CollectRequestBody.swift | Updates dormant v1 request-body handling to use skyflowId naming. |
| Sources/Skyflow/collect/CollectOptions.swift | Replaces untyped additionalFields/upsert dicts with typed models. |
| Sources/Skyflow/collect/CollectContainer.swift | Updates collect container API to typed callback + typed additionalFields/upsert. |
| Sources/Skyflow/collect/AdditionalFields.swift | Adds typed additionalFields model. |
| Skyflow.podspec | Updates podspec version/source to dev hash/commit pin. |
| Samples/Validations/Podfile | Removes AEXML dependency; bumps Skyflow version constraint. |
| Samples/UpsertFeature/UpsertFeature/ViewController.swift | Updates sample to typed callbacks/responses + token-group redactions + typed upsert. |
| Samples/UpsertFeature/UpsertFeature/ResponseStructs.swift | Removes local response structs (now uses SDK typed responses). |
| Samples/UpsertFeature/UpsertFeature.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved | Removes AEXML pin. |
| Samples/UpdateDataUsingElements/UpdateDataUsingElements/ViewController.swift | Updates sample to typed callbacks/responses + skyflowId rename. |
| Samples/UpdateDataUsingElements/UpdateDataUsingElements/ResponseStructs.swift | Removes local response structs (now uses SDK typed responses). |
| Samples/UpdateDataUsingElements/UpdateDataUsingElements/ExampleAPICallback.swift | Removes custom callback (now uses SDK typed callbacks). |
| Samples/UpdateDataUsingElements/Podfile | Removes AEXML dependency; loosens Skyflow constraint. |
| Samples/InputFormatting/Podfile.lock | Removes AEXML entries from lockfile. |
| Samples/InputFormatting/Podfile | Removes AEXML dependency; bumps Skyflow version constraint. |
| Samples/InputFormatting/InputFormatting/ViewController.swift | Updates sample to typed callbacks/responses. |
| Samples/InputFormatting/InputFormatting/ResponseStructs.swift | Removes local response structs (now uses SDK typed responses). |
| Samples/InputFormatting/InputFormatting/ExampleAPICallback.swift | Removes custom callback (now uses SDK typed callbacks). |
| Samples/GetSample/Podfile | Deletes GetSample Podfile (sample removed). |
| Samples/GetSample/GetSampleUITests/GetSampleUITestsLaunchTests.swift | Deletes GetSample UI test (sample removed). |
| Samples/GetSample/GetSampleUITests/GetSampleUITests.swift | Deletes GetSample UI test (sample removed). |
| Samples/GetSample/GetSampleTests/GetSampleTests.swift | Deletes GetSample unit test (sample removed). |
| Samples/GetSample/GetSample/ViewController.swift | Deletes GetSample view controller (sample removed). |
| Samples/GetSample/GetSample/SceneDelegate.swift | Deletes GetSample scene delegate (sample removed). |
| Samples/GetSample/GetSample/ResponseStructs.swift | Deletes GetSample response structs (sample removed). |
| Samples/GetSample/GetSample/Info.plist | Deletes GetSample plist (sample removed). |
| Samples/GetSample/GetSample/ExampleTokenProvider.swift | Deletes GetSample token provider (sample removed). |
| Samples/GetSample/GetSample/ExampleAPICallback.swift | Deletes GetSample callback (sample removed). |
| Samples/GetSample/GetSample/Base.lproj/Main.storyboard | Deletes GetSample storyboard (sample removed). |
| Samples/GetSample/GetSample/Base.lproj/LaunchScreen.storyboard | Deletes GetSample launch screen (sample removed). |
| Samples/GetSample/GetSample/Assets.xcassets/Contents.json | Deletes GetSample assets (sample removed). |
| Samples/GetSample/GetSample/Assets.xcassets/AppIcon.appiconset/Contents.json | Deletes GetSample app icon set (sample removed). |
| Samples/GetSample/GetSample/Assets.xcassets/AccentColor.colorset/Contents.json | Deletes GetSample accent color set (sample removed). |
| Samples/GetSample/GetSample/AppDelegate.swift | Deletes GetSample app delegate (sample removed). |
| Samples/GetSample/GetSample.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved | Deletes GetSample SPM resolution (sample removed). |
| Samples/GetSample/GetSample.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist | Deletes GetSample workspace checks (sample removed). |
| Samples/GetSample/GetSample.xcodeproj/project.xcworkspace/contents.xcworkspacedata | Deletes GetSample workspace data (sample removed). |
| Samples/ComposableElements/Podfile | Removes AEXML dependency; bumps Skyflow version constraint. |
| Samples/ComposableElements/ComposableElements/ViewController.swift | Updates sample to typed callbacks/responses + typed upsert/additionalFields + token-group redactions. |
| Samples/ComposableElements/ComposableElements/ResponseStructs.swift | Removes local response structs (now uses SDK typed responses). |
| Samples/ComposableElements/ComposableElements/ExampleAPICallback.swift | Removes custom callback (now uses SDK typed callbacks). |
| Samples/CollectAndRevealSample/Podfile | Removes AEXML dependency; bumps Skyflow version constraint. |
| Samples/CollectAndRevealSample/CollectAndRevealSample/ResponseStructs.swift | Removes local response structs (now uses SDK typed responses). |
| Samples/CollectAndRevealSample/CollectAndRevealSample/ExampleAPICallback.swift | Removes custom callback (now uses SDK typed callbacks). |
| Samples/CollectAndRevealSample/CollectAndRevealSample/CollectAndRevealViewController.swift | Updates sample to typed callbacks/responses + token-group redactions. |
| Samples/CollectAndRevealSample/CollectAndRevealSample.xcworkspace/xcshareddata/swiftpm/Package.resolved | Adds SPM resolution for Skyflow dependency. |
Files not reviewed (1)
- Samples/GetSample/GetSample.xcodeproj/project.xcworkspace/contents.xcworkspacedata: Generated file
Comments suppressed due to low confidence (5)
Sources/Skyflow/core/Client.swift:118
Client.detokenize(...)beinginternalmakes detokenization unavailable to SDK consumers (source-breaking change). If the intent is still to expose detokenize publicly, this should remainpublic(or keep a deprecated public overload).
Sources/Skyflow/core/Client.swift:173Client.getById(...)was madeinternal, which removes a previously public API surface for SDK consumers (source-breaking change). Consider keeping itpublic(or providing a deprecated public overload) to avoid breaking integrations.
Sources/Skyflow/core/Client.swift:256Client.get(...)was madeinternal, which removes a previously public API surface for SDK consumers (source-breaking change). Consider keeping itpublic(or providing a deprecated public overload) to avoid breaking integrations.
Sources/Skyflow/collect/FlowVaultInsertAPICallback.swift:91- Here
mergedErrorsstores{"error": String}for caught errors, but other error paths use the structured{"error": {"httpCode": Int, "message": String, ...}}shape. This inconsistency makes downstream error normalization (e.g.,SkyflowError.wrap) harder. Consider using the structured{"error": {"httpCode": 0, "message": ...}}shape (and applying the same change to the other similar append sites in this file).
Sources/Skyflow/collect/FlowVaultCollectAPICallback.swift:88 - Here
mergedErrorsstores{"error": String}for caught errors, but other error paths use the structured{"error": {"httpCode": Int, "message": String, ...}}shape. This inconsistency makes downstream error normalization (e.g.,SkyflowError.wrap) harder. Consider using the structured{"error": {"httpCode": 0, "message": ...}}shape (and applying the same change to the other similar append sites in this file).
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
| } | ||
|
|
||
| func collect(callback: Callback, options: CollectOptions? = CollectOptions()) where T: CollectContainer { | ||
| func collect(callback: CollectCallback, options: CollectOptions? = CollectOptions()) where T: CollectContainer { |
| } | ||
|
|
||
| func reveal(callback: Callback, options: RevealOptions? = RevealOptions()) where T: RevealContainer { | ||
| func reveal(callback: RevealCallback, options: RevealOptions? = RevealOptions()) where T: RevealContainer { |
| return | ||
| } | ||
|
|
||
| let group = DispatchGroup() | ||
| var mergedRecords: [[String: Any]] = [] | ||
| var mergedErrors: [[String: Any]] = [] | ||
|
|
|
|
||
| if hasInsert { | ||
| group.enter() | ||
| let url = URL(string: self.apiClient.vaultURL + "v2/records/insert")! | ||
| do { | ||
| let (request, session) = try self.getRequestSession(url: url) | ||
| let task = session.dataTask(with: request) { data, response, error in |
| } | ||
|
|
||
| public func insert(records: [String: Any], options: InsertOptions = InsertOptions(), callback: Callback) { | ||
| internal func insert(records: [String: Any], options: InsertOptions = InsertOptions(), callback: Callback) { |
This PR updates the Skyflow iOS SDK to a FlowDB v2-oriented API shape by adding typed response wrappers/callbacks, supporting token-group redactions and typed upsert/additionalFields options, and expanding/adjusting tests and samples accordingly.
Changes:
Introduces typed response wrappers (CollectResponse, RevealResponse) and typed callbacks (CollectCallback, RevealCallback), plus request-level token-group redactions for detokenize.
Adds FlowVault v2 request/response plumbing for insert/collect/detokenize (new request body builders + v2 callbacks) and typed upsert/additionalFields models.
Updates/extends unit tests and sample apps; removes the GetSample sample project and AEXML references in several Podfiles.