Skip to content

Commit 33dd095

Browse files
author
Fernando Fernandes
committed
Place order draft-ish
1 parent c2aa572 commit 33dd095

10 files changed

+185
-5
lines changed
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
//
2+
// KucoinFuturesPlaceOrder.swift
3+
//
4+
//
5+
// Created by Fernando Fernandes on 07.02.22.
6+
//
7+
8+
import Foundation
9+
10+
/// Kucoin "Place an Order" REST API response.
11+
///
12+
/// https://docs.kucoin.com/futures/#place-an-order
13+
public struct KucoinFuturesPlaceOrder: Codable {
14+
public let code: String
15+
public let data: KucoinFuturesOrderPlaced
16+
}
17+
18+
public struct KucoinFuturesOrderPlaced: Codable {
19+
public let orderId: String
20+
}

Sources/SwiftTrader/Network/Kucoin/KucoinAPI.swift

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,8 +14,8 @@ public struct KucoinAPI {
1414

1515
public struct Path {
1616
static let accountOverview = "/api/v1/account-overview"
17-
static let orderList = "/api/v1/orders"
18-
static let positionList = "/api/v1/positions"
17+
static let orders = "/api/v1/orders"
18+
static let positions = "/api/v1/positions"
1919
}
2020

2121
public struct URL {

Sources/SwiftTrader/Network/Kucoin/Orders/KucoinFuturesOrderListResource.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ public struct KucoinFuturesOrderListResource: NetworkResource {
2020
guard var urlComponents = URLComponents(string: baseURLString) else {
2121
throw NetworkRequestError.invalidURLString(urlString: baseURLString)
2222
}
23-
urlComponents.path = KucoinAPI.Futures.Path.orderList
23+
urlComponents.path = KucoinAPI.Futures.Path.orders
2424
let queryItems = [
2525
URLQueryItem(name: KucoinAPI.QueryParam.orderStatus, value: orderStatus.rawValue)
2626
]

Sources/SwiftTrader/Network/Kucoin/Orders/KucoinFuturesOrdersListRequest.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@ public struct KucoinFuturesOrdersListRequest: NetworkRequest {
4646

4747
// MARK: - Lifecycle
4848

49-
/// Creates a new `KucoinFuturesAccountOverviewRequest` instance.
49+
/// Creates a new `KucoinFuturesOrdersListRequest` instance.
5050
///
5151
/// - Parameters:
5252
/// - session: `URLSession`, default is `.shared`.
Lines changed: 91 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,91 @@
1+
//
2+
// KucoinFuturesPlaceOrdersRequest.swift
3+
//
4+
//
5+
// Created by Fernando Fernandes on 07.02.22.
6+
//
7+
8+
import Foundation
9+
#if canImport(FoundationNetworking)
10+
import FoundationNetworking
11+
#endif
12+
import Logging
13+
14+
/// The **request** for placing an order.
15+
///
16+
/// https://docs.kucoin.com/futures/#place-an-order
17+
public struct KucoinFuturesPlaceOrdersRequest: NetworkRequest {
18+
19+
// MARK: - Properties
20+
21+
public typealias DecodableModel = KucoinFuturesPlaceOrder
22+
23+
public var logger: Logger {
24+
NetworkRequestLogger().default
25+
}
26+
27+
public var session: URLSession
28+
29+
public var request: URLRequest {
30+
get throws {
31+
let futuresPlaceOrderResource = KucoinFuturesPlaceOrderResource(orderStatus: .active)
32+
var urlRequest = URLRequest(url: try futuresPlaceOrderResource.url)
33+
urlRequest.httpMethod = HTTPMethod.POST.rawValue
34+
35+
#warning("TODO: This has to be parameterized")
36+
var json = [String:Any]()
37+
json["symbol"] = "XBTUSDM"
38+
json["price"] = "42000"
39+
json["closeOrder"] = true
40+
41+
do {
42+
let data = try JSONSerialization.data(withJSONObject: json, options: [])
43+
urlRequest.httpBody = data
44+
urlRequest.addValue("application/json", forHTTPHeaderField: "Content-Type")
45+
urlRequest.addValue("application/json", forHTTPHeaderField: "Accept")
46+
} catch {
47+
#warning("TODO: handle error")
48+
print("EEEERRRRRROOORRR")
49+
}
50+
try KucoinAPI.setRequestHeaderFields(request: &urlRequest, kucoinAuth: kucoinAuth)
51+
return urlRequest
52+
}
53+
}
54+
55+
public var settings: NetworkRequestSettings
56+
57+
// MARK: Private
58+
59+
#warning("TODO: change from orderStatus to whatever needs sending")
60+
private let orderStatus: KucoinOrderStatus
61+
62+
private let kucoinAuth: KucoinAuth
63+
64+
// MARK: - Lifecycle
65+
66+
/// Creates a new `KucoinFuturesPlaceOrdersRequest` instance.
67+
///
68+
/// - Parameters:
69+
/// - session: `URLSession`, default is `.shared`.
70+
/// - orderStatus: `KucoinFuturesOrderStatus`, default is `.active`.
71+
/// - kucoinAuth: Kucoin authentication data.
72+
/// - settings: `NetworkRequestSettings`.
73+
public init(session: URLSession = .shared,
74+
orderStatus: KucoinOrderStatus = .active,
75+
kucoinAuth: KucoinAuth,
76+
settings: NetworkRequestSettings) {
77+
self.session = session
78+
self.orderStatus = orderStatus
79+
self.kucoinAuth = kucoinAuth
80+
self.settings = settings
81+
}
82+
}
83+
84+
// MARK: - Network Request Protocol
85+
86+
public extension KucoinFuturesPlaceOrdersRequest {
87+
88+
func decode(_ data: Data) throws -> DecodableModel {
89+
try JSONDecoder().decode(KucoinFuturesPlaceOrder.self, from: data)
90+
}
91+
}
Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
//
2+
// KucoinFuturesPlaceOrderResource.swift
3+
//
4+
//
5+
// Created by Fernando Fernandes on 07.02.22.
6+
//
7+
8+
import Foundation
9+
10+
/// The **resource** for placing an order.
11+
///
12+
/// https://docs.kucoin.com/futures/#place-an-order
13+
public struct KucoinFuturesPlaceOrderResource: NetworkResource {
14+
15+
// MARK: - Properties
16+
17+
public var url: URL {
18+
get throws {
19+
let baseURLString = KucoinAPI.Futures.URL.base
20+
guard var urlComponents = URLComponents(string: baseURLString) else {
21+
throw NetworkRequestError.invalidURLString(urlString: baseURLString)
22+
}
23+
urlComponents.path = KucoinAPI.Futures.Path.orders
24+
guard let url = urlComponents.url else {
25+
throw NetworkRequestError.invalidURLString(urlString: baseURLString)
26+
}
27+
return url
28+
}
29+
}
30+
31+
// MARK: Private
32+
33+
#warning("TODO: change from orderStatus to whatever needs sending")
34+
private let orderStatus: KucoinOrderStatus
35+
36+
// MARK: - Lifecycle
37+
38+
/// Creates a new `KucoinFuturesPlaceOrderResource` instance.
39+
///
40+
/// - Parameter orderStatus: `KucoinFuturesOrderStatus`.
41+
init(orderStatus: KucoinOrderStatus) {
42+
self.orderStatus = orderStatus
43+
}
44+
}

Sources/SwiftTrader/Network/Kucoin/Positions/KucoinFuturesPositionListResource.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ public struct KucoinFuturesPositionListResource: NetworkResource {
2020
guard var urlComponents = URLComponents(string: baseURLString) else {
2121
throw NetworkRequestError.invalidURLString(urlString: baseURLString)
2222
}
23-
urlComponents.path = KucoinAPI.Futures.Path.positionList
23+
urlComponents.path = KucoinAPI.Futures.Path.positions
2424
guard let url = urlComponents.url else {
2525
throw NetworkRequestError.invalidURLString(urlString: baseURLString)
2626
}

Sources/SwiftTrader/SwiftTrader.swift

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,25 @@ public extension SwiftTrader {
7070
}
7171
}
7272

73+
// MARK: Place Order
74+
75+
func kucoinFuturesPlaceOrder() async throws -> Result<KucoinFuturesPlaceOrder, SwiftTraderError> {
76+
let request = KucoinFuturesPlaceOrdersRequest(
77+
kucoinAuth: kucoinAuth,
78+
settings: settings.networkRequestSettings
79+
)
80+
switch await request.execute() {
81+
case .success(let model):
82+
guard let placeOrder = model as? KucoinFuturesPlaceOrder else {
83+
return .failure(.unexpectedResponse(modelString: "\(model)"))
84+
}
85+
return .success(placeOrder)
86+
case .failure(let error):
87+
let swiftTraderError = handle(networkRequestError: error, operation: .kucoinFuturesPlaceOrder)
88+
return .failure(swiftTraderError)
89+
}
90+
}
91+
7392
// MARK: Positions
7493

7594
func kucoinFuturesPositionList() async throws -> Result<KucoinFuturesPositionList, SwiftTraderError> {
@@ -106,6 +125,8 @@ private extension SwiftTrader {
106125
return .kucoinFuturesAccountOverviewError(error: networkRequestError)
107126
case .kucoinFuturesOrderList:
108127
return .kucoinOrderListError(error: networkRequestError)
128+
case .kucoinFuturesPlaceOrder:
129+
return .kucoinPlaceOrderError(error: networkRequestError)
109130
case .kucoinFuturesPositionList:
110131
return .kucoinPositionListError(error: networkRequestError)
111132
}

Sources/SwiftTrader/SwiftTraderError.swift

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,9 @@ public enum SwiftTraderError: Error {
2020
/// And error ocurred while executing the function `SwiftTrader.kucoinFuturesAccountOverview(currencySymbol:)`.
2121
case kucoinFuturesAccountOverviewError(error: Error)
2222

23+
/// And error ocurred while executing the function `SwiftTrader.kucoinFuturesPlaceOrder()`.
24+
case kucoinPlaceOrderError(error: Error)
25+
2326
/// And error ocurred while executing the function `SwiftTrader.kucoinFuturesOrderList(orderStatus:)`.
2427
case kucoinOrderListError(error: Error)
2528

Sources/SwiftTrader/SwiftTraderOperation.swift

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,5 +11,6 @@ import Foundation
1111
public enum SwiftTraderOperation {
1212
case kucoinFuturesAccountOverview
1313
case kucoinFuturesOrderList
14+
case kucoinFuturesPlaceOrder
1415
case kucoinFuturesPositionList
1516
}

0 commit comments

Comments
 (0)