Skip to content

Commit 86d25ea

Browse files
committed
removed order repository
1 parent 950c965 commit 86d25ea

File tree

9 files changed

+114
-78
lines changed

9 files changed

+114
-78
lines changed

src/arby.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ import { getStartShutdown$ } from './utils';
2222
import { Dictionary, Market } from 'ccxt';
2323
import { verifyMarkets } from './centralized/verify-markets';
2424
import { initDB$, InitDBparams, InitDBResponse, closeDB$ } from './db/db';
25-
import { OrderRepository } from './db/order-repository';
25+
import { saveOrder$ } from './db/order-repository';
2626

2727
type StartArbyParams = {
2828
config$: Observable<Config>;
@@ -115,7 +115,6 @@ export const startArby = ({
115115
loggers.global.info('Starting. Hello, Arby.');
116116
logConfig(config, loggers.global);
117117
verifyMarkets(config, CEXmarkets);
118-
const orderRepository = new OrderRepository(models, loggers.db);
119118
const tradeComplete$ = trade$({
120119
config,
121120
loggers,
@@ -126,7 +125,8 @@ export const startArby = ({
126125
getCentralizedExchangePrice$,
127126
CEX,
128127
store,
129-
saveOrder$: orderRepository.saveOrder$,
128+
saveOrder$,
129+
models,
130130
}).pipe(takeUntil(shutdown$));
131131
return concat(
132132
tradeComplete$,

src/centralized/execute-order.spec.ts

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,14 @@
11
import { TestScheduler } from 'rxjs/testing';
22
import { executeCEXorder$ } from './execute-order';
3-
import { getLoggers, testConfig } from '../test-utils';
3+
import { getLoggers, getModels, testConfig } from '../test-utils';
44
import BigNumber from 'bignumber.js';
55
import { CEXorder } from './order-builder';
66
import { OrderSide } from '../constants';
77
import { Config } from '../config';
88
import { Observable } from 'rxjs';
99
import { Order, Exchange } from 'ccxt';
1010
import { OrderInstance } from '../db/order';
11+
import { InitDBResponse } from '../db/db';
1112

1213
let testScheduler: TestScheduler;
1314

@@ -16,6 +17,7 @@ const assertExecuteCEXorder = (
1617
config: Config;
1718
price: BigNumber;
1819
order: CEXorder;
20+
models: InitDBResponse;
1921
createOrder$: string;
2022
unsubscribe?: string;
2123
},
@@ -38,6 +40,7 @@ const assertExecuteCEXorder = (
3840
order: inputEvents.order,
3941
createOrder$,
4042
saveOrder$,
43+
models: inputEvents.models,
4144
});
4245
expectObservable(CEXorder$, inputEvents.unsubscribe).toBe(expected, {
4346
a: null,
@@ -61,6 +64,7 @@ describe('executeCEXorder$', () => {
6164
quantity: new BigNumber('0.001'),
6265
side: OrderSide.BUY,
6366
},
67+
models: getModels(),
6468
};
6569
const expected = '5s (a|)';
6670
assertExecuteCEXorder(inputEvents, expected);
@@ -79,6 +83,7 @@ describe('executeCEXorder$', () => {
7983
quantity: new BigNumber('0.001'),
8084
side: OrderSide.BUY,
8185
},
86+
models: getModels(),
8287
};
8388
const expected = '1s (a|)';
8489
assertExecuteCEXorder(inputEvents, expected);
@@ -98,6 +103,7 @@ describe('executeCEXorder$', () => {
98103
side: OrderSide.BUY,
99104
},
100105
unsubscribe: '4s !',
106+
models: getModels(),
101107
};
102108
const expected = '';
103109
assertExecuteCEXorder(inputEvents, expected);

src/centralized/execute-order.ts

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,14 +15,20 @@ import { CreateOrderParams } from './ccxt/create-order';
1515
import { CEXorder } from './order-builder';
1616
import { SaveOrderParams } from '../db/order-repository';
1717
import { OrderInstance } from '../db/order';
18+
import { InitDBResponse } from '../db/db';
1819

1920
type ExecuteCEXorderParams = {
2021
CEX: Exchange;
2122
config: Config;
2223
logger: Logger;
2324
price: BigNumber;
2425
order: CEXorder;
25-
saveOrder$: ({ order }: SaveOrderParams) => Observable<OrderInstance>;
26+
saveOrder$: ({
27+
order,
28+
logger,
29+
models,
30+
}: SaveOrderParams) => Observable<OrderInstance>;
31+
models: InitDBResponse;
2632
createOrder$: ({
2733
config,
2834
exchange,
@@ -39,6 +45,7 @@ const executeCEXorder$ = ({
3945
order,
4046
createOrder$,
4147
saveOrder$,
48+
models,
4249
}: ExecuteCEXorderParams): Observable<null> => {
4350
if (!config.TEST_MODE) {
4451
logger.info(
@@ -54,7 +61,7 @@ const executeCEXorder$ = ({
5461
logger.info(
5562
`Centralized exchange order finished: ${JSON.stringify(order)}`
5663
);
57-
saveOrder$({ order });
64+
saveOrder$({ order, logger, models });
5865
}),
5966
catchError((e, caught) => {
6067
logger.warn(`Failed to execute CEX order: ${e}. Retrying in 1000ms`);

src/centralized/order.spec.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import { Observable } from 'rxjs';
22
import { TestScheduler } from 'rxjs/testing';
3-
import { getLoggers, testConfig } from '../test-utils';
3+
import { getLoggers, getModels, testConfig } from '../test-utils';
44
import { getCentralizedExchangeOrder$ } from './order';
55
import { CEXorder } from './order-builder';
66
import BigNumber from 'bignumber.js';
@@ -51,6 +51,7 @@ const assertCentralizedExchangeOrder = (
5151
deriveCEXorderQuantity,
5252
store,
5353
saveOrder$,
54+
models: getModels(),
5455
});
5556
expectObservable(centralizedExchangeOrder$, inputEvents.unsubscribe).toBe(
5657
expected

src/centralized/order.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ import { CEXorder, GetOrderBuilderParams } from './order-builder';
2121
import { ArbyStore } from 'src/store';
2222
import { SaveOrderParams } from '../db/order-repository';
2323
import { OrderInstance } from '../db/order';
24+
import { InitDBResponse } from '../db/db';
2425

2526
type GetCentralizedExchangeOrderParams = {
2627
CEX: Exchange;
@@ -47,6 +48,7 @@ type GetCentralizedExchangeOrderParams = {
4748
) => CEXorder;
4849
store: ArbyStore;
4950
saveOrder$: ({ order }: SaveOrderParams) => Observable<OrderInstance>;
51+
models: InitDBResponse;
5052
};
5153

5254
const getCentralizedExchangeOrder$ = ({
@@ -59,6 +61,7 @@ const getCentralizedExchangeOrder$ = ({
5961
centralizedExchangePrice$,
6062
deriveCEXorderQuantity,
6163
store,
64+
models,
6265
}: GetCentralizedExchangeOrderParams): Observable<null> => {
6366
return getOrderBuilder$({
6467
config,
@@ -85,6 +88,7 @@ const getCentralizedExchangeOrder$ = ({
8588
price,
8689
order: deriveCEXorderQuantity(order, price, config),
8790
saveOrder$,
91+
models,
8892
});
8993
})
9094
);

src/db/order-repository.ts

Lines changed: 67 additions & 69 deletions
Original file line numberDiff line numberDiff line change
@@ -8,81 +8,79 @@ import { TradeAttributes } from './trade';
88

99
type SaveOrderParams = {
1010
order: Order;
11+
models: InitDBResponse;
12+
logger: Logger;
1113
};
1214

13-
class OrderRepository {
14-
constructor(private models: InitDBResponse, private logger: Logger) {}
15+
const saveOrder$ = ({
16+
order,
17+
models,
18+
logger,
19+
}: SaveOrderParams): Observable<OrderInstance> => {
20+
logger.trace(`Saving order ${JSON.stringify(order)} into database`);
1521

16-
public saveOrder$ = ({
17-
order,
18-
}: SaveOrderParams): Observable<OrderInstance> => {
19-
this.logger.trace(`Saving order ${JSON.stringify(order)} into database`);
22+
const arbyOrder = convertToArbyOrder(order);
23+
const arbyTrades = convertToArbyTrades(order.trades, order.id);
24+
// TODO async
25+
return from(models.Order.create(arbyOrder)).pipe(
26+
mergeMap(order => {
27+
return from(models.Trade.bulkCreate(arbyTrades)).pipe(
28+
map(() => {
29+
logger.trace(`Order with id ${order.id} has been successfully saved`);
30+
return order;
31+
})
32+
);
33+
})
34+
);
35+
};
2036

21-
const arbyOrder = this.convertToArbyOrder(order);
22-
const arbyTrades = this.convertToArbyTrades(order.trades, order.id);
23-
// TODO async
24-
return from(this.models.Order.create(arbyOrder)).pipe(
25-
mergeMap(order => {
26-
return from(this.models.Trade.bulkCreate(arbyTrades)).pipe(
27-
map(() => {
28-
this.logger.trace(
29-
`Order with id ${order.id} has been successfully saved`
30-
);
31-
return order;
32-
})
33-
);
34-
})
35-
);
37+
const convertToArbyOrder = (order: Order): OrderAttributes => {
38+
return {
39+
id: order.id,
40+
datetime: order.datetime,
41+
timestamp: order.timestamp,
42+
lastTradeTimestamp: order.lastTradeTimestamp,
43+
status: order.status,
44+
symbol: order.symbol,
45+
type: order.type,
46+
side: order.side,
47+
price: order.price,
48+
average: order.average,
49+
amount: order.amount,
50+
filled: order.filled,
51+
remaining: order.remaining,
52+
cost: order.cost,
53+
info: order.info,
54+
feeType: order.fee.type,
55+
feeCurrency: order.fee.currency,
56+
feeRate: order.fee.rate,
57+
feeCost: order.fee.cost,
3658
};
59+
};
3760

38-
private convertToArbyOrder(order: Order): OrderAttributes {
39-
return {
40-
id: order.id,
41-
datetime: order.datetime,
42-
timestamp: order.timestamp,
43-
lastTradeTimestamp: order.lastTradeTimestamp,
44-
status: order.status,
45-
symbol: order.symbol,
46-
type: order.type,
47-
side: order.side,
48-
price: order.price,
49-
average: order.average,
50-
amount: order.amount,
51-
filled: order.filled,
52-
remaining: order.remaining,
53-
cost: order.cost,
54-
info: order.info,
55-
feeType: order.fee.type,
56-
feeCurrency: order.fee.currency,
57-
feeRate: order.fee.rate,
58-
feeCost: order.fee.cost,
59-
};
60-
}
61-
62-
private convertToArbyTrades(
63-
trades: Trade[],
64-
orderId: string
65-
): TradeAttributes[] {
66-
const result: TradeAttributes[] = [];
67-
trades.forEach(trade => {
68-
result.push({
69-
id: trade.id,
70-
orderId,
71-
amount: trade.amount,
72-
datetime: trade.datetime,
73-
info: trade.info,
74-
price: trade.price,
75-
timestamp: trade.timestamp,
76-
type: trade.type,
77-
side: trade.side,
78-
symbol: trade.symbol,
79-
takerOrMaker: trade.takerOrMaker,
80-
cost: trade.cost,
81-
});
61+
const convertToArbyTrades = (
62+
trades: Trade[],
63+
orderId: string
64+
): TradeAttributes[] => {
65+
const result: TradeAttributes[] = [];
66+
trades.forEach(trade => {
67+
result.push({
68+
id: trade.id,
69+
orderId,
70+
amount: trade.amount,
71+
datetime: trade.datetime,
72+
info: trade.info,
73+
price: trade.price,
74+
timestamp: trade.timestamp,
75+
type: trade.type,
76+
side: trade.side,
77+
symbol: trade.symbol,
78+
takerOrMaker: trade.takerOrMaker,
79+
cost: trade.cost,
8280
});
81+
});
8382

84-
return result;
85-
}
86-
}
83+
return result;
84+
};
8785

88-
export { OrderRepository, SaveOrderParams };
86+
export { saveOrder$, SaveOrderParams };

src/test-utils.ts

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,9 @@
11
import { Config } from './config';
22
import { Level, Loggers } from './logger';
3+
import { InitDBResponse } from './db/db';
4+
import { Sequelize } from 'sequelize';
5+
import { Order } from './db/order';
6+
import { Trade } from './db/trade';
37

48
const testConfig = (): Config => {
59
return {
@@ -22,6 +26,16 @@ const testConfig = (): Config => {
2226
};
2327
};
2428

29+
const getModels = (): InitDBResponse => {
30+
const sequelize = new Sequelize({
31+
dialect: 'sqlite',
32+
});
33+
return {
34+
Order: Order(sequelize),
35+
Trade: Trade(sequelize),
36+
};
37+
};
38+
2539
const getLoggers = (): Loggers => {
2640
const mockLogger = {
2741
warn: () => {},
@@ -44,4 +58,4 @@ type TestError = {
4458
message: string;
4559
};
4660

47-
export { getLoggers, testConfig, TestError };
61+
export { getModels, getLoggers, testConfig, TestError };

src/trade/trade.spec.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ import { Observable } from 'rxjs';
44
import { catchError } from 'rxjs/operators';
55
import { TestScheduler } from 'rxjs/testing';
66
import { getArbyStore } from '../store';
7-
import { getLoggers, testConfig, TestError } from '../test-utils';
7+
import { getLoggers, getModels, testConfig, TestError } from '../test-utils';
88
import { getNewTrade$ } from './trade';
99
import { OrderInstance } from '../db/order';
1010

@@ -90,6 +90,7 @@ const assertGetTrade = ({
9090
getCentralizedExchangePrice$,
9191
store,
9292
saveOrder$,
93+
models: getModels(),
9394
});
9495
expectObservable(trade$).toBe(expected, { a: true }, expectedError);
9596
});

0 commit comments

Comments
 (0)