From aa2dc3880e37ea2168c53306437f747f444ef7d4 Mon Sep 17 00:00:00 2001 From: Ivan Smolin Date: Wed, 2 Mar 2022 11:57:59 +0300 Subject: [PATCH] feat: add SuccessResponse generic argument to EndpointRequest --- .../DefaultJsonNetworkService.swift | 20 +++++---- ...DefaultRecoverableJsonNetworkService.swift | 16 +++---- .../RequestFactory.swift | 3 +- .../StaticRequestFactory.swift | 10 ++--- TINetworking/Sources/HTTPCodes.swift | 45 +++++++++++++++++++ .../Sources/Request/EndpointRequest.swift | 4 +- 6 files changed, 73 insertions(+), 25 deletions(-) create mode 100644 TINetworking/Sources/HTTPCodes.swift diff --git a/TIMoyaNetworking/Sources/NetworkService/DefaultJsonNetworkService.swift b/TIMoyaNetworking/Sources/NetworkService/DefaultJsonNetworkService.swift index 4db2a33f..b5c5c0c4 100644 --- a/TIMoyaNetworking/Sources/NetworkService/DefaultJsonNetworkService.swift +++ b/TIMoyaNetworking/Sources/NetworkService/DefaultJsonNetworkService.swift @@ -27,13 +27,15 @@ import TISwiftUtils import Foundation open class DefaultJsonNetworkService { - var session: Session + public var session: Session - var serializationQueue: DispatchQueue - var callbackQueue: DispatchQueue + public var serializationQueue: DispatchQueue + public var callbackQueue: DispatchQueue - var jsonDecoder: JSONDecoder - var jsonEncoder: JSONEncoder + public var jsonDecoder: JSONDecoder + public var jsonEncoder: JSONEncoder + + public var plugins: [PluginType] = [] public init(session: Session, jsonDecoder: JSONDecoder, @@ -53,7 +55,7 @@ open class DefaultJsonNetworkService { } @available(iOS 13.0.0, *) - public func process(request: EndpointRequest, + public func process(request: EndpointRequest, mapMoyaError: @escaping Closure) async -> Result { await process(request: request, mapSuccess: Result.success, @@ -62,7 +64,7 @@ open class DefaultJsonNetworkService { } @available(iOS 13.0.0, *) - public func process(request: EndpointRequest, + public func process(request: EndpointRequest, decodableSuccessStatusCodes: Set? = nil, decodableFailureStatusCodes: Set? = nil, mapSuccess: @escaping Closure, @@ -89,7 +91,7 @@ open class DefaultJsonNetworkService { }) } - public func process(request: EndpointRequest, + public func process(request: EndpointRequest, decodableSuccessStatusCodes: Set? = nil, decodableFailureStatusCodes: Set? = nil, mapSuccess: @escaping Closure, @@ -156,7 +158,7 @@ open class DefaultJsonNetworkService { failureStatusCodes = request.acceptableStatusCodes.subtracting(successCodes) default: - successStatusCodes = [200] + successStatusCodes = HTTPCodes.success.asSet() // default success status codes if nothing was passed failureStatusCodes = request.acceptableStatusCodes.subtracting(successStatusCodes) } diff --git a/TIMoyaNetworking/Sources/RecoverableNetworkService/DefaultRecoverableJsonNetworkService.swift b/TIMoyaNetworking/Sources/RecoverableNetworkService/DefaultRecoverableJsonNetworkService.swift index 74afc3c9..8ab44a10 100644 --- a/TIMoyaNetworking/Sources/RecoverableNetworkService/DefaultRecoverableJsonNetworkService.swift +++ b/TIMoyaNetworking/Sources/RecoverableNetworkService/DefaultRecoverableJsonNetworkService.swift @@ -30,23 +30,23 @@ open class DefaultRecoverableJsonNetworkService: De private var defaultErrorHandlers: [ErrorHandler] = [] - public func process(recoverableRequest: RF, - prependErrorHandlers: [ErrorHandler] = [], - appendErrorHandlers: [ErrorHandler] = [], - mapMoyaError: @escaping Closure) async -> Result where RF.Body == B, RF.CreateFailure == ApiError { + public func process(recoverableRequest: RF, + prependErrorHandlers: [ErrorHandler] = [], + appendErrorHandlers: [ErrorHandler] = [], + mapMoyaError: @escaping Closure) async -> Result where RF.Body: Encodable, RF.SuccessResponse: Decodable, RF.CreateFailure == ApiError { await process(recoverableRequest: recoverableRequest, errorHandlers: prependErrorHandlers + defaultErrorHandlers + appendErrorHandlers, mapMoyaError: mapMoyaError) } - public func process(recoverableRequest: RF, - errorHandlers: [ErrorHandler] = [], - mapMoyaError: @escaping Closure) async -> Result where RF.Body == B, RF.CreateFailure == ApiError { + public func process(recoverableRequest: RF, + errorHandlers: [ErrorHandler] = [], + mapMoyaError: @escaping Closure) async -> Result where RF.Body: Encodable, RF.SuccessResponse: Decodable, RF.CreateFailure == ApiError { switch recoverableRequest.create() { case let .success(endpointRequest): - let result = await process(request: endpointRequest, mapMoyaError: mapMoyaError) as Result + let result = await process(request: endpointRequest, mapMoyaError: mapMoyaError) as Result switch result { case let .failure(errorResponse): diff --git a/TIMoyaNetworking/Sources/RecoverableNetworkService/RequestFactory.swift b/TIMoyaNetworking/Sources/RecoverableNetworkService/RequestFactory.swift index cbbb3b14..5a45f78f 100644 --- a/TIMoyaNetworking/Sources/RecoverableNetworkService/RequestFactory.swift +++ b/TIMoyaNetworking/Sources/RecoverableNetworkService/RequestFactory.swift @@ -24,7 +24,8 @@ import TINetworking public protocol RequestFactory { associatedtype Body + associatedtype SuccessResponse associatedtype CreateFailure: Error - func create() -> Result, CreateFailure> + func create() -> Result, CreateFailure> } diff --git a/TIMoyaNetworking/Sources/RecoverableNetworkService/StaticRequestFactory.swift b/TIMoyaNetworking/Sources/RecoverableNetworkService/StaticRequestFactory.swift index d8206f3a..e3fe65e8 100644 --- a/TIMoyaNetworking/Sources/RecoverableNetworkService/StaticRequestFactory.swift +++ b/TIMoyaNetworking/Sources/RecoverableNetworkService/StaticRequestFactory.swift @@ -22,20 +22,20 @@ import TINetworking -public struct StaticRequestFactory: RequestFactory { - let request: EndpointRequest +public struct StaticRequestFactory: RequestFactory { + let request: EndpointRequest - public init(request: EndpointRequest) { + public init(request: EndpointRequest) { self.request = request } - public func create() -> Result, CreateFailure> { + public func create() -> Result, CreateFailure> { .success(request) } } public extension EndpointRequest { - func staticRequestFactory() -> StaticRequestFactory { + func staticRequestFactory() -> StaticRequestFactory { .init(request: self) } } diff --git a/TINetworking/Sources/HTTPCodes.swift b/TINetworking/Sources/HTTPCodes.swift new file mode 100644 index 00000000..1aef0d90 --- /dev/null +++ b/TINetworking/Sources/HTTPCodes.swift @@ -0,0 +1,45 @@ +// +// Copyright (c) 2022 Touch Instinct +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the Software), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED AS IS, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. +// + +// https://developer.mozilla.org/en-US/docs/Web/HTTP/Status +public enum HTTPCodes { + case informational + case success + case redirection + case clientError + case serverError + + public func asSet() -> Set { + switch self { + case .informational: + return Set(100...199) + case .success: + return Set(200...299) + case .redirection: + return Set(300...399) + case .clientError: + return Set(400...499) + case .serverError: + return Set(500...599) + } + } +} diff --git a/TINetworking/Sources/Request/EndpointRequest.swift b/TINetworking/Sources/Request/EndpointRequest.swift index cc574b21..2a3b8276 100644 --- a/TINetworking/Sources/Request/EndpointRequest.swift +++ b/TINetworking/Sources/Request/EndpointRequest.swift @@ -22,7 +22,7 @@ import Alamofire -public struct EndpointRequest { +public struct EndpointRequest { public var templatePath: String public var method: HTTPMethod public var body: Body @@ -41,7 +41,7 @@ public struct EndpointRequest { pathParameters: [String: Parameter] = [:], headerParameters: HTTPHeaders? = nil, cookieParameters: [String: Parameter] = [:], - acceptableStatusCodes: Set = [200], + acceptableStatusCodes: Set = HTTPCodes.success.asSet(), server: Server, customServerVariables: [KeyValueTuple] = []) {