feat: Add initial files for Cart module
This commit is contained in:
parent
826471c825
commit
cddae04f2e
|
|
@ -37,6 +37,9 @@ let package = Package(
|
|||
.library(name: "TITransitions", targets: ["TITransitions"]),
|
||||
.library(name: "TIPagination", targets: ["TIPagination"]),
|
||||
.library(name: "TIAuth", targets: ["TIAuth"]),
|
||||
|
||||
//MARK: - Skolkovo
|
||||
.library(name: "TIEcommerce", targets: ["TIEcommerce"])
|
||||
],
|
||||
dependencies: [
|
||||
.package(url: "https://github.com/maxsokolov/TableKit.git", .upToNextMajor(from: "2.11.0")),
|
||||
|
|
@ -80,6 +83,9 @@ let package = Package(
|
|||
.target(name: "TIPagination", dependencies: ["Cursors", "TISwiftUtils"], path: "TIPagination/Sources"),
|
||||
.target(name: "TIAuth", dependencies: ["TIFoundationUtils"], path: "TIAuth/Sources"),
|
||||
|
||||
//MARK: - Skolkovo
|
||||
.target(name: "TIEcommerce", dependencies: ["TIEcommerce"], path: "TIEcommerce/Sources"),
|
||||
|
||||
// MARK: - Tests
|
||||
|
||||
.testTarget(
|
||||
|
|
|
|||
|
|
@ -0,0 +1,25 @@
|
|||
import Foundation
|
||||
|
||||
///Содержит абстрактный метод, позволяющий получить на выходе итоговую локальную корзину. Должен поддерживать две стратегии работы:
|
||||
///- замена локальной корзины серверной `func replace(localCart:, with:) -> CartModelProtocol`
|
||||
///- слияние локальной корзины с серверной (детали слияния определяются в проекте) `func merge(localCart:, remoteCart:) -> CartModelProtocol`
|
||||
protocol CartSyncable {
|
||||
/**
|
||||
Cлияние локальной корзины с серверной
|
||||
- Parameters:
|
||||
- localCart: `Cart` – локальная корзина
|
||||
- remoteCart: `Cart` – серверная корзина
|
||||
- Returns: `Cart` – совмещенная корзина
|
||||
*/
|
||||
func merge(localCart: Cart,
|
||||
remoteCart: Cart) -> Cart
|
||||
/**
|
||||
Замена локальной корзины серверной
|
||||
- Parameters:
|
||||
- localCart: `Cart` – локальная корзина
|
||||
- remoteCart: `Cart` – серверная корзина
|
||||
- Returns: `Cart` – серверная корзина
|
||||
*/
|
||||
func replace(localCart: Cart,
|
||||
with remoteCart: Cart) -> Cart
|
||||
}
|
||||
|
|
@ -0,0 +1,9 @@
|
|||
import Foundation
|
||||
|
||||
///Содержит абстрактный метод, позволяющий отправить локальную корзину полностью и получить в ответ серверную корзину
|
||||
protocol CartUpdatable {
|
||||
///Отправляем локальную корзину полностью и получаем в ответ серверную корзину или ошибку
|
||||
func loadRemoteCart(from localCart: Cart,
|
||||
successCompletion: ParameterClosure<Cart>?,
|
||||
failureCompletion: ParameterClosure<BaseErrorResponseBody>?)
|
||||
}
|
||||
|
|
@ -0,0 +1,23 @@
|
|||
import Foundation
|
||||
|
||||
///При получении ошибки из `gnoringErrors` повторение отправки до `numberOfAttempts` раз
|
||||
class IgnoringErrorsRepeatClosure {
|
||||
private(set) var numberOfAttempts: Int
|
||||
private var ignoringErrors: Set<BaseErrorResponseBody>
|
||||
|
||||
init(ignoringErrors: Set<BaseErrorResponseBody> = [], numberOfAttempts: Int) {
|
||||
self.ignoringErrors = ignoringErrors
|
||||
self.numberOfAttempts = numberOfAttempts
|
||||
}
|
||||
|
||||
func performIfNeeded(with error: BaseErrorResponseBody,
|
||||
repeatClosure: VoidClosure,
|
||||
errorCompletion: ParameterClosure<BaseErrorResponseBody>?) {
|
||||
if ignoringErrors.contains(error) && numberOfAttempts > 0 {
|
||||
numberOfAttempts -= 1
|
||||
repeatClosure()
|
||||
} else {
|
||||
errorCompletion?(error)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,8 @@
|
|||
import Foundation
|
||||
|
||||
struct BaseErrorResponseBody: Decodable, Equatable, Hashable {
|
||||
///Код ошибки
|
||||
let errorCode: Int
|
||||
///Текст сообщения об ошибке
|
||||
let errorMessage: String
|
||||
}
|
||||
|
|
@ -0,0 +1,10 @@
|
|||
import Foundation
|
||||
|
||||
protocol Cart {
|
||||
///Продукты в корзине пользователя
|
||||
var products: [CartProduct] { get }
|
||||
///Применённые промокоды
|
||||
var promocodes: [String] { get }
|
||||
///Количество доступных бонусов для использования
|
||||
var availableBonuses: Int? { get }
|
||||
}
|
||||
|
|
@ -0,0 +1,14 @@
|
|||
import Foundation
|
||||
|
||||
protocol CartProduct {
|
||||
///Идентификатор продукта
|
||||
var id: String { get }
|
||||
///Цена в определённой валюте
|
||||
var price: CartProductPrice { get }
|
||||
///Сколько единиц есть доступно
|
||||
var availableCount: Int? { get }
|
||||
///Варианты товара (фасовка, цвет, размер, и т.п.)
|
||||
var variants: [CartProduct?] { get }
|
||||
///Количество бонусов, которые будут начислены при покупке
|
||||
var bonuses: Int? { get }
|
||||
}
|
||||
|
|
@ -0,0 +1,8 @@
|
|||
import Foundation
|
||||
|
||||
protocol CartProductPrice {
|
||||
///Стоимость
|
||||
var value: Int { get }
|
||||
///Трехсимвольный код валюты в ISO 4217
|
||||
var currencyCode: String { get }
|
||||
}
|
||||
|
|
@ -0,0 +1,16 @@
|
|||
Pod::Spec.new do |s|
|
||||
s.name = 'TIEcommerce'
|
||||
s.version = '1.25.0'
|
||||
s.summary = 'Cart'
|
||||
s.homepage = 'https://github.com/TouchInstinct/LeadKit/tree/' + s.version.to_s + '/' + s.name
|
||||
s.license = { :type => 'MIT', :file => 'LICENSE' }
|
||||
s.author = { 'petropavel13' => 'ivan.smolin@touchin.ru' }
|
||||
s.source = { :git => 'https://github.com/TouchInstinct/LeadKit.git', :tag => s.version.to_s }
|
||||
|
||||
s.ios.deployment_target = '13.0'
|
||||
s.swift_versions = ['5.3']
|
||||
|
||||
s.source_files = s.name + '/Sources/**/*'
|
||||
|
||||
s.dependency 'TIFoundationUtils', s.version.to_s
|
||||
end
|
||||
Loading…
Reference in New Issue