fix: Comments from pull request

This commit is contained in:
Grigory Boyko 2022-08-02 11:38:35 +07:00
parent 343c40888d
commit eb66a4e8ca
7 changed files with 155 additions and 25 deletions

View File

@ -1,3 +1,24 @@
//
// 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.
import TIFoundationUtils
import TINetworking
@ -11,16 +32,20 @@ open class CartRequestExecutor<S: Decodable, AE: Decodable, NE>: Cancellable {
public var successCompletion: SuccessCompletion
private var executingRequest: Cancellable?
private var numberOfAttempts: Int
public init(executionClosure: @escaping ExecutionClosure, successCompletion: @escaping SuccessCompletion) {
public init(executionClosure: @escaping ExecutionClosure,
successCompletion: @escaping SuccessCompletion,
numberOfAttempts: Int = 3) {
self.executionClosure = executionClosure
self.successCompletion = successCompletion
self.numberOfAttempts = numberOfAttempts
}
open func execute() {
executingRequest?.cancel()
_ = executionClosure { [weak self] in
executingRequest = executionClosure { [weak self] in
switch $0 {
case let .success(result):
self?.handle(successResult: result)
@ -35,7 +60,8 @@ open class CartRequestExecutor<S: Decodable, AE: Decodable, NE>: Cancellable {
}
open func handle(failure: ErrorCollection<EndpointErrorResult<AE, NE>>) {
if shouldRetry(failure: failure) && 0 < 3 {
if shouldRetry(failure: failure) && numberOfAttempts > 0 {
numberOfAttempts -= 1
execute()
}
}

View File

@ -1,6 +1,27 @@
//
// 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.
import Foundation
protocol BaseErrorResponseBody: Decodable, Hashable {
public protocol BaseErrorResponseBody: Decodable, Hashable {
///Код ошибки
var errorCode: Int { get }
///Текст сообщения об ошибке

View File

@ -1,6 +1,27 @@
//
// 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.
import Foundation
protocol Cart {
public protocol Cart {
///Продукты в корзине пользователя
var products: [CartProduct] { get }
///Применённые промокоды

View File

@ -1,6 +1,27 @@
//
// 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.
import Foundation
protocol CartProduct {
public protocol CartProduct {
///Идентификатор продукта
var id: String { get }
///Цена в определённой валюте

View File

@ -23,23 +23,19 @@ import Foundation
import TIFoundationUtils
import TISwiftUtils
protocol CartPublisher {
associatedtype Cart
func subscribeOnCartChanging(completion: ParameterClosure<Cart>) -> Cancellable
func subscribeOnProductChanging(productId: Int, completion: ParameterClosure<CartProduct>) -> Cancellable
}
protocol CartService {
var localCart: Cart? { get }
var removedProducts: [CartProduct] { get }
var notAvailableProducts: [CartProduct] { get }
public protocol CartService {
associatedtype CartType: Cart
associatedtype CartProductType: CartProduct
var localCart: CartType? { get }
var removedProducts: [CartProductType] { get }
var notAvailableProducts: [CartProductType] { get }
var promocodes: [Promocode] { get }
func updateCountInCart(for product: CartProduct, count: Int)
func updateCountInCart(for product: CartProductType, count: Int)
func updateCountInCart(for productId: Int, count: Int)
func loadRemoteCart(from localCart: Cart,
successCompletion: ParameterClosure<Cart>?,
func loadRemoteCart(successCompletion: ParameterClosure<CartType>?,
failureCompletion: ParameterClosure<BaseErrorResponseBody>?)
/**
Cлияние локальной корзины с серверной
@ -48,8 +44,8 @@ protocol CartService {
- remoteCart: `Cart` серверная корзина
- Returns: `Cart` совмещенная корзина
*/
func merge(localCart: Cart,
remoteCart: Cart) -> Cart
func merge(localCart: CartType,
remoteCart: CartType) -> CartType
/**
Замена локальной корзины серверной
- Parameters:
@ -57,6 +53,9 @@ protocol CartService {
- remoteCart: `Cart` серверная корзина
- Returns: `Cart` серверная корзина
*/
func replace(localCart: Cart,
with remoteCart: Cart) -> Cart
func replace(localCart: CartType,
with remoteCart: CartType) -> CartType
func subscribeOnCartChanging(completion: ParameterClosure<CartType>) -> Cancellable
func subscribeOnProductChanging(productId: Int, completion: ParameterClosure<CartProductType>) -> Cancellable
}

View File

@ -1,6 +1,27 @@
//
// 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.
import Foundation
protocol Price {
public protocol Price {
///Стоимость
var value: Int { get }
///Трехсимвольный код валюты в ISO 4217

View File

@ -1,5 +1,26 @@
//
// 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.
import Foundation
protocol Promocode {
public protocol Promocode {
var discount: Price? { get }
}