UNPKG

@copytrade/shared-types

Version:

Shared TypeScript types for CopyTrade application

279 lines (278 loc) 8.65 kB
"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 = { [exports.BROKER_NAMES.SHOONYA]: 'Shoonya (Finvasia)', [exports.BROKER_NAMES.FYERS]: 'FYERS', [exports.BROKER_NAMES.ZERODHA]: 'Zerodha', [exports.BROKER_NAMES.UPSTOX]: 'Upstox', [exports.BROKER_NAMES.ANGEL_ONE]: '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;