Skip to content

Commit

Permalink
Finish reorganizing NetworkingService
Browse files Browse the repository at this point in the history
  • Loading branch information
s4cha committed Nov 15, 2023
1 parent f92cf27 commit 6b7cb72
Show file tree
Hide file tree
Showing 11 changed files with 282 additions and 288 deletions.
41 changes: 39 additions & 2 deletions Sources/Networking/Combine Api/Delete+Combine.swift
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ public extension NetworkingClient {
}

func delete<T: Decodable>(_ route: String,
keypath: String? = nil) -> AnyPublisher<T, Error> {
keypath: String? = nil) -> AnyPublisher<T, Error> {
return delete(route)
.tryMap { json -> T in try self.toModel(json, keypath: keypath) }
.receive(on: DispatchQueue.main)
Expand All @@ -26,7 +26,7 @@ public extension NetworkingClient {

// Array version
func delete<T: Decodable>(_ route: String,
keypath: String? = nil) -> AnyPublisher<T, Error> where T: Collection {
keypath: String? = nil) -> AnyPublisher<T, Error> where T: Collection {
let keypath = keypath ?? defaultCollectionParsingKeyPath
return delete(route)
.tryMap { json -> T in try self.toModel(json, keypath: keypath) }
Expand All @@ -42,3 +42,40 @@ public extension NetworkingClient {
request(.delete, route).publisher()
}
}

public extension NetworkingService {

func delete(_ route: String) -> AnyPublisher<Void, Error> {
network.delete(route)
}

func delete<T: Decodable>(_ route: String,
keypath: String? = nil) -> AnyPublisher<T, Error> {
network.delete(route, keypath: keypath)
}

func delete<T: Decodable>(_ route: String,
params: Params = Params(),
keypath: String? = nil) -> AnyPublisher<T, Error> where T: Collection {
network.delete(route, keypath: keypath)
}

func delete<T: NetworkingJSONDecodable>(_ route: String,
keypath: String? = nil) -> AnyPublisher<T, Error> {
network.delete(route, keypath: keypath)
}

func delete<T: NetworkingJSONDecodable>(_ route: String,
keypath: String? = nil) -> AnyPublisher<[T], Error> {
network.delete(route, keypath: keypath)
}

func delete(_ route: String) -> AnyPublisher<Any, Error> {
network.delete(route)
}

func delete(_ route: String) -> AnyPublisher<Data, Error> {
network.delete(route)
}
}

59 changes: 51 additions & 8 deletions Sources/Networking/Combine Api/Get+Combine.swift
Original file line number Diff line number Diff line change
Expand Up @@ -16,14 +16,6 @@ public extension NetworkingClient {
.eraseToAnyPublisher()
}

func get(_ route: String, urlParams: Params? = nil) -> AnyPublisher<Data, Error> {
request(.get, route, urlParams: urlParams).publisher()
}

func get(_ route: String, urlParams: Params? = nil) -> AnyPublisher<Any, Error> {
get(route, urlParams: urlParams).toJSON()
}

func get<T: Decodable>(_ route: String,
urlParams: Params? = nil,
keypath: String? = nil) -> AnyPublisher<T, Error> {
Expand All @@ -43,4 +35,55 @@ public extension NetworkingClient {
.receive(on: DispatchQueue.main)
.eraseToAnyPublisher()
}

func get(_ route: String, urlParams: Params? = nil) -> AnyPublisher<Any, Error> {
get(route, urlParams: urlParams).toJSON()
}

func get(_ route: String, urlParams: Params? = nil) -> AnyPublisher<Data, Error> {
request(.get, route, urlParams: urlParams).publisher()
}
}

public extension NetworkingService {

func get(_ route: String, urlParams: Params? = nil) -> AnyPublisher<Void, Error> {
network.get(route, urlParams: urlParams)
}

func get<T: Decodable>(_ route: String,
urlParams: Params? = nil,
keypath: String? = nil) -> AnyPublisher<T, Error> {
network.get(route, urlParams: urlParams, keypath: keypath)
}

func get<T: Decodable>(_ route: String,
urlParams: Params? = nil,
keypath: String? = nil) -> AnyPublisher<T, Error> where T: Collection {
network.get(route, urlParams: urlParams, keypath: keypath)
}

func get<T: NetworkingJSONDecodable>(_ route: String,
urlParams: Params? = nil,
keypath: String? = nil) -> AnyPublisher<T, Error> {
network.get(route, urlParams: urlParams, keypath: keypath)
}

func get<T: NetworkingJSONDecodable>(_ route: String,
urlParams: Params? = nil,
keypath: String? = nil) -> AnyPublisher<[T], Error> {
network.get(route, urlParams: urlParams, keypath: keypath)
}


func get(_ route: String, urlParams: Params? = nil) -> AnyPublisher<Any, Error> {
network.get(route, urlParams: urlParams)
}

func get(_ route: String, urlParams: Params? = nil) -> AnyPublisher<Data, Error> {
network.get(route, urlParams: urlParams)
}



}
47 changes: 43 additions & 4 deletions Sources/Networking/Combine Api/Patch+Combine.swift
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
//
// Patch+Combine.swift
//
//
//
// Created by Sacha Durand Saint Omer on 12/11/2023.
//
Expand All @@ -18,7 +18,7 @@ public extension NetworkingClient {

func patch<T: Decodable>(_ route: String,
body: HTTPBody? = nil,
keypath: String? = nil) -> AnyPublisher<T, Error> {
keypath: String? = nil) -> AnyPublisher<T, Error> {
return patch(route, body: body)
.tryMap { json -> T in try self.toModel(json, keypath: keypath) }
.receive(on: DispatchQueue.main)
Expand All @@ -29,7 +29,7 @@ public extension NetworkingClient {
// Array version
func patch<T: Decodable>(_ route: String,
body: HTTPBody? = nil,
keypath: String? = nil) -> AnyPublisher<T, Error> where T: Collection {
keypath: String? = nil) -> AnyPublisher<T, Error> where T: Collection {
let keypath = keypath ?? defaultCollectionParsingKeyPath
return patch(route, body: body)
.tryMap { json -> T in try self.toModel(json, keypath: keypath) }
Expand All @@ -46,8 +46,47 @@ public extension NetworkingClient {
}

func patch(_ route: String,
body: HTTPBody) -> AnyPublisher<(Data?, Progress), Error> {
body: HTTPBody? = nil) -> AnyPublisher<(Data?, Progress), Error> {
let req = request(.patch, route, body: body)
return req.uploadPublisher()
}
}

public extension NetworkingService {

func patch(_ route: String, body: HTTPBody? = nil) -> AnyPublisher<Void, Error> {
network.patch(route, body: body)
}

func patch<T: Decodable>(_ route: String,
body: HTTPBody? = nil,
keypath: String? = nil) -> AnyPublisher<T, Error> {
network.patch(route, body: body, keypath: keypath)
}

func patch<T: Decodable>(_ route: String,
body: HTTPBody? = nil,
keypath: String? = nil) -> AnyPublisher<T, Error> where T: Collection {
network.patch(route, body: body, keypath: keypath)
}

func patch<T: NetworkingJSONDecodable>(_ route: String,
body: HTTPBody? = nil,
keypath: String? = nil) -> AnyPublisher<T, Error> {
network.patch(route, body: body, keypath: keypath)
}

func patch<T: NetworkingJSONDecodable>(_ route: String,
body: HTTPBody? = nil,
keypath: String? = nil) -> AnyPublisher<[T], Error> {
network.patch(route, body: body, keypath: keypath)
}

func patch(_ route: String, body: HTTPBody? = nil) -> AnyPublisher<Any, Error> {
network.patch(route, body: body)
}

func patch(_ route: String, body: HTTPBody? = nil) -> AnyPublisher<Data, Error> {
network.patch(route, body: body)
}
}
39 changes: 39 additions & 0 deletions Sources/Networking/Combine Api/Post+Combine.swift
Original file line number Diff line number Diff line change
Expand Up @@ -49,5 +49,44 @@ public extension NetworkingClient {
let req = request(.post, route, body: body)
return req.uploadPublisher()
}

}

public extension NetworkingService {

func post(_ route: String, body: HTTPBody? = nil) -> AnyPublisher<Void, Error> {
network.post(route, body: body)
}

func post<T: Decodable>(_ route: String,
body: HTTPBody? = nil,
keypath: String? = nil) -> AnyPublisher<T, Error> {
network.post(route, body: body, keypath: keypath)
}

func post<T: Decodable>(_ route: String,
body: HTTPBody? = nil,
keypath: String? = nil) -> AnyPublisher<T, Error> where T: Collection {
network.post(route, body: body, keypath: keypath)
}

func post<T: NetworkingJSONDecodable>(_ route: String,
body: HTTPBody? = nil,
keypath: String? = nil) -> AnyPublisher<T, Error> {
network.post(route, body: body, keypath: keypath)
}

func post<T: NetworkingJSONDecodable>(_ route: String,
body: HTTPBody? = nil,
keypath: String? = nil) -> AnyPublisher<[T], Error> {
network.post(route, body: body, keypath: keypath)
}

func post(_ route: String, body: HTTPBody? = nil) -> AnyPublisher<Any, Error> {
network.post(route, body: body)
}

func post(_ route: String, body: HTTPBody? = nil) -> AnyPublisher<Data, Error> {
network.post(route, body: body)
}
}
39 changes: 39 additions & 0 deletions Sources/Networking/Combine Api/Put+Combine.swift
Original file line number Diff line number Diff line change
Expand Up @@ -50,3 +50,42 @@ public extension NetworkingClient {
return req.uploadPublisher()
}
}

public extension NetworkingService {

func put(_ route: String, body: HTTPBody? = nil) -> AnyPublisher<Void, Error> {
network.put(route, body: body)
}

func put<T: Decodable>(_ route: String,
body: HTTPBody? = nil,
keypath: String? = nil) -> AnyPublisher<T, Error> {
network.put(route, body: body, keypath: keypath)
}

func put<T: Decodable>(_ route: String,
body: HTTPBody? = nil,
keypath: String? = nil) -> AnyPublisher<T, Error> where T: Collection {
network.put(route, body: body, keypath: keypath)
}

func put<T: NetworkingJSONDecodable>(_ route: String,
body: HTTPBody? = nil,
keypath: String? = nil) -> AnyPublisher<T, Error> {
network.put(route, body: body, keypath: keypath)
}

func put<T: NetworkingJSONDecodable>(_ route: String,
body: HTTPBody? = nil,
keypath: String? = nil) -> AnyPublisher<[T], Error> {
network.put(route, body: body, keypath: keypath)
}

func put(_ route: String, body: HTTPBody? = nil) -> AnyPublisher<Any, Error> {
network.put(route, body: body)
}

func put(_ route: String, body: HTTPBody? = nil) -> AnyPublisher<Data, Error> {
network.put(route, body: body)
}
}
54 changes: 54 additions & 0 deletions Sources/Networking/HTTPBody.swift
Original file line number Diff line number Diff line change
Expand Up @@ -13,3 +13,57 @@ public enum HTTPBody {
case jsonParams(params: Params)
case multipart(params: Params?, parts:[MultipartData])
}


extension HTTPBody {
func header(for boundary: String) -> String {
switch self {
case .urlEncoded(_):
return "application/x-www-form-urlencoded"
case .json(_):
return "application/json"
case .jsonParams(_):
return "application/json"
case .multipart(_, _):
return "multipart/form-data; boundary=\(boundary)"
}
}
}

extension HTTPBody {

func body(for boundary: String) -> Data? {
switch self {
case .urlEncoded(params: let params):
return params.asPercentEncodedString().data(using: .utf8)
case .json(let encodable):
do {
let jsonEncoder = JSONEncoder()
let data = try jsonEncoder.encode(encodable)
return data
} catch {
print(error)
return nil
}
case .jsonParams(params: let params):
return try? JSONSerialization.data(withJSONObject: params)
case .multipart(params: let params, parts: let parts):
return buildMultipartHttpBody(params: params ?? [:], multiparts: parts, boundary: boundary)
}
}

private func buildMultipartHttpBody(params: Params, multiparts: [MultipartData], boundary: String) -> Data {
// Combine all multiparts together
let allMultiparts: [HttpBodyConvertible] = [params] + multiparts
let boundaryEnding = "--\(boundary)--".data(using: .utf8)!

// Convert multiparts to boundary-seperated Data and combine them
return allMultiparts
.map { (multipart: HttpBodyConvertible) -> Data in
return multipart.buildHttpBodyPart(boundary: boundary)
}
.reduce(Data.init(), +)
+ boundaryEnding
}
}

3 changes: 1 addition & 2 deletions Sources/Networking/NetworkingClient+Requests.swift
Original file line number Diff line number Diff line change
Expand Up @@ -38,15 +38,14 @@ public extension NetworkingClient {
let req = NetworkingRequest()
req.httpMethod = httpMethod
req.route = route
req.urlParams = urlParams
req.queryParams = urlParams
req.httpBody = body

let updateRequest = { [weak req, weak self] in
guard let self = self else { return }
req?.baseURL = self.baseURL
req?.logLevel = self.logLevel
req?.headers = self.headers
req?.parameterEncoding = self.parameterEncoding
req?.sessionConfiguration = self.sessionConfiguration
req?.timeout = self.timeout
}
Expand Down
1 change: 0 additions & 1 deletion Sources/Networking/NetworkingClient.swift
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,6 @@ public class NetworkingClient {
public var defaultCollectionParsingKeyPath: String?
let baseURL: String
public var headers = [String: String]()
public var parameterEncoding = ParameterEncoding.urlEncoded
public var timeout: TimeInterval?
public var sessionConfiguration = URLSessionConfiguration.default
public var requestRetrier: NetworkRequestRetrier?
Expand Down
Loading

0 comments on commit 6b7cb72

Please sign in to comment.