Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
160 commits
Select commit Hold shift + click to select a range
8076a71
Made ModelTests, ConfigTests, and ControllerTests targets dependencie…
calebkleveter Feb 15, 2019
c16ba26
swift package update
calebkleveter Feb 27, 2019
0d87b4a
Removed redundant MultipartData: MultipartDataConvertible conformance
calebkleveter Feb 27, 2019
c368437
Organized ModelTests files into sub-directories
calebkleveter Feb 28, 2019
70fbdc6
Made all test suites public
calebkleveter Feb 28, 2019
6f1596d
Marked access level of OrderTests.setUp method to 'public'
calebkleveter Feb 28, 2019
37a2090
Marked all test suite .allTests proeprties as public
calebkleveter Feb 28, 2019
3a67239
Documented GovernmentBody.init(name:) parameters
calebkleveter Mar 4, 2019
669209a
Changed Template.List.emails property type to a failable String array
calebkleveter Mar 4, 2019
1861444
Added missing validation to MerchantInfo properties
calebkleveter Mar 4, 2019
735dac7
Created MerchantInfoTests test suite
calebkleveter Mar 4, 2019
3290207
Added 'passing' comment to ControllerTests test suites that pass
calebkleveter Mar 4, 2019
a836528
Fix MerchantInfo initializer call in TemplatesTests test suite
calebkleveter Mar 4, 2019
a575511
Removed id check from ManagedAccountsTests.testCreateEndpoint test case
calebkleveter Mar 4, 2019
12b6a45
Moved BillingPlansTests endpoint test cases into .testEndpoints test …
calebkleveter Mar 4, 2019
36cb5b8
Added .firstName, .lastName, and .payment proeprties to CounterParty …
calebkleveter Mar 4, 2019
718068a
Removed use of ISO8601DateFormatter in DateFormatter.iso8601 implemen…
calebkleveter Mar 4, 2019
29749b6
Removed un-used test.pdf file
calebkleveter Mar 4, 2019
f683e8f
Changed TimelessDate encoding/decoding to use single value containers
calebkleveter Mar 5, 2019
15ace77
Added missing /customer path element to ManagedAccounts controller .p…
calebkleveter Mar 5, 2019
b22fec5
Created BusinessSalesTests test suite
calebkleveter Mar 5, 2019
57e8c65
PayPal expects Business.Sales.price and .volume currency keys to be '…
calebkleveter Mar 5, 2019
444e46a
Updated tests for handling of timeless and ISO8601 dates
calebkleveter Mar 5, 2019
92399d6
Remove padding 0 from currency values
calebkleveter Mar 5, 2019
482d2f5
Changed Business.disputeEmail property type from a nested email objec…
calebkleveter Mar 5, 2019
f7f3381
Updated call to Business initializer in ManagedAccountsTests.testCrea…
calebkleveter Mar 5, 2019
f42795d
Documented ISO8601 date code
calebkleveter Mar 5, 2019
e677ce0
Removed .container property from PayPalClient service
calebkleveter Mar 5, 2019
781cb26
Added .v2 case to Version enum
calebkleveter Mar 5, 2019
5408608
Added 'env' parameter to PayPalClient initializer
calebkleveter Mar 5, 2019
26aaacc
Created API class
calebkleveter Mar 5, 2019
48c447c
Documented API class
calebkleveter Mar 5, 2019
9c36b20
Created PayPalV1 and PayPalV2 targets
calebkleveter Mar 5, 2019
80af221
Documented PayPalClient.request(_:_:parameters:headers:auth:body:) me…
calebkleveter Mar 5, 2019
a3c6b90
Export PayPal module from PayPalV1 and PayPalV2 targets
calebkleveter Mar 5, 2019
cef327c
Documented V1 and V2 classes and API.v1 and .v2 properties
calebkleveter Mar 5, 2019
c27e97d
Created VersionedController protocol
calebkleveter Mar 5, 2019
79dd355
Created Payments controller class
calebkleveter Mar 5, 2019
2d0efef
Created V2.payments property
calebkleveter Mar 5, 2019
821a21a
Created Payments.Authorizations controller
calebkleveter Mar 6, 2019
25055d9
Changed PayPalClient generic method type conformance from <Body: Cont…
calebkleveter Mar 6, 2019
84e8570
Added .version property to PayPalClient class
calebkleveter Mar 6, 2019
21e34a7
Cache API URL in PayPalClient.root property
calebkleveter Mar 6, 2019
f46ebf1
Added .resource property and .path extension property to VersionedCon…
calebkleveter Mar 6, 2019
864aa3b
Assert correct client versions in V1 and V2 initializers
calebkleveter Mar 6, 2019
3a9cb07
Added 'version' parameter to API(client:environment:) initializer
calebkleveter Mar 6, 2019
9b1f62f
Fixed whitespacing in PayPalClient.send(_:_:parameters:headers:body:a…
calebkleveter Mar 19, 2019
1f49a97
Moved Payments.Authorizations controller to /Controllers/Payments/Aut…
calebkleveter Mar 19, 2019
4f61138
Created Authorization.Status enum
calebkleveter Mar 19, 2019
dd7a2d0
Added ModelVersions.md to .gitignore
calebkleveter Mar 19, 2019
6615673
Created SellerProtection.Status enum
calebkleveter Mar 19, 2019
962af48
Created SellerProtection.DisputeCategories enum
calebkleveter Mar 19, 2019
e6ee3fb
Created SellerProtection struct
calebkleveter Mar 19, 2019
4fd0cf6
Created Authorization struct
calebkleveter Mar 19, 2019
88b1d53
Documented Authorization initializer
calebkleveter Mar 27, 2019
16fa191
Update all dependencies to latest versions
calebkleveter Mar 28, 2019
25405bc
Created PayeeBase struct
calebkleveter Mar 28, 2019
4c4d966
Created PlatformFee struct
calebkleveter Mar 28, 2019
66f321a
Created PaymentInstruction struct
calebkleveter Mar 28, 2019
2d1f712
Created Authorization.Capture struct
calebkleveter Mar 28, 2019
c9df392
Created Authorization.StatusDetails enum
calebkleveter Mar 28, 2019
5ba0eea
Created ExchangeRate struct
calebkleveter Mar 28, 2019
bca1465
Created SellerReceivableBreakdown struct
calebkleveter Mar 28, 2019
75548be
Created Authorization.Captured struct
calebkleveter Mar 28, 2019
39be95b
Created Capture.Refund struct
calebkleveter Mar 28, 2019
03f15ba
Renamed Authorization.Status and .StatusDetails enums to PaymentStatu…
calebkleveter Mar 28, 2019
05f1d74
Changed Authorization.status type from Authorization.Status to Paymen…
calebkleveter Mar 28, 2019
8be0560
Chnaged Authorization.Captured type to Capture type
calebkleveter Mar 28, 2019
0719701
Conformed Capture struct to Codable protocol
calebkleveter Mar 28, 2019
94379e6
Created Capture.Refunded struct
calebkleveter Mar 28, 2019
841778f
Added doumentation for 'final', 'breakdown', and 'disbursement' param…
calebkleveter Mar 28, 2019
f7e5670
Changed Capture.Refunded struct to Refund struct
calebkleveter Mar 28, 2019
0d06ba2
Created Payments.Authorizations.get(_:) method
calebkleveter Mar 28, 2019
70bf391
Created Payments.Authorizations.ResponseReturn enum and .capture(_:ca…
calebkleveter Mar 28, 2019
ddada17
Created Payments.Authorizations.reauthorize(_:amount:prefer:requestID…
calebkleveter Mar 28, 2019
f3b61b1
Created Payments.Authorizations.void(_:) method.
calebkleveter Mar 28, 2019
acc903a
Created Payments.Captures controller
calebkleveter Mar 28, 2019
eef85ae
Created Payments.Captures.get(_:) method
calebkleveter Mar 28, 2019
4cae143
Created Payments.Captures.refund(_:refund:prefer:requestID:) method
calebkleveter Mar 28, 2019
08ec033
Created Payments.Refunds controller
calebkleveter Mar 28, 2019
a8fa52c
Created Payments.Refunds.get(_:) method
calebkleveter Mar 28, 2019
6f66084
Renamed ResponseReturn to PreferResponse
calebkleveter Mar 28, 2019
c4b6c7b
Created empty Order struct
calebkleveter Mar 28, 2019
0c80bcf
Created Order.Intent enum
calebkleveter Mar 28, 2019
0130d7f
Created Order.Status enum
calebkleveter Mar 28, 2019
df96f3e
Moved /Payment/PayeeBase.swift to /Payee directory
calebkleveter Mar 28, 2019
59fc004
Replaced Order.DisbursementMode with DisbursementMode enum
calebkleveter Mar 28, 2019
82aac76
Created Order.Item struct and Order.ItemCategory enum
calebkleveter Mar 29, 2019
d42dc27
Fixed Order.Item doc block
calebkleveter Mar 29, 2019
9d3d823
Created Payer.Name struct
calebkleveter Mar 29, 2019
34da953
Created Phone struct with validation types
calebkleveter Mar 29, 2019
8c8129b
Created PhoneType enum
calebkleveter Mar 29, 2019
d0c5237
Created TypedPhone struct
calebkleveter Mar 29, 2019
c1fcfee
Added doc block to TypedPhone struct signature
calebkleveter Mar 29, 2019
ad94a83
Added custom coding keys to Phone struct
calebkleveter Apr 1, 2019
9135145
Created TaxInfo struct and TaxType enum
calebkleveter Apr 1, 2019
d4956e9
Made TimelessDate date formatter thread safe by placing it in a Threa…
calebkleveter Apr 1, 2019
d0fa91d
Store Date in TimelessDate instead of TimeInterval
calebkleveter Apr 1, 2019
77337ed
Created Payer.Address struct
calebkleveter Apr 1, 2019
e445e2e
Renamed MerchantEmailValidation to EmailValidation and MerchantIDVali…
calebkleveter Apr 1, 2019
34c4a0c
Created Payer struct
calebkleveter Apr 1, 2019
a26155b
Changed Payer.Address struct to Address
calebkleveter Apr 1, 2019
ccee4e2
Created PurchaseUnit.Shipping struct
calebkleveter Apr 1, 2019
f0fb3b5
Created DetailedAmount struct
calebkleveter Apr 2, 2019
46111e1
Created PurchaseUnit struct
calebkleveter Apr 2, 2019
fb9a42f
Created PaymentMethod struct with PayerSelected and PayeePrefered sub…
calebkleveter Apr 2, 2019
fb8921e
Created AppContext struct
calebkleveter Apr 2, 2019
d1a7a82
Created Order struct
calebkleveter Apr 2, 2019
ed12295
Created Order.Request struct
calebkleveter Apr 2, 2019
3f264ea
Created YearMonthDate struct
calebkleveter Apr 2, 2019
fc3b3e0
Created PaymentSource.Card struct and .CardType enum
calebkleveter Apr 2, 2019
a024f65
Created PaymentSource.Token struct and .TokenType enum
calebkleveter Apr 3, 2019
b05bfa6
Created PaymentSource struct
calebkleveter Apr 3, 2019
2008840
Changed Order.Request access level to public
calebkleveter Apr 3, 2019
a2f76c6
Created Orders VersionedController class
calebkleveter Apr 3, 2019
7a7041e
Created Orders.create(order:attribution:prefer:) method
calebkleveter Apr 3, 2019
b6e06aa
Created Orders.update(order:with:) method
calebkleveter Apr 3, 2019
f0dc09b
Created Orders.get(order:) method
calebkleveter Apr 3, 2019
53386a4
Created Order.authorize(order:payment:request:prefer:clientMetadata:a…
calebkleveter Apr 3, 2019
2eb7e9d
Created Order.capture(order:payment:request:prefer:clientMetadata:aut…
calebkleveter Apr 3, 2019
b9e7347
Changed Order.created and .updated types from Date to ISO8601Date
calebkleveter Apr 3, 2019
749f9c0
Created EventType struct and .Version sub-struct and .Name sub-enum
calebkleveter Apr 4, 2019
1967834
Created Webhook struct
calebkleveter Apr 4, 2019
a954620
Created Webhook.AnchorType enum
calebkleveter Apr 4, 2019
1af80fc
Created Wwbhooks controller type
calebkleveter Apr 4, 2019
6ee8a9b
Created Webhooks.create(webhook:) method
calebkleveter Apr 4, 2019
33cb4ed
Created Webhooks.get(by:) method
calebkleveter Apr 4, 2019
030fe7b
Created Webhooks.delete(webhook:) methods
calebkleveter Apr 4, 2019
9df927a
Created Webhooks.update(webhook:with:) method
calebkleveter Apr 4, 2019
8c021d6
Created Webhooks.get(webhook:) method
calebkleveter Apr 4, 2019
2b062a7
Created Webhook.Signature struct with dependent types
calebkleveter Apr 4, 2019
53ca52a
Created Webhooks.verify(signature:) method
calebkleveter Apr 4, 2019
e7e305e
Renamed /Webhook/Verification.swift file to /Webhook/WebhookSignature…
calebkleveter Apr 4, 2019
c90d922
Moved Webhooks.verify(signature:) to Webhooks.Verification controller
calebkleveter Apr 4, 2019
512810d
Changed Webhooks.Verification.verify(signature:) 'signature' paramete…
calebkleveter Apr 4, 2019
0fb944e
Created Webhooks.EventTypes controller
calebkleveter Apr 4, 2019
9cd70cd
Created Webhooks.EventTypes.list() method
calebkleveter Apr 4, 2019
8f92c9d
Created Webhook.eventTypes(for:) method
calebkleveter Apr 4, 2019
a3398c4
Created Webhooks.Events controller
calebkleveter Apr 4, 2019
abbac32
Renamed Webhook.Signature.VerifiedEvent to Event
calebkleveter Apr 4, 2019
c4989fb
Created Event.List struct
calebkleveter Apr 4, 2019
6702d1e
Created Webhooks.Events.list(parameters:transaction:type:) method
calebkleveter Apr 4, 2019
8afbe1f
Created Webhook.Events.get(event:) method
calebkleveter Apr 4, 2019
e2e2535
Created Webhooks.Events.resend(event:ids:) method
calebkleveter Apr 4, 2019
fba2aed
Created Webhooks.SimulateEvents controller class
calebkleveter Apr 5, 2019
998164e
Created Event.Simulated struct
calebkleveter Apr 5, 2019
f41babc
Created Webhooks.SimulateEvents.simulate(event:) method
calebkleveter Apr 5, 2019
6ab2939
Replaced Webhooks.EventTypes.list() API endpoint with 'self.path'
calebkleveter Apr 5, 2019
42d84ee
Changed Webhooks.Verification.verify(signature:) endpoint to 'self.path'
calebkleveter Apr 5, 2019
afe1cf8
Created CreditCard struct and CreditCardType enum
calebkleveter Apr 5, 2019
02fbcdb
Added response proeprties to vault CreditCard type
calebkleveter May 17, 2019
78f6941
Created CreditCard.List struct
calebkleveter May 17, 2019
6f120ed
Created Vault controller with CreditCards sub-controller
calebkleveter May 20, 2019
efacd9f
Created Vault.CreditCards.store(_:) method
calebkleveter May 20, 2019
926f201
Created Vault.CreditCards.list(parameters:) method
calebkleveter May 20, 2019
3284f3e
Created Vault.CreditCards.update(card:with:) method
calebkleveter May 20, 2019
5cd91e1
Created Vault.CreditCards.delete(card:) method
calebkleveter May 20, 2019
560c53b
Changed Vault.CreditCards.delete(card:) return type to EventLoopFutur…
calebkleveter May 20, 2019
41c00bf
Created Vault.CreditCards.get(card:) method
calebkleveter May 20, 2019
7854244
Fixed CrediCard.List type
calebkleveter May 20, 2019
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
2 changes: 2 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -1,4 +1,6 @@
.DS_Store
ModelVersions.md

/.build
/Packages
/*.xcodeproj
64 changes: 32 additions & 32 deletions Package.resolved

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

14 changes: 8 additions & 6 deletions Package.swift
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
// swift-tools-version:4.2
// swift-tools-version:5.0

import PackageDescription

Expand All @@ -8,19 +8,21 @@ let package = Package(
.library(name: "PayPal", targets: ["PayPal"]),
],
dependencies: [
.package(url: "https://github.com/skelpo/Countries.git", from: "0.9.1"),
.package(url: "https://github.com/skelpo/Failable.git", from: "0.2.0"),
.package(url: "https://github.com/vapor/vapor.git", from: "3.1.0"),
.package(url: "https://github.com/skelpo/JSON.git", from: "0.13.1"),
.package(url: "https://github.com/skelpo/Countries.git", from: "1.0.0"),
.package(url: "https://github.com/skelpo/Failable.git", from: "0.4.0"),
.package(url: "https://github.com/vapor/vapor.git", from: "3.3.0"),
.package(url: "https://github.com/skelpo/JSON.git", from: "1.0.0"),
.package(url: "https://github.com/twostraws/SwiftGD.git", from: "2.2.0")
],
targets: [
.target(name: "PayPal", dependencies: ["Vapor", "JSON", "Failable", "Countries"]),
.target(name: "PayPalV1", dependencies: ["Vapor", "PayPal"], path: "Sources/V1"),
.target(name: "PayPalV2", dependencies: ["Vapor", "PayPal"], path: "Sources/V2"),

.target(name: "TestUtilities", dependencies: ["PayPal", "Vapor"]),
.testTarget(name: "ConfigTests", dependencies: ["PayPal", "TestUtilities"]),
.testTarget(name: "ControllerTests", dependencies: ["PayPal", "SwiftGD", "TestUtilities"]),
.testTarget(name: "ModelTests", dependencies: ["PayPal", "TestUtilities"]),
.testTarget(name: "PayPalTests", dependencies: ["PayPal", "Vapor", "JSON"]),
.testTarget(name: "PayPalTests", dependencies: ["PayPal", "Vapor", "JSON", "ConfigTests", "ControllerTests", "ModelTests"]),
]
)
24 changes: 24 additions & 0 deletions Sources/PayPal/API/API.swift
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
import Vapor

/// The wrapper for the whole PayPal REST API.
public final class API {

/// The client used to send requests to PayPal.
public let client: PayPalClient

/// Creates a new `API` instance with the dependencies for the `PayPalClient` instance.
///
/// - Parameters:
/// - client: The `Client` instance that the `PayPalClient` instance uses to send requests.
/// - environment: The PayPal environment to send requests to.
public init(client: Client, version: Version, environment: Environment) {
self.client = PayPalClient(client: client, version: version, env: environment)
}

/// Creates a new `API` instance with the `PayPalClient` instance to use.
///
/// - Parameter client: The `PayPalClient` instance that will be used to send requests to the PayPal API.
public init(client: PayPalClient) {
self.client = client
}
}
11 changes: 5 additions & 6 deletions Sources/PayPal/API/Authentication.swift
Original file line number Diff line number Diff line change
Expand Up @@ -55,15 +55,15 @@ extension PayPalClient {
///
/// - Returns: A void future that can be used to get notified when the auth information has been fetched and stored.
public func authenticate() -> Future<Void> {
return Future.flatMap(on: self.container) { () -> Future<Response> in
let config = try self.container.make(Configuration.self)
return Future.flatMap(on: self.client.container) { () -> Future<Response> in
let config = try self.client.container.make(Configuration.self)

let credentials = "\(config.id):\(config.secret)"
let encoded = Data(credentials.utf8).base64EncodedString()
let headers: HTTPHeaders = ["Accept": "application/json", "Accept-Language": "en_US", "Authorization": "Basic \(encoded)"]

let request = try self.container.paypal(.POST, "v1/oauth2/token", headers: headers, auth: false, body: ["grant_type": "client_credentials"])
return try self.container.client().send(request)
let request = try self.request(.POST, "v1/oauth2/token", headers: headers, auth: false, body: ["grant_type": "client_credentials"])
return self.client.send(request)
}.flatMap(to: AuthResponse.self) { response in
if !(200...299).contains(response.http.status.code) {
return try response.content.decode(PayPalAPIIdentityError.self).map { error in throw error }
Expand All @@ -72,8 +72,7 @@ extension PayPalClient {
return try response.content.decode(AuthResponse.self)

}.map(to: Void.self) { data in
let auth = try self.container.make(AuthInfo.self)
data.populate(auth)
data.populate(self.auth)
}
}
}
25 changes: 25 additions & 0 deletions Sources/PayPal/API/Controller.swift
Original file line number Diff line number Diff line change
Expand Up @@ -50,3 +50,28 @@ extension PayPalController {
}
}
}

// TODO: - Renamed protocol to PayPalController.

/// A controller that handles a versioned resource of the PayPal API.
public protocol VersionedController {

/// The `PayPalClient` instance used to send requests to the PayPal API.
var client: PayPalClient { get }

/// The path components for the API resource that the controller interacts with.
var resource: [String] { get }

/// Creates a new instance of `Self` with the `PayPalClient` instance that will be used by it.
///
/// - Parameter client: The `PayPalClient` instance to send requests with.
init(client: PayPalClient)
}

extension VersionedController {

/// The resource elements joined togeather as a URL path.
public var path: String {
return self.resource.joined(separator: "/") + "/"
}
}
4 changes: 2 additions & 2 deletions Sources/PayPal/API/Controllers/CustomerDisputes.swift
Original file line number Diff line number Diff line change
Expand Up @@ -213,7 +213,7 @@ public final class CustomerDisputes: PayPalController {
/// - Returns: An array of request-related [HATEOAS links](https://developer.paypal.com/docs/api/overview/#hateoas-links).
/// If an error response was sent back instead, it gets converted to a Swift error and the future wraps that instead.
public func evidence(for disputeID: String, file: File, evidences: [Evidence]) -> Future<[LinkDescription]> {
return Future.flatMap(on: self.container) { () -> Future<[LinkDescription]> in
return self.client { client -> Future<[LinkDescription]> in

guard let ext = file.ext, ext == "jpg" || ext == "gif" || ext == "png" || ext == "pdf" else {
throw PayPalError(status: .badRequest, identifier: "invalidExtension", reason: "File type must be JPG, GIF, PNG, or PDF")
Expand All @@ -222,7 +222,7 @@ public final class CustomerDisputes: PayPalController {
let json = try MultipartPart(data: JSONEncoder().encode(evidences), headers: ["Content-Type": "application/json"])
let body: [String: MultipartPartConvertible] = ["input": json, "file1": file]

let request: Request = try self.container.paypal(.POST, self.path + disputeID + "/provide-evidence", body: nil as [Int]?)
let request: Request = try client.request(.POST, self.path + disputeID + "/provide-evidence", body: nil as [Int]?)
try request.content.encode(body.parts(), as: .related)

let response = try self.container.client().send(request)
Expand Down
2 changes: 1 addition & 1 deletion Sources/PayPal/API/Controllers/ManagedAccounts.swift
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@ public final class ManagedAccounts: PayPalController {
/// See `PayPalController.init(container:)`.
public init(container: Container) {
self.container = container
self.resource = "partners/merchant-accounts"
self.resource = "customer/partners/merchant-accounts"
self.version = try container.make(Configuration.self).version || .v1
}

Expand Down
Loading