feat: Add initial files for Cart module

This commit is contained in:
Grigory Boyko 2022-07-29 21:08:11 +07:00
parent 826471c825
commit cddae04f2e
9 changed files with 119 additions and 0 deletions

View File

@ -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(

View File

@ -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
}

View File

@ -0,0 +1,9 @@
import Foundation
///Содержит абстрактный метод, позволяющий отправить локальную корзину полностью и получить в ответ серверную корзину
protocol CartUpdatable {
///Отправляем локальную корзину полностью и получаем в ответ серверную корзину или ошибку
func loadRemoteCart(from localCart: Cart,
successCompletion: ParameterClosure<Cart>?,
failureCompletion: ParameterClosure<BaseErrorResponseBody>?)
}

View File

@ -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)
}
}
}

View File

@ -0,0 +1,8 @@
import Foundation
struct BaseErrorResponseBody: Decodable, Equatable, Hashable {
///Код ошибки
let errorCode: Int
///Текст сообщения об ошибке
let errorMessage: String
}

View File

@ -0,0 +1,10 @@
import Foundation
protocol Cart {
///Продукты в корзине пользователя
var products: [CartProduct] { get }
///Применённые промокоды
var promocodes: [String] { get }
///Количество доступных бонусов для использования
var availableBonuses: Int? { get }
}

View File

@ -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 }
}

View File

@ -0,0 +1,8 @@
import Foundation
protocol CartProductPrice {
///Стоимость
var value: Int { get }
///Трехсимвольный код валюты в ISO 4217
var currencyCode: String { get }
}

View File

@ -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