// // GroupDetailRepository.swift // PaiaiDataKit // // Created by ffib on 2018/12/25. // Copyright © 2018 yb. All rights reserved. // import Foundation import RxCocoa import RxSwift fileprivate struct GroupLockResource: Resource, Parsable { typealias Model = StatusModel var path: Interfaces var parameter: Parameter init(path: Interfaces, parameter: Parameter) { self.path = path self.parameter = parameter } func parse(_ json: JSON) -> StatusModel? { return StatusModel(json: json) } } fileprivate struct GroupQuitResource: Resource, Parsable { typealias Model = StatusModel var path: Interfaces { return .groupQuit } var parameter: Parameter = [:] func parse(_ json: JSON) -> StatusModel? { return StatusModel(json: json) } } public protocol GroupDetailRepositorable: Repositorable where Content == GroupDetail { init(groupId: String) } public protocol GroupDetailUpdatable: Updatable where DataType == Bool {} final public class GroupDetailRepository: Resource { var path: Interfaces { return .groupDetail } var parameter: Parameter = [:] fileprivate var item: BehaviorRelay fileprivate var loadingSchedule: PublishSubject init() { item = BehaviorRelay.init(value: GroupDetail(json: [:])) loadingSchedule = PublishSubject() } } extension GroupDetailRepository: Parsable { func parse(_ json: JSON) -> GroupDetail? { guard let data = json["data"] as? [String: AnyObject] else { return nil } return GroupDetail(json: data) } } extension GroupDetailRepository: Gettable { public func loadContent(isRefresh: Bool) { NetworkApi.share.post(resource: self) { (result) in guard case let .success(item) = result else { return } self.item.accept(item) self.loadingSchedule.onNext(true) } } } extension GroupDetailRepository: GroupDetailUpdatable { public func update(data: Bool) -> Observable { return Observable.create { observer in let _path: Interfaces = data ? .groupLock : .groupUnlock let _parameter = ["group_id": "", "user_id": ""] let resource = GroupLockResource(path: _path, parameter: _parameter) NetworkApi.share.post(resource: resource) { (result) in guard case let .success(status) = result else { return } observer.onNext(()) #warning("处理") } return Disposables.create() } } } extension GroupDetailRepository: Quittable { public func quit() -> Observable { return Observable.create { observer in let resource = GroupQuitResource(parameter: ["group_id": "", "user_id": ""]) NetworkApi.share.post(resource: resource) { (result) in guard case let .success(status) = result else { return } observer.onNext(()) #warning("处理") } return Disposables.create() } } } extension GroupDetailRepository: GroupDetailRepositorable { public var content: Observable { return item.asObservable() .flatMap { currentItem in Observable.just(currentItem) .distinctUntilChanged() }.share() } public var loadingObserver: Observable { return loadingSchedule.asObserver() .flatMap { current in Observable.just(current) }.share() } public convenience init(groupId: String) { self.init() parameter["group_id"] = groupId parameter["user_id"] = "" } }