This repository has been archived by the owner on Jan 4, 2023. It is now read-only.
/
PlaceBidNetworkModel.swift
63 lines (45 loc) · 2.06 KB
/
PlaceBidNetworkModel.swift
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
import Foundation
import RxSwift
import Moya
import SwiftyJSON
let OutbidDomain = "Outbid"
protocol PlaceBidNetworkModelType {
var bidDetails: BidDetails { get }
func bid(_ provider: AuthorizedNetworking) -> Observable<String>
}
class PlaceBidNetworkModel: NSObject, PlaceBidNetworkModelType {
let bidDetails: BidDetails
init(bidDetails: BidDetails) {
self.bidDetails = bidDetails
super.init()
}
func bid(_ provider: AuthorizedNetworking) -> Observable<String> {
let saleArtwork = bidDetails.saleArtwork.value
assert(saleArtwork.hasValue, "Sale artwork cannot nil at bidding stage.")
let cents = (bidDetails.bidAmountCents.value?.currencyValue) ?? 0
return bidOnSaleArtwork(saleArtwork!, bidAmountCents: String(cents), provider: provider)
}
fileprivate func bidOnSaleArtwork(_ saleArtwork: SaleArtwork, bidAmountCents: String, provider: AuthorizedNetworking) -> Observable<String> {
let bidEndpoint = ArtsyAuthenticatedAPI.placeABid(auctionID: saleArtwork.auctionID!, artworkID: saleArtwork.artwork.id, maxBidCents: bidAmountCents)
let request = provider
.request(bidEndpoint)
.filterSuccessfulStatusCodes()
.mapJSON()
.mapTo(object: BidderPosition.self)
return request
.map { position in
return position.id
}.catchError { e -> Observable<String> in
// We've received an error. We're going to check to see if it's type is "param_error", which indicates we were outbid.
guard let error = e as? MoyaError else { throw e }
guard case .statusCode(let response) = error else { throw e }
let json = try JSON(data: response.data)
if let type = json["type"].string , type == "param_error" {
throw NSError(domain: OutbidDomain, code: 0, userInfo: [NSUnderlyingErrorKey: error as NSError])
} else {
throw error
}
}
.logError()
}
}