Replace classes with interfaces in action.

This commit is contained in:
Carter Bertolini 2023-11-10 16:45:49 -05:00
parent 985a155dbe
commit 65d6756582
3 changed files with 32 additions and 71 deletions

View File

@ -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<AlpacaActivity[]>).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;
});

View File

@ -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<ActionFetchResponse>;
/**
* 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<ActionFetchResponse>) {
this.actions = actions;
this.fetchNextPage = fetchNextPage;
}
}
/**

View File

@ -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);
});