Skip to content

Commit

Permalink
LP-958: Add apis for any document, bank statements and tags
Browse files Browse the repository at this point in the history
  • Loading branch information
Douglas Poveda committed Oct 2, 2024
1 parent 18bada5 commit 0e90e27
Show file tree
Hide file tree
Showing 18 changed files with 2,138 additions and 28 deletions.
11 changes: 11 additions & 0 deletions Package.swift
Original file line number Diff line number Diff line change
Expand Up @@ -28,10 +28,21 @@ let package = Package(
dependencies: ["VeryfiSDK"],
resources: [
.copy("Resources/receipt.jpeg"),
.copy("Resources/driver_license.png"),
.copy("Resources/bankstatement.pdf"),
.copy("Resources/deleteDocument.json"),
.copy("Resources/getDocument.json"),
.copy("Resources/getDocuments.json"),
.copy("Resources/processDocument.json"),
.copy("Resources/getAnyDocument.json"),
.copy("Resources/getAnyDocuments.json"),
.copy("Resources/processAnyDocument.json"),
.copy("Resources/getBankStatement.json"),
.copy("Resources/getBankStatements.json"),
.copy("Resources/processBankStatement.json"),
.copy("Resources/addTag.json"),
.copy("Resources/addTags.json"),
.copy("Resources/deleteTags.json"),
.copy("Resources/updateDocument.json"),
.copy("Resources/addLineItem.json"),
.copy("Resources/deleteDocumentLineItems.json"),
Expand Down
176 changes: 176 additions & 0 deletions Sources/VeryfiSDK/Client.swift
Original file line number Diff line number Diff line change
Expand Up @@ -106,6 +106,182 @@ public class Client: NetworkManager {
self.request(method: .POST, route: .documents, body: jsonData, completion: completion)
}

/// Get all any documents from Veryfi inbox.
/// - Parameters:
/// - queryItems: Query items to apply to the get request.
/// - completion: Block executed after request.
/// - detail: Response from server.
/// - error: Error from server.
public func getAnyDocuments(queryItems: [URLQueryItem]? = nil, withCompletion completion: @escaping (Result<Data, APIError>) -> Void) {
self.request(method: .GET, route: .anyDocuments, queryItems: queryItems, completion: completion)
}

/// Get single any document by ID from Veryfi inbox.
/// - Parameters:
/// - documentId: ID of document to retreive
/// - completion: Block executed after request.
/// - detail: Response from server.
/// - error: Error from server.
public func getAnyDocument(documentId: String, withCompletion completion: @escaping (Result<Data, APIError>) -> Void) {
self.request(method: .GET, route: .anyDocuments, queryItem: documentId, completion: completion)
}

/// Upload any document for the Veryfi API to process.
/// - Parameters:
/// - fileName: Name of the file to upload to the Veryfi API.
/// - fileData: UTF8 encoded file data
/// - categories: List of document categories.
/// - deleteAfterProcessing: Do not store file in Veryfi's inbox.
/// - params: Additional parameters.
/// - completion: Function called after request completes.
/// - detail: Response from server.
/// - error: Error from server.
public func processAnyDocument(fileName: String,
fileData: Data,
params: [String: Any]? = nil,
templateName: String,
withCompletion completion: @escaping (Result<Data, APIError>) -> Void) {
var requestParams = params ?? [String: Any]()
requestParams["file_data"] = fileData.base64EncodedString()
requestParams["file_name"] = fileName
requestParams["template_name"] = templateName

guard let jsonData = try? JSONSerialization.data(withJSONObject: requestParams, options: .prettyPrinted) else {
completion(.failure(.parsingError))
return
}

self.request(method: .POST, route: .anyDocuments, uploadData: jsonData, completion: completion)
}

/// Upload any document to Veryfi API with URL.
/// - Parameters:
/// - fileUrl: Publicly available URL.
/// - fileUrls: List of publicly available URLs.
/// - categories: List of document categories.
/// - deleteAfterProcessing: Do not store file in Veryfi's inbox.
/// - boostMode: Skip data enrichment but process document faster.
/// - externalId: Existing ID to assign to document.
/// - maxPagesToProcess: Number of pages to process.
/// - completion: Block executed after request.
/// - detail: Response from server.
/// - error: Error from server.
public func processAnyDocumentURL(fileUrl: String? = nil,
fileUrls: [String]? = nil,
categories: [String]? = nil,
deleteAfterProcessing: Bool = false,
boostMode: Int = 0,
externalId: String? = nil,
maxPagesToProcess: Int? = 1,
templateName: String,
withCompletion completion: @escaping (Result<Data, APIError>) -> Void) {
let params: [String: Any] = ["file_url": fileUrl as Any, //implicit coerce
"file_urls": fileUrls as Any, //implicit coerce
"template_name": templateName,
"max_pages_to_process": maxPagesToProcess as Any] //implicit coerce
let jsonData = try? JSONSerialization.data(withJSONObject: params)
self.request(method: .POST, route: .anyDocuments, body: jsonData, completion: completion)
}

/// Get all bank statements from Veryfi inbox.
/// - Parameters:
/// - queryItems: Query items to apply to the get request.
/// - completion: Block executed after request.
/// - detail: Response from server.
/// - error: Error from server.
public func getBankStatements(queryItems: [URLQueryItem]? = nil, withCompletion completion: @escaping (Result<Data, APIError>) -> Void) {
self.request(method: .GET, route: .bankStatements, queryItems: queryItems, completion: completion)
}

/// Get single bank statements by ID from Veryfi inbox.
/// - Parameters:
/// - documentId: ID of document to retreive
/// - completion: Block executed after request.
/// - detail: Response from server.
/// - error: Error from server.
public func getBankStatement(id: String, queryItems: [URLQueryItem]? = nil, withCompletion completion: @escaping (Result<Data, APIError>) -> Void) {
self.request(method: .GET, route: .bankStatements, queryItems: queryItems, queryItem: id, completion: completion)
}

/// Upload a bank statement for the Veryfi API to process.
/// - Parameters:
/// - fileName: Name of the file to upload to the Veryfi API.
/// - fileData: UTF8 encoded file data
/// - categories: List of document categories.
/// - deleteAfterProcessing: Do not store file in Veryfi's inbox.
/// - params: Additional parameters.
/// - completion: Function called after request completes.
/// - detail: Response from server.
/// - error: Error from server.
public func processBankStatement(fileName: String,
fileData: Data,
params: [String: Any]? = nil,
confidenceDetails: Bool = false,
withCompletion completion: @escaping (Result<Data, APIError>) -> Void) {
var requestParams = params ?? [String: Any]()
requestParams["confidence_details"] = confidenceDetails
requestParams["file_data"] = fileData.base64EncodedString()
requestParams["file_name"] = fileName

guard let jsonData = try? JSONSerialization.data(withJSONObject: requestParams, options: .prettyPrinted) else {
completion(.failure(.parsingError))
return
}

self.request(method: .POST, route: .bankStatements, uploadData: jsonData, completion: completion)
}

/// Upload bank statement to Veryfi API with URL.
/// - Parameters:
/// - fileUrl: Publicly available URL.
/// - fileUrls: List of publicly available URLs.
/// - categories: List of document categories.
/// - deleteAfterProcessing: Do not store file in Veryfi's inbox.
/// - boostMode: Skip data enrichment but process document faster.
/// - externalId: Existing ID to assign to document.
/// - maxPagesToProcess: Number of pages to process.
/// - completion: Block executed after request.
/// - detail: Response from server.
/// - error: Error from server.
public func processBankStatementURL(fileUrl: String? = nil,
fileUrls: [String]? = nil,
boundingBoxes: Bool = false,
confidenceDetails: Bool = false,
withCompletion completion: @escaping (Result<Data, APIError>) -> Void) {
let params: [String: Any] = [
"bounding_boxes": boundingBoxes,
"confidence_details": confidenceDetails,
"file_url": fileUrl as Any, //implicit coerce
"file_urls": fileUrls as Any, //implicit coerce
] //implicit coerce
let jsonData = try? JSONSerialization.data(withJSONObject: params)
self.request(method: .POST, route: .bankStatements, body: jsonData, completion: completion)
}

/// Add tag to document.
/// - Parameters:
/// - documentId: ID of document to add tag.
/// - params: Tag data.
/// - completion: Block executed after request.
/// - detail: Response from server.
/// - error: Error from server.
public func addTag(documentId: String, params: AddTag, withCompletion completion: @escaping (Result<Data, APIError>) -> Void) {
let jsonData = try? JSONSerialization.data(withJSONObject: params.dictionary)
self.request(method: .PUT, route: .documents, body: jsonData, queryItem: String(format: "%@/tags", documentId), completion: completion)
}

/// Add multiple tags in document.
/// - Parameters:
/// - documentId: ID of document to replace tags.
/// - params: Tags data.
/// - completion: Block executed after request.
/// - detail: Response from server.
/// - error: Error from server.
public func addTags(documentId: String, params: AddTags, withCompletion completion: @escaping (Result<Data, APIError>) -> Void) {
let jsonData = try? JSONSerialization.data(withJSONObject: params.dictionary)
self.request(method: .POST, route: .documents, body: jsonData, queryItem: String(format: "%@/tags", documentId), completion: completion)
}

/// Update information of document in Veryfi inbox.
/// - Parameters:
/// - documentId: ID of document to modify.
Expand Down
15 changes: 15 additions & 0 deletions Sources/VeryfiSDK/Models/AddTag.swift
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
//
// File.swift
//
//
// Created by Veryfi on 28/09/24.
//

import Foundation

public class AddTag: Encodable {
var name: String
init(name: String) {
self.name = name
}
}
15 changes: 15 additions & 0 deletions Sources/VeryfiSDK/Models/AddTags.swift
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
//
// File.swift
//
//
// Created by Veryfi on 28/09/24.
//

import Foundation

public class AddTags: Encodable {
var tags: [String]
init(tags: [String]) {
self.tags = tags
}
}
2 changes: 2 additions & 0 deletions Sources/VeryfiSDK/NetworkManager.swift
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,8 @@ enum Method: String {

enum Endpoint: String {
case documents = "/partner/documents/"
case anyDocuments = "/partner/any-documents/"
case bankStatements = "/partner/bank-statements/"
}

public class NetworkManager {
Expand Down
12 changes: 11 additions & 1 deletion Tests/Main.swift
Original file line number Diff line number Diff line change
Expand Up @@ -12,8 +12,18 @@ extension VeryfiSDKTests {
("testGetDocuments", testGetDocuments),
("testGetDocument", testGetDocument),
("testProcessDocument", testProcessDocument),
("testUpdateDocument", testUpdateDocument),
("testProcessDocumentURL", testProcessDocumentURL),
("testGetAnyDocuments", testGetAnyDocuments),
("testGetAnyDocument", testGetAnyDocument),
("testProcessAnyDocument", testProcessAnyDocument),
("testProcessAnyDocumentURL", testProcessAnyDocumentURL),
("testGetBankStatements", testGetBankStatements),
("testGetBankStatement", testGetBankStatement),
("testProcessBankStatement" testProcessBankStatement),
("testProcessBankStatementURL", testProcessBankStatementURL),
("testAddTag", testAddTag),
("testAddTags", testAddTags),
("testUpdateDocument", testUpdateDocument),
("testDeleteDocument", testDeleteDocument),
("testGetDocumentLineItems", testGetDocumentLineItems)
("testGetLineItem", testGetLineItem)
Expand Down
4 changes: 4 additions & 0 deletions Tests/VeryfiSDKTests/Resources/addTag.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
{
"id": 6673475,
"name": "TEST_TAG"
}
12 changes: 12 additions & 0 deletions Tests/VeryfiSDKTests/Resources/addTags.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
{
"tags": [
{
"id": 6862358,
"name": "TAG_1"
},
{
"id": 6862359,
"name": "TAG_2"
}
]
}
Binary file added Tests/VeryfiSDKTests/Resources/bankstatement.pdf
Binary file not shown.
22 changes: 22 additions & 0 deletions Tests/VeryfiSDKTests/Resources/deleteTags.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
{
"date": "",
"description": "TEST",
"discount": 0.0,
"discount_rate": 0.0,
"end_date": "",
"full_description": "",
"hsn": "",
"id": 189951682,
"order": 20,
"price": 0.0,
"quantity": 1.0,
"section": "",
"sku": "aqw",
"start_date": "",
"tax": 0.0,
"total": 20.1,
"type": "",
"unit_of_measure": "",
"upc": null,
"weight": ""
}
Binary file added Tests/VeryfiSDKTests/Resources/driver_license.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
23 changes: 23 additions & 0 deletions Tests/VeryfiSDKTests/Resources/getAnyDocument.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
{
"pdf_url": "https://scdn.veryfi.com/other-documents/919ba4778c039560/b010fad9-3b75-4f74-b93e-8fb1af636e78/f0f5244e-6bcd-43d6-8e78-f3b7a2c01bfe.pdf?Expires=1727834317&Signature=XFxyS9P~6ASOkU32PxRAgdYj86oAmGBToQ283yxTaenBKzjZMhwshGauxR6YbWdCw-elTAPBs6Kt~mEWF7BVVBFbFymvztwchsgCQX4bDQxwusv2xJaqMX1A8y-0ALTQ2tt-i7zBKZi4BCkQ35VYyhUf4jVnZaXQOxPfrKh-l0iG5XJHusbdnbZugIAipKeVSA7bYVKIH21Ss0Ebl0axeF0vd3gaV9SymRq7KNEgAFoEioxHDysKMS~TZl7QVkD8eI2NXWlXgq6iZ1Vl5Az80Qyd4CYQEf4c-d2P2RpuSfp5TEz5PXGzPVZ97Karserai8OKzzQl2khlYen26NAsMQ__&Key-Pair-Id=APKAJCILBXEJFZF4DCHQ",
"id": 4560114,
"external_id": null,
"created_date": "2024-09-24 20:35:01",
"updated_date": "2024-09-24 20:35:01",
"img_thumbnail_url": "https://scdn.veryfi.com/other-documents/919ba4778c039560/b010fad9-3b75-4f74-b93e-8fb1af636e78/thumbnail.png?Expires=1727834317&Signature=MKXx~vhDHbU5QWVb5q9qqeMNPtC-LdVVOr43Np7eJ1vDY~BHQZLz6m6qmkh~z80ii90EV2mQq17R13hfI8AySQ~WrpN-Ho4XI9KJpZ-PH5Vbmdi0mZ~Ii1yR-jJJ02JpTu4TQZlYVFs8DeXI2Yrr8X6Rsic9WsWBSOKnpTyyXDakZYgd2-ON4dG88NN4FvKiwGdVTn0O5XtA2pff1tvbI8Z7h3cYPRZ5dEYtrdut~ezpX798GFYD1dMe2a~9DtCj6hWHAB1ZAW253c2asBi0HuAaWNy1J8G02-gnqNc5hwBHZ0E3ze7Q0ewtJR0lZ5JieWYfco6Hjek70QCL6x4teQ__&Key-Pair-Id=APKAJCILBXEJFZF4DCHQ",
"blueprint_name": "us_driver_license",
"template_name": "us_driver_license",
"address": "892 MOMONA ST HONOLULU, HI 96820",
"birth_date": "1981-06-03",
"expiration_date": "2008-06-03",
"eyes_color": "BRO",
"first_name": null,
"height": "5-10",
"issue_date": "1998-06-18",
"last_name": "McLovin",
"license_class": "3",
"license_number": "01-47-87441",
"sex": "M",
"state": "HAWAII",
"weight": "150"
}
Loading

0 comments on commit 0e90e27

Please sign in to comment.