@copytrade/shared-types
Version:
Shared TypeScript types for CopyTrade application
279 lines (278 loc) • 8.65 kB
JavaScript
"use strict";
/**
* Shared Constants for CopyTrade Application
*
* This file contains all constants used across:
* - Broker modules
* - Unified broker module
* - Backend services
* - Frontend UI
* - Database structures
*/
Object.defineProperty(exports, "__esModule", { value: true });
exports.getTokenExpiryHours = exports.isOrderFinal = exports.getBrokerDisplayName = exports.requiresOAuth = exports.isAccountActive = exports.UI_CONSTANTS = exports.VALIDATION = exports.TOKEN_EXPIRY = exports.DB_FIELDS = exports.API_ERROR_CODE = exports.ORDER_STATUS = exports.PRODUCT_TYPE = exports.ORDER_TYPE = exports.ORDER_ACTION = exports.EXCHANGES = exports.BROKER_DISPLAY_NAMES = exports.BROKER_NAMES = exports.AUTHENTICATION_STEP = exports.ACCOUNT_STATUS = void 0;
// ============================================================================
// ACCOUNT STATUS CONSTANTS
// ============================================================================
/**
* Account authentication status enum
* Used across database, API responses, and UI
*/
exports.ACCOUNT_STATUS = {
ACTIVE: 'ACTIVE',
INACTIVE: 'INACTIVE',
PROCEED_TO_OAUTH: 'PROCEED_TO_OAUTH'
};
// ============================================================================
// AUTHENTICATION STEP CONSTANTS
// ============================================================================
/**
* Authentication flow steps
* Used in broker connections and OAuth flows
*/
exports.AUTHENTICATION_STEP = {
DIRECT_AUTH: 'DIRECT_AUTH',
OAUTH_REQUIRED: 'OAUTH_REQUIRED',
OAUTH_PENDING: 'OAUTH_PENDING',
ACTIVE: 'ACTIVE',
INACTIVE: 'INACTIVE',
EXPIRED: 'EXPIRED',
ERROR: 'ERROR'
};
// ============================================================================
// BROKER CONSTANTS
// ============================================================================
/**
* Supported broker names
*/
exports.BROKER_NAMES = {
SHOONYA: 'shoonya',
FYERS: 'fyers',
ZERODHA: 'zerodha',
UPSTOX: 'upstox',
ANGEL_ONE: 'angelone'
};
/**
* Broker display names for UI
*/
exports.BROKER_DISPLAY_NAMES = {
[]: 'Shoonya (Finvasia)',
[]: 'FYERS',
[]: 'Zerodha',
[]: 'Upstox',
[]: 'Angel One'
};
// ============================================================================
// EXCHANGE CONSTANTS
// ============================================================================
/**
* Supported exchanges
*/
exports.EXCHANGES = {
NSE: 'NSE',
BSE: 'BSE',
NFO: 'NFO',
BFO: 'BFO',
MCX: 'MCX',
CDS: 'CDS',
NIPO: 'NIPO',
BSTAR: 'BSTAR'
};
// ============================================================================
// ORDER CONSTANTS
// ============================================================================
/**
* Order actions
*/
exports.ORDER_ACTION = {
BUY: 'BUY',
SELL: 'SELL'
};
/**
* Order types
*/
exports.ORDER_TYPE = {
MARKET: 'MARKET',
LIMIT: 'LIMIT',
SL_LIMIT: 'SL-LIMIT',
SL_MARKET: 'SL-MARKET'
};
/**
* Product types
*/
exports.PRODUCT_TYPE = {
CNC: 'CNC', // Cash and Carry
MIS: 'MIS', // Margin Intraday Squareoff
NRML: 'NRML', // Normal
BO: 'BO', // Bracket Order
CO: 'CO', // Cover Order
C: 'C', // Cash (Shoonya)
M: 'M', // Margin (Shoonya)
H: 'H', // Hold (Shoonya)
B: 'B' // Bracket (Shoonya)
};
/**
* Order status
*/
exports.ORDER_STATUS = {
SUBMITTED: 'SUBMITTED',
PLACED: 'PLACED',
PENDING: 'PENDING',
PARTIALLY_FILLED: 'PARTIALLY_FILLED',
EXECUTED: 'EXECUTED',
REJECTED: 'REJECTED',
CANCELLED: 'CANCELLED',
FAILED: 'FAILED'
};
// ============================================================================
// API ERROR CODES
// ============================================================================
/**
* Standardized API error codes
*/
exports.API_ERROR_CODE = {
INVALID_CREDENTIALS: 'INVALID_CREDENTIALS',
ACCOUNT_NOT_FOUND: 'ACCOUNT_NOT_FOUND',
BROKER_CONNECTION_FAILED: 'BROKER_CONNECTION_FAILED',
BROKER_ERROR: 'BROKER_ERROR',
VALIDATION_ERROR: 'VALIDATION_ERROR',
AUTHENTICATION_REQUIRED: 'AUTHENTICATION_REQUIRED',
OAUTH_ERROR: 'OAUTH_ERROR',
TOKEN_EXPIRED: 'TOKEN_EXPIRED',
INSUFFICIENT_FUNDS: 'INSUFFICIENT_FUNDS',
ORDER_REJECTED: 'ORDER_REJECTED',
RATE_LIMIT_EXCEEDED: 'RATE_LIMIT_EXCEEDED',
INTERNAL_SERVER_ERROR: 'INTERNAL_SERVER_ERROR'
};
// ============================================================================
// DATABASE FIELD NAMES
// ============================================================================
/**
* Standardized database field names
* Used across MongoDB adapters
*/
exports.DB_FIELDS = {
// User fields
USER_ID: 'user_id',
EMAIL: 'email',
NAME: 'name',
PASSWORD: 'password',
CREATED_AT: 'created_at',
UPDATED_AT: 'updated_at',
// Connected Account fields
BROKER_NAME: 'broker_name',
ACCOUNT_ID: 'account_id',
USER_NAME: 'user_name',
BROKER_DISPLAY_NAME: 'broker_display_name',
EXCHANGES: 'exchanges',
PRODUCTS: 'products',
ENCRYPTED_CREDENTIALS: 'encrypted_credentials',
ACCOUNT_STATUS: 'account_status',
TOKEN_EXPIRY_TIME: 'token_expiry_time',
// Order History fields
BROKER_ORDER_ID: 'broker_order_id',
SYMBOL: 'symbol',
EXCHANGE: 'exchange',
ACTION: 'action',
QUANTITY: 'quantity',
ORDER_TYPE: 'order_type',
PRODUCT_TYPE: 'product_type',
PRICE: 'price',
TRIGGER_PRICE: 'trigger_price',
ORDER_STATUS: 'order_status',
EXECUTED_QUANTITY: 'executed_quantity',
EXECUTED_PRICE: 'executed_price',
ORDER_TIME: 'order_time',
EXECUTION_TIME: 'execution_time',
ERROR_MESSAGE: 'error_message'
};
// ============================================================================
// TOKEN EXPIRY CONSTANTS
// ============================================================================
/**
* Token expiry settings for different brokers
*/
exports.TOKEN_EXPIRY = {
SHOONYA_HOURS: null, // Infinity - tokens don't expire
FYERS_HOURS: 24, // 24 hours
DEFAULT_HOURS: 24 // Default for new brokers
};
// ============================================================================
// VALIDATION CONSTANTS
// ============================================================================
/**
* Validation rules and limits
*/
exports.VALIDATION = {
PASSWORD_MIN_LENGTH: 8,
PASSWORD_PATTERN: /^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)/,
EMAIL_PATTERN: /^[^\s@]+@[^\s@]+\.[^\s@]+$/,
MAX_QUANTITY: 999999,
MIN_QUANTITY: 1,
MAX_PRICE: 999999.99,
MIN_PRICE: 0.01
};
// ============================================================================
// UI CONSTANTS
// ============================================================================
/**
* UI-specific constants
*/
exports.UI_CONSTANTS = {
TOAST_DURATION: 5000,
POLLING_INTERVAL: 5000,
DEBOUNCE_DELAY: 300,
MAX_RETRY_ATTEMPTS: 3,
DEFAULT_PAGE_SIZE: 20
};
// ============================================================================
// HELPER FUNCTIONS
// ============================================================================
/**
* Check if account status is active
*/
const isAccountActive = (status) => {
return status === exports.ACCOUNT_STATUS.ACTIVE;
};
exports.isAccountActive = isAccountActive;
/**
* Check if account requires OAuth
*/
const requiresOAuth = (status) => {
return status === exports.ACCOUNT_STATUS.PROCEED_TO_OAUTH;
};
exports.requiresOAuth = requiresOAuth;
/**
* Get broker display name
*/
const getBrokerDisplayName = (brokerName) => {
return exports.BROKER_DISPLAY_NAMES[brokerName] || brokerName.toUpperCase();
};
exports.getBrokerDisplayName = getBrokerDisplayName;
/**
* Check if order is in final state
*/
const isOrderFinal = (status) => {
const finalStatuses = [
exports.ORDER_STATUS.EXECUTED,
exports.ORDER_STATUS.REJECTED,
exports.ORDER_STATUS.CANCELLED,
exports.ORDER_STATUS.FAILED
];
return finalStatuses.includes(status);
};
exports.isOrderFinal = isOrderFinal;
/**
* Get token expiry hours for broker
*/
const getTokenExpiryHours = (brokerName) => {
switch (brokerName) {
case exports.BROKER_NAMES.SHOONYA:
return exports.TOKEN_EXPIRY.SHOONYA_HOURS;
case exports.BROKER_NAMES.FYERS:
return exports.TOKEN_EXPIRY.FYERS_HOURS;
default:
return exports.TOKEN_EXPIRY.DEFAULT_HOURS;
}
};
exports.getTokenExpiryHours = getTokenExpiryHours;