From eb66a4e8caa7bc57c1037493e262c71c2258578f Mon Sep 17 00:00:00 2001 From: Grigory Boyko Date: Tue, 2 Aug 2022 11:38:35 +0700 Subject: [PATCH] fix: Comments from pull request --- .../Sources/Classes/CartRequestExecutor.swift | 32 ++++++++++++++++-- .../Models/BaseErrorResponseBody.swift | 23 ++++++++++++- TIEcommerce/Sources/Models/Cart.swift | 23 ++++++++++++- TIEcommerce/Sources/Models/CartProduct.swift | 23 ++++++++++++- TIEcommerce/Sources/Models/CartService.swift | 33 +++++++++---------- TIEcommerce/Sources/Models/Price.swift | 23 ++++++++++++- TIEcommerce/Sources/Models/Promocode.swift | 23 ++++++++++++- 7 files changed, 155 insertions(+), 25 deletions(-) diff --git a/TIEcommerce/Sources/Classes/CartRequestExecutor.swift b/TIEcommerce/Sources/Classes/CartRequestExecutor.swift index 8b700d84..e37e53e2 100644 --- a/TIEcommerce/Sources/Classes/CartRequestExecutor.swift +++ b/TIEcommerce/Sources/Classes/CartRequestExecutor.swift @@ -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: 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: Cancellable { } open func handle(failure: ErrorCollection>) { - if shouldRetry(failure: failure) && 0 < 3 { + if shouldRetry(failure: failure) && numberOfAttempts > 0 { + numberOfAttempts -= 1 execute() } } diff --git a/TIEcommerce/Sources/Models/BaseErrorResponseBody.swift b/TIEcommerce/Sources/Models/BaseErrorResponseBody.swift index 79fd24cf..541b79a2 100644 --- a/TIEcommerce/Sources/Models/BaseErrorResponseBody.swift +++ b/TIEcommerce/Sources/Models/BaseErrorResponseBody.swift @@ -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 } ///Текст сообщения об ошибке diff --git a/TIEcommerce/Sources/Models/Cart.swift b/TIEcommerce/Sources/Models/Cart.swift index 3e67416e..86aaeb9c 100644 --- a/TIEcommerce/Sources/Models/Cart.swift +++ b/TIEcommerce/Sources/Models/Cart.swift @@ -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 } ///Применённые промокоды diff --git a/TIEcommerce/Sources/Models/CartProduct.swift b/TIEcommerce/Sources/Models/CartProduct.swift index 06b7b976..8c3873bb 100644 --- a/TIEcommerce/Sources/Models/CartProduct.swift +++ b/TIEcommerce/Sources/Models/CartProduct.swift @@ -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 } ///Цена в определённой валюте diff --git a/TIEcommerce/Sources/Models/CartService.swift b/TIEcommerce/Sources/Models/CartService.swift index a689db37..ebee1948 100644 --- a/TIEcommerce/Sources/Models/CartService.swift +++ b/TIEcommerce/Sources/Models/CartService.swift @@ -23,23 +23,19 @@ import Foundation import TIFoundationUtils import TISwiftUtils -protocol CartPublisher { - associatedtype Cart - func subscribeOnCartChanging(completion: ParameterClosure) -> Cancellable - func subscribeOnProductChanging(productId: Int, completion: ParameterClosure) -> 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?, + func loadRemoteCart(successCompletion: ParameterClosure?, failureCompletion: ParameterClosure?) /** 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) -> Cancellable + func subscribeOnProductChanging(productId: Int, completion: ParameterClosure) -> Cancellable } diff --git a/TIEcommerce/Sources/Models/Price.swift b/TIEcommerce/Sources/Models/Price.swift index 0e5adf3c..e94558d6 100644 --- a/TIEcommerce/Sources/Models/Price.swift +++ b/TIEcommerce/Sources/Models/Price.swift @@ -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 diff --git a/TIEcommerce/Sources/Models/Promocode.swift b/TIEcommerce/Sources/Models/Promocode.swift index 9a0896d0..58ab9faa 100644 --- a/TIEcommerce/Sources/Models/Promocode.swift +++ b/TIEcommerce/Sources/Models/Promocode.swift @@ -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 } }