|
//
// 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<GroupDetail>
fileprivate var loadingSchedule: PublishSubject<Bool>
init() {
item = BehaviorRelay<GroupDetail>.init(value: GroupDetail(json: [:]))
loadingSchedule = PublishSubject<Bool>()
}
}
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<Void> {
return Observable<Void>.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<Void> {
return Observable<Void>.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<GroupDetail> {
return item.asObservable()
.flatMap { currentItem in
Observable.just(currentItem)
.distinctUntilChanged()
}.share()
}
public var loadingObserver: Observable<Bool> {
return loadingSchedule.asObserver()
.flatMap { current in
Observable.just(current)
}.share()
}
public convenience init(groupId: String) {
self.init()
parameter["group_id"] = groupId
parameter["user_id"] = ""
}
}
|