Skip to content

Commit

Permalink
Merge branch 'pr/66'
Browse files Browse the repository at this point in the history
  • Loading branch information
s4cha committed Jun 7, 2020
2 parents 29a5e6e + 3a47d47 commit fe9033b
Show file tree
Hide file tree
Showing 10 changed files with 94 additions and 31 deletions.
1 change: 1 addition & 0 deletions Carthage/Checkouts/Alamofire
Submodule Alamofire added at 75bba5
1 change: 1 addition & 0 deletions Carthage/Checkouts/Arrow
Submodule Arrow added at af8073
1 change: 1 addition & 0 deletions Carthage/Checkouts/then
Submodule then added at a955ce
37 changes: 24 additions & 13 deletions Sources/ws/WS+Requests.swift
Original file line number Diff line number Diff line change
Expand Up @@ -34,27 +34,38 @@ extension WS {
data: Data,
fileName: String,
mimeType: String) -> WSRequest {
let c = call(url, verb: .post, params: params)
let multiPart = WSMultiPartData(
multipartData: data,
multipartName: name,
multipartFileName: fileName,
multipartMimeType: mimeType
)
return postMultipartRequest(url, params: params, multiParts: [multiPart])
}

public func postMultipartRequest(_ url: String,
params: Params = Params(),
multiParts: [WSMultiPartData],
verb: WSHTTPVerb = .post) -> WSRequest {
let c = call(url, verb: verb, params: params)
c.isMultipart = true
c.multipartData = data
c.multipartName = name
c.multipartFileName = fileName
c.multipartMimeType = mimeType
c.multiPartData = multiParts
return c
}

public func putMultipartRequest(_ url: String,
params: Params = Params(),
name: String,
data: Data,
fileName: String,
mimeType: String) -> WSRequest {
let c = call(url, verb: .put, params: params)
c.isMultipart = true
c.multipartData = data
c.multipartName = name
c.multipartFileName = fileName
c.multipartMimeType = mimeType
return c
let multiPart = WSMultiPartData(
multipartData: data,
multipartName: name,
multipartFileName: fileName,
multipartMimeType: mimeType
)
return postMultipartRequest(url, params: params, multiParts: [multiPart], verb: .put)
}

}
7 changes: 4 additions & 3 deletions Sources/ws/WS+TypedCalls.swift
Original file line number Diff line number Diff line change
Expand Up @@ -57,8 +57,8 @@ extension WS {

// Apply corresponding JSON mapper
return c.fetch().registerThen { (json: JSON) -> T in
return WSModelJSONParser<T>().toModel(json, keypath: keypath)
}.resolveOnMainThread()
return WSModelJSONParser<T>().toModel(json, keypath: keypath ?? self.defaultObjectParsingKeyPath)
}.resolveOnMainThread()
}

}
Expand Down Expand Up @@ -119,7 +119,7 @@ extension WS {
return c.fetch()
.registerThen { (json: JSON) in
Promise<T> { (resolve, reject) in
if let t: T = WSModelJSONParser<T>().toModel(json, keypath: keypath) {
if let t: T = WSModelJSONParser<T>().toModel(json, keypath: keypath ?? self.defaultObjectParsingKeyPath) {
resolve(t)
} else {
reject(WSError.unableToParseResponse)
Expand All @@ -130,3 +130,4 @@ extension WS {
}

}

32 changes: 28 additions & 4 deletions Sources/ws/WS.swift
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,9 @@ open class WS {
*/
open var defaultCollectionParsingKeyPath: String?

// Same but for ArrowInitializable objects
open var defaultObjectParsingKeyPath: String?

@available(*, unavailable, renamed:"defaultCollectionParsingKeyPath")
open var jsonParsingColletionKey: String?

Expand Down Expand Up @@ -65,8 +68,9 @@ open class WS {
let c = defaultCall()
c.httpVerb = verb
c.URL = url
if mandatoryQueryParams.isEmpty { c.params = params }
else {
if mandatoryQueryParams.isEmpty {
c.params = params
} else {
c.params = params.merging(mandatoryQueryParams) { (current, _) in current }
}
return c
Expand Down Expand Up @@ -145,6 +149,15 @@ open class WS {
mimeType: mimeType)
return r.fetch().resolveOnMainThread()
}

open func postMultipart(_ url: String,
params: Params = Params(),
multiParts: [WSMultiPartData]) -> Promise<JSON> {
let r = postMultipartRequest(url,
params: params,
multiParts: multiParts)
return r.fetch().resolveOnMainThread()
}

open func putMultipart(_ url: String,
params: Params = Params(),
Expand All @@ -156,16 +169,27 @@ open class WS {
return r.fetch().resolveOnMainThread()
}

open func putMultipart(_ url: String,
params: Params = Params(),
multiParts: [WSMultiPartData]) -> Promise<JSON> {
let r = postMultipartRequest(url, params: params, multiParts: multiParts, verb: .put)
return r.fetch().resolveOnMainThread()
}

open func patchMultipart(_ url: String, params: Params = Params(), multiParts: [WSMultiPartData]) -> Promise<JSON> {
let r = postMultipartRequest(url, params: params, multiParts: multiParts, verb: .patch)
return r.fetch().resolveOnMainThread()
}

open func addMandatoryQueryParameter(key: String, value: Any) -> WS {
mandatoryQueryParams[key] = value
return self
}

open func addMandatoryQueryParameter(params: Params) -> WS{
open func addMandatoryQueryParameter(params: Params) -> WS {
mandatoryQueryParams.merge(params) { (current, _) in current }
return self
}

}

public extension Promise {
Expand Down
2 changes: 2 additions & 0 deletions Sources/ws/WSError.swift
Original file line number Diff line number Diff line change
Expand Up @@ -73,6 +73,8 @@ public struct WSError: Error {

public var jsonPayload: JSON?

public var responseData: Data?

public init(httpStatusCode: Int) {
self.status = Status(rawValue: httpStatusCode) ?? .unknown
}
Expand Down
1 change: 1 addition & 0 deletions Sources/ws/WSHTTPVerb.swift
Original file line number Diff line number Diff line change
Expand Up @@ -12,5 +12,6 @@ public enum WSHTTPVerb: String {
case get = "GET"
case put = "PUT"
case post = "POST"
case patch = "PATCH"
case delete = "DELETE"
}
7 changes: 5 additions & 2 deletions Sources/ws/WSLogger.swift
Original file line number Diff line number Diff line change
Expand Up @@ -37,8 +37,11 @@ class WSLogger {
for (k, v) in request.headers {
print(" \(k) : \(v)")
}
print(" name : \(request.multipartName),"
+ "mimeType: \(request.multipartMimeType), filename: \(request.multipartFileName)")
request.multiPartData.forEach {
print(" name : \($0.multipartName),"
+ "mimeType: \($0.multipartMimeType), filename: \($0.multipartFileName)")
}

if logLevels == .debug {
print()
}
Expand Down
36 changes: 27 additions & 9 deletions Sources/ws/WSRequest.swift
Original file line number Diff line number Diff line change
Expand Up @@ -11,13 +11,26 @@ import Arrow
import Foundation
import Then

public struct WSMultiPartData {
public var multipartData = Data()
public var multipartName = ""
public var multipartFileName = "photo.jpg"
public var multipartMimeType = "image/*"

public init() {
}
public init(multipartData: Data, multipartName: String, multipartFileName: String? = nil, multipartMimeType: String) {
self.multipartData = multipartData
self.multipartName = multipartName
self.multipartFileName = multipartFileName ?? self.multipartFileName
self.multipartMimeType = multipartMimeType
}
}

open class WSRequest {

var isMultipart = false
var multipartData = Data()
var multipartName = ""
var multipartFileName = "photo.jpg"
var multipartMimeType = "image/jpeg"
var multiPartData = [WSMultiPartData]()

open var baseURL = ""
open var URL = ""
Expand Down Expand Up @@ -59,7 +72,7 @@ open class WSRequest {
}

var request: URLRequest?
if httpVerb == .post || httpVerb == .put {
if httpVerb == .post || httpVerb == .put || httpVerb == .patch {
request = try? postParameterEncoding.encode(r, with: params)
} else {
request = try? URLEncoding.default.encode(r, with: params)
Expand Down Expand Up @@ -138,10 +151,12 @@ open class WSRequest {
formData.append(data, withName: key)
}
}
formData.append(self.multipartData,
withName: self.multipartName,
fileName: self.multipartFileName,
mimeType: self.multipartMimeType)
self.multiPartData.forEach{ data in
formData.append(data.multipartData,
withName: data.multipartName,
fileName: data.multipartFileName,
mimeType: data.multipartMimeType)
}
}, with: self.buildRequest(),
encodingCompletion: { encodingResult in
switch encodingResult {
Expand Down Expand Up @@ -209,6 +224,7 @@ open class WSRequest {
data: Data? = nil,
reject: (_ error: Error) -> Void) {
var error = WSError(httpStatusCode: response?.statusCode ?? 0)
error.responseData = data
if let d = data,
let json = try? JSONSerialization.jsonObject(with: d,
options: JSONSerialization.ReadingOptions.allowFragments),
Expand All @@ -226,6 +242,8 @@ open class WSRequest {
return .post
case .put:
return .put
case .patch:
return .patch
case .delete:
return .delete
}
Expand Down

0 comments on commit fe9033b

Please sign in to comment.