From 65d6756582126fbeb397061cc334463f4e5a5c74 Mon Sep 17 00:00:00 2001 From: Carter Bertolini Date: Fri, 10 Nov 2023 16:45:49 -0500 Subject: [PATCH] Replace classes with interfaces in action. --- src/alpaca/actions.ts | 24 ++++++++-------- src/interface/actions.ts | 61 ++++++---------------------------------- test/alpaca.test.ts | 18 ++++++++---- 3 files changed, 32 insertions(+), 71 deletions(-) diff --git a/src/alpaca/actions.ts b/src/alpaca/actions.ts index 471f6dc..1be98b9 100644 --- a/src/alpaca/actions.ts +++ b/src/alpaca/actions.ts @@ -1,5 +1,5 @@ import Alpaca from '@alpacahq/alpaca-trade-api'; -import { Action, ActionSide, ActionFetchOptions, ActionFetchResponse, ActionDateType } from '../interface/actions'; +import { ActionSide, ActionFetchOptions, ActionFetchResponse, ActionDateType } from '../interface/actions'; interface AlpacaActivity { id: string; @@ -29,20 +29,20 @@ export class AlpacaActionProvider { pageSize: options.pageSize, pageToken: undefined, }) as Promise).then((activities) => { - return new ActionFetchResponse( - activities + return { + actions: activities .filter((activity) => activity.order_status === "filled") .map((activity) => { - return new Action( - activity.symbol, - parseInt(activity.qty, 10), - activity.side === "buy" ? ActionSide.Buy : ActionSide.Sell, - parseFloat(activity.price), - new Date(activity.transaction_time), - ); + return { + symbol: activity.symbol, + quantity: parseInt(activity.qty, 10), + side: activity.side === "buy" ? ActionSide.Buy : ActionSide.Sell, + pricePerShare: parseFloat(activity.price), + timestamp: new Date(activity.transaction_time), + }; }), - undefined - ); + fetchNextPage: undefined + }; }).catch((err) => { return err; }); diff --git a/src/interface/actions.ts b/src/interface/actions.ts index 91ca388..e03b8af 100644 --- a/src/interface/actions.ts +++ b/src/interface/actions.ts @@ -9,7 +9,8 @@ export const enum ActionSide { /** * Represents an action taken on a stock, such as a buy or sell order. */ -export class Action { +export interface Action { + /** * The symbol of the asset being traded. */ @@ -34,23 +35,6 @@ export class Action { * The timestamp of the action */ readonly timestamp: Date; - - /** - * Represents a user Action. - * @constructor - * @param {string} symbol - The symbol of the asset being traded. - * @param {number} quantity - The quantity of the asset being traded. - * @param {ActionSide} side - The side of the trade (buy or sell). - * @param {number} pricePerShare - The price per share of the asset being traded. - * @param {Date} timestamp - The timestamp of the action. - */ - constructor(symbol: string, quantity: number, side: ActionSide, pricePerShare: number, timestamp: Date) { - this.symbol = symbol; - this.quantity = quantity; - this.side = side; - this.pricePerShare = pricePerShare; - this.timestamp = timestamp; - } } /** @@ -66,7 +50,8 @@ export const enum ActionDateType { /** * Represents options for a date filter in an action fetch. */ -export class ActionDateOptions { +export interface ActionDateOptions { + /** * The date to filter on. */ @@ -76,22 +61,13 @@ export class ActionDateOptions { * The type of date filter to use. */ readonly dateType: ActionDateType; - - /** - * Creates a new ActionDateOptions instance. - * @param date The date to filter on. - * @param dateType The type of date filter to use. - */ - constructor(date: Date, dateType: ActionDateType) { - this.date = date; - this.dateType = dateType; - } } /** * Represents the options for fetching actions. */ -export class ActionFetchOptions { +export interface ActionFetchOptions { + /** * The number of items to fetch per page. */ @@ -101,23 +77,13 @@ export class ActionFetchOptions { * The date options for filtering actions. */ readonly dateOptions?: ActionDateOptions; - - /** - * Creates a set of options for an Action fetch. - * @constructor - * @param pageSize - The size of the page if paging is desired. - * @param dateOptions - The options for Date filtering. - */ - constructor(pageSize?: number, dateOptions?: ActionDateOptions) { - this.pageSize = pageSize; - this.dateOptions = dateOptions; - } } /** * Represents the response of a fetch action request. */ -export class ActionFetchResponse { +export interface ActionFetchResponse { + /** * An array of `Action` objects. */ @@ -128,17 +94,6 @@ export class ActionFetchResponse { * Returns a promise that resolves to an `ActionFetchResponse` object. */ readonly fetchNextPage?: () => Promise; - - /** - * Creates an instance of the Actions class. - * @constructor - * @param actions The list of actions. - * @param fetchNextPage A function that fetches the next page of actions. - */ - constructor(actions: Action[], fetchNextPage?: () => Promise) { - this.actions = actions; - this.fetchNextPage = fetchNextPage; - } } /** diff --git a/test/alpaca.test.ts b/test/alpaca.test.ts index 9c23980..eff46d5 100644 --- a/test/alpaca.test.ts +++ b/test/alpaca.test.ts @@ -1,6 +1,6 @@ import { describe, expect, test } from '@jest/globals'; import 'dotenv/config'; -import { ActionDateOptions, ActionDateType, ActionFetchOptions, AlpacaExchange } from '../src/index'; +import { ActionDateType, AlpacaExchange } from '../src/index'; import { createLogger, transports, format } from "winston"; const timeout = 10000; @@ -39,9 +39,15 @@ describe('Alpaca Tests', () => { expect(process.env.ALPACA_SECRET_KEY).toBeDefined(); const exchange = new AlpacaExchange(process.env.ALPACA_API_KEY!, process.env.ALPACA_SECRET_KEY!, true); - const fetchOptions = new ActionFetchOptions(undefined, new ActionDateOptions(new Date("2023-10-23T13:30:28.163Z"), ActionDateType.On)); + const date = new Date("2023-10-23T13:30:28.163Z"); - const response = await exchange.actionProvider.fetchActions(fetchOptions); + const response = await exchange.actionProvider.fetchActions({ + pageSize: undefined, + dateOptions: { + date: date, + dateType: ActionDateType.On + } + }); expect(response).toBeDefined(); @@ -55,9 +61,9 @@ describe('Alpaca Tests', () => { expect(action.pricePerShare).toBeDefined(); expect(action.timestamp).toBeDefined(); - expect(action.timestamp.getFullYear()).toBe(2023); - expect(action.timestamp.getMonth()).toBe(9); - expect(action.timestamp.getDate()).toBe(23); + expect(action.timestamp.getFullYear()).toBe(date.getFullYear()); + expect(action.timestamp.getMonth()).toBe(date.getMonth()); + expect(action.timestamp.getDate()).toBe(date.getDate()); } }, timeout); });