aboutsummaryrefslogtreecommitdiffstats
path: root/packages/pipeline/src/scripts/pull_radar_relay_orders.ts
blob: c4d3f70954aa126c20fa9b74022d2ae93c7d1709 (plain) (blame)
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
// tslint:disable:no-console
import { HttpClient } from '@0x/connect';
import * as R from 'ramda';
import 'reflect-metadata';
import { Connection, ConnectionOptions, createConnection } from 'typeorm';

import { SraOrder } from '../entities';
import * as ormConfig from '../ormconfig';
import { parseSraOrders } from '../parsers/sra_orders';
import { handleError } from '../utils';

const RADAR_RELAY_URL = 'https://api.radarrelay.com/0x/v2';
const BATCH_SAVE_SIZE = 1000; // Number of orders to save at once.
const ORDERS_PER_PAGE = 10000; // Number of orders to get per request.

let connection: Connection;

(async () => {
    connection = await createConnection(ormConfig as ConnectionOptions);
    await getOrderbook();
    process.exit(0);
})().catch(handleError);

async function getOrderbook(): Promise<void> {
    console.log('Getting all orders...');
    const connectClient = new HttpClient(RADAR_RELAY_URL);
    const rawOrders = await connectClient.getOrdersAsync({
        perPage: ORDERS_PER_PAGE,
    });
    console.log(`Got ${rawOrders.records.length} orders.`);
    console.log('Parsing orders...');
    const orders = R.pipe(parseSraOrders, R.map(setSourceUrl(RADAR_RELAY_URL)))(rawOrders);
    const ordersRepository = connection.getRepository(SraOrder);
    // TODO(albrow): Move batch saving to a utility function to reduce
    // duplicated code.
    for (const ordersBatch of R.splitEvery(BATCH_SAVE_SIZE, orders)) {
        await ordersRepository.save(ordersBatch);
    }
}

const sourceUrlProp = R.lensProp('sourceUrl');

const setSourceUrl = R.curry((sourceURL: string, order: SraOrder): SraOrder => {
    return R.set(sourceUrlProp, sourceURL, order);
});

const firstSeenProp = R.lensProp('firstSeenTimestamp');
const lastUpdatedProp = R.lensProp('lastUpdatedTimestamp');

const setFirstSeen = R.curry((sourceURL: string, order: SraOrder): SraOrder => {
    return R.set(firstSeenTimestampProp, sourceURL, order);
});