Skip to content

Commit

Permalink
feat: support for adding memos to the order (#10)
Browse files Browse the repository at this point in the history
  • Loading branch information
ZJKung authored and chunkai1312 committed Jul 16, 2024
1 parent 76e5c58 commit 46f2d6c
Show file tree
Hide file tree
Showing 14 changed files with 146 additions and 53 deletions.
5 changes: 3 additions & 2 deletions package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "@fugle/trade",
"version": "2.0.1",
"version": "2.1.0",
"description": "FugleTrade API SDK for Node.js",
"main": "lib/index.js",
"types": "lib/index.d.ts",
Expand Down Expand Up @@ -34,7 +34,8 @@
},
"homepage": "https://github.com/fugle-dev/fugle-trade-node#readme",
"dependencies": {
"@fugle/trade-core": "^2.0.0",
"@fugle/trade-core": "^2.1.0",
"@fugle/trade-core-darwin-arm64": "^2.1.0",
"ini": "^2.0.0",
"inquirer": "^8.2.1",
"keytar": "^7.9.0",
Expand Down
13 changes: 7 additions & 6 deletions src/client.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,15 +6,15 @@ import { PriceFlag, Market } from './enums';
import { loadCredentials, removeCredentials } from './utils';
import { ClientConfig } from './interfaces/client-config.interface';
import { ParsedCertInfo, CertInfo } from './interfaces/parsed-cert-info-interface';
import { ParsedInventories, Stock } from './interfaces/parsed-inventories.interface';
import { ParsedInventories, renameInventoriesMemoToUserDef, Stock } from './interfaces/parsed-inventories.interface';
import { ParsedKeyInfo, KeyInfo } from './interfaces/parsed-key-info-interface';
import { ParsedMachineTime } from './interfaces/parsed-machine-time.interface';
import { ParsedOrderResult } from './interfaces/parsed-order-result.interface';
import { ParsedSettlements, Settlement } from './interfaces/parsed-settlements.interface';
import { ParsedBalanceStatus, BalanceStatus } from './interfaces/parsed-balance.interface';
import { ParsedTradeStatus, TradeStatus } from './interfaces/parsed-trade-status.interface';
import { ParsedMarketStatus, MarketStatus } from './interfaces/parsed-market-status.interface';
import { ParsedTransactions, Trade } from './interfaces/parsed-transactions.interface';
import { ParsedTransactions, renameTransactionsMemoToUserDef, Trade } from './interfaces/parsed-transactions.interface';
import { ParsedPlaceOrderResponse, PlaceOrderResponse } from './interfaces/parsed-place-order-response.interface';
import { ParsedReplaceOrderResponse, ReplaceOrderResponse } from './interfaces/parsed-replace-order-response.interface';
import { ParsedOrderResultHistory } from './interfaces/parsed-order-result-history.interface';
Expand Down Expand Up @@ -68,7 +68,7 @@ export class Client {

// Must login first
async placeOrder(order: Order): Promise<PlaceOrderResponse> {
const response = this.sdk.order(order.toObject());
const response = this.sdk.order(order.toObject(), order.payload.userDef || '');
const parsed = JSON.parse(response) as ParsedPlaceOrderResponse;
return parsed.data;
}
Expand Down Expand Up @@ -119,7 +119,7 @@ export class Client {
async getHistoricalOrders(options: { startDate: string, endDate: string }): Promise<PlacedOrder[]> {
const market: Market = Market.All;
const { startDate, endDate } = options;
const response = this.sdk.getOrderResultHistory(market, startDate, endDate);
const response = this.sdk.getOrderResultHistory(startDate, endDate, market);
const parsed = JSON.parse(response) as ParsedOrderResultHistory;
return parsed.data.orderResultHistory.map(order => new PlacedOrder({ ...order }));
}
Expand All @@ -136,14 +136,15 @@ export class Client {
const response = duration
? this.sdk.getTransactions(duration)
: this.sdk.getTransactionsByDate(startDate as string, endDate as string);
const parsed = JSON.parse(response) as ParsedTransactions;
// const parsed = JSON.parse(response) as ParsedTransactions;
const parsed = renameTransactionsMemoToUserDef(JSON.parse(response) as ParsedTransactions);
return parsed.data.matSums;
}

// Must login first
async getInventories(): Promise<Stock[]> {
const response = this.sdk.getInventories();
const parsed = JSON.parse(response) as ParsedInventories;
const parsed = renameInventoriesMemoToUserDef(JSON.parse(response) as ParsedInventories);
return parsed.data.stkSums;
}

Expand Down
1 change: 1 addition & 0 deletions src/interfaces/order-payload.interface.ts
Original file line number Diff line number Diff line change
Expand Up @@ -9,4 +9,5 @@ export interface OrderPayload {
priceFlag?: PriceFlag;
bsFlag?: BsFlag;
trade?: TradeType;
userDef?: string;
}
22 changes: 22 additions & 0 deletions src/interfaces/parsed-inventories.interface.ts
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@ export interface StockDat {
tTime: string;
valueMkt: string;
valueNow: string;
userDef: string;
}

export interface Stock {
Expand Down Expand Up @@ -54,3 +55,24 @@ export interface ParsedInventories {
stkSums: Stock[];
}
}

//helper function to map memo prop to userDef, can be remove after sdk update
export function renameInventoriesMemoToUserDef(parsedTransactions: ParsedInventories): ParsedInventories {
// Helper function to rename memo to userDef in StockDat objects
const renameInStockDat = (stockDat: StockDat & { memo?: string }): StockDat => {
const { memo, ...rest } = stockDat;
return { ...rest, userDef: memo || "" };
};

// Helper function to rename memo to userDef in Stock objects
const renameInStkDat = (trade: Stock): Stock => {
const renamedStkDats = trade.stkDats.map(renameInStockDat);
return { ...trade, stkDats: renamedStkDats };
};

// Map through the stkSums array and rename memo to userDef
const renamedStkSums = parsedTransactions.data.stkSums.map(renameInStkDat);

// Return the updated ParsedInventories object
return { data: { stkSums: renamedStkSums } };
}
16 changes: 16 additions & 0 deletions src/interfaces/parsed-order-result-history.interface.ts
Original file line number Diff line number Diff line change
Expand Up @@ -21,10 +21,26 @@ export interface OrderResultHistory {
bsFlag: string;
source?: string;
market: string;
userDef: string;
}

export interface ParsedOrderResultHistory {
data: {
orderResultHistory: OrderResultHistory[];
};
}

//helper function to map memo prop to userDef, can be remove after sdk update
export function renameMemoToUserDef(parsedTransactions: ParsedOrderResultHistory): ParsedOrderResultHistory {
// Helper function to rename memo to userDef in OrderResultHistory objects
const renameInOrderResultHistory = (tradeDate: OrderResultHistory & { memo?: string }): OrderResultHistory => {
const { memo, ...rest } = tradeDate;
return { ...rest, userDef: memo || "" };
};

// Map through the orderResultHistory array and rename memo to userDef
const renamedOrderResultHistory = parsedTransactions.data.orderResultHistory.map(renameInOrderResultHistory);

// Return the updated ParsedOrderResultHistory object
return { data: { orderResultHistory: renamedOrderResultHistory } };
}
1 change: 1 addition & 0 deletions src/interfaces/parsed-order-result.interface.ts
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@ export interface OrderResult {
errMsg: string;
avgPrice: string;
bsFlag: string;
memo: string;
}

export interface ParsedOrderResult {
Expand Down
22 changes: 22 additions & 0 deletions src/interfaces/parsed-transactions.interface.ts
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@ export interface TradeDate {
tax: string;
taxG: string;
trade: string;
userDef: string;
}

export interface Trade {
Expand All @@ -43,3 +44,24 @@ export interface ParsedTransactions {
matSums: Trade[];
};
}

//helper function to map memo prop to userDef, can be remove after sdk update
export function renameTransactionsMemoToUserDef(parsedTransactions: ParsedTransactions): ParsedTransactions {
// Helper function to rename memo to userDef in TradeDate objects
const renameInTradeDate = (tradeDate: TradeDate & { memo?: string }): TradeDate => {
const { memo, ...rest } = tradeDate;
return { ...rest, userDef: memo || "" };
};

// Helper function to rename memo to userDef in Trade objects
const renameInTrade = (trade: Trade): Trade => {
const renamedMatDats = trade.matDats.map(renameInTradeDate);
return { ...trade, matDats: renamedMatDats };
};

// Map through the matSums array and rename memo to userDef
const renamedMatSums = parsedTransactions.data.matSums.map(renameInTrade);

// Return the updated ParsedTransactions object
return { data: { matSums: renamedMatSums } };
}
2 changes: 2 additions & 0 deletions src/placed-order.ts
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,9 @@ export class PlacedOrder {
...(payload.stockNo && { stockNo: String(payload.stockNo) }),
...(payload.trade && { trade: String(payload.trade) as TradeType }),
...(payload.workDate && { workDate: String(payload.workDate) }),
...(payload.memo && { userDef: String(payload.memo) })
};
delete payload.memo;
}

get payload(): PlacedOrderPayload {
Expand Down
22 changes: 20 additions & 2 deletions test/client.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -262,16 +262,28 @@ describe('Client', () => {
const response = await client.getTransactions({ duration: '3d' });
const data = readFileSync('./test/fixtures/response-transactions.txt').toString();
const parsed = JSON.parse(data);
expect(response).toEqual(parsed.data.matSums);
const actual = renameMemoToUserDef(parsed);
expect(response).toEqual(actual.data.matSums);
});

function renameMemoToUserDef(data: { data: { matSums: any[]; }; }) {
data.data.matSums.forEach(trade => {
trade.matDats.forEach((tradeDate: { userDef: any; memo: any; }) => {
tradeDate.userDef = tradeDate.memo;
delete tradeDate.memo;
});
});
return data;
}

it('should get parsed transactions by startDate and endDate options', async () => {
const client = new Client(config);
await client.login();
const response = await client.getTransactions({ startDate: '2023-01-01', endDate: '2023-02-28' });
const data = readFileSync('./test/fixtures/response-transactions.txt').toString();
const parsed = JSON.parse(data);
expect(response).toEqual(parsed.data.matSums);
const actual = renameMemoToUserDef(parsed);
expect(response).toEqual(actual.data.matSums);
});
});

Expand All @@ -282,6 +294,12 @@ describe('Client', () => {
const response = await client.getInventories();
const data = readFileSync('./test/fixtures/response-inventories.txt').toString();
const parsed = JSON.parse(data);
parsed.data.stkSums.forEach((stk: { stkDats: any[]; }) => {
stk.stkDats.forEach((dat: { userDef: any; memo: any; }) => {
dat.userDef = dat.memo;
delete dat.memo;
});
});
expect(response).toEqual(parsed.data.stkSums);
});
});
Expand Down
15 changes: 10 additions & 5 deletions test/fixtures/response-inventories.txt
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,8 @@
"valueNow": "3148",
"makeA": "725",
"makeAPer": "30.21",
"priceEvn": "25.78"
"priceEvn": "25.78",
"memo": ""
},
{
"tDate": "20200807",
Expand All @@ -47,7 +48,8 @@
"valueNow": "4387",
"makeA": "762",
"makeAPer": "21.16",
"priceEvn": "27.67"
"priceEvn": "27.67",
"memo": ""
},
{
"tDate": "20210113",
Expand All @@ -70,7 +72,8 @@
"valueNow": "8405",
"makeA": "1176",
"makeAPer": "16.33",
"priceEvn": "28.80"
"priceEvn": "28.80",
"memo": ""
},
{
"tDate": "20211022",
Expand All @@ -93,7 +96,8 @@
"valueNow": "10884",
"makeA": "55",
"makeAPer": "0.51",
"priceEvn": "33.33"
"priceEvn": "33.33",
"memo": ""
},
{
"tDate": "20220207",
Expand All @@ -116,7 +120,8 @@
"valueNow": "3784",
"makeA": "161",
"makeAPer": "4.47",
"priceEvn": "32.07"
"priceEvn": "32.07",
"memo": ""
}
],
"stkNo": "0056",
Expand Down
3 changes: 2 additions & 1 deletion test/fixtures/response-order-history-from-sdk.txt
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,8 @@
"celQtyShare": "0",
"celable": "1",
"avgPrice": "0",
"bsFlag": "R"
"bsFlag": "R",
"memo": ""
}
]
}
Expand Down
6 changes: 4 additions & 2 deletions test/fixtures/response-orders-from-sdk.txt
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,8 @@
"errCode": "00000000",
"errMsg": "",
"avgPrice": "0",
"bsFlag": "R"
"bsFlag": "R",
"memo": ""
},
{
"workDate": "20220222",
Expand All @@ -50,7 +51,8 @@
"errCode": "00000000",
"errMsg": "",
"avgPrice": "0.0",
"bsFlag": "R"
"bsFlag": "R",
"memo": ""
}
]
}
Expand Down
3 changes: 2 additions & 1 deletion test/fixtures/response-transactions.txt
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,8 @@
"payN": "-30042",
"make": "0",
"makePer": "0.00",
"cDate": "20220222"
"cDate": "20220222",
"memo": ""
}
],
"tDate": "20220222",
Expand Down
Loading

0 comments on commit 46f2d6c

Please sign in to comment.