from fastapi import APIRouter, HTTPException from fastapi.responses import HTMLResponse from pydantic import BaseModel # ------------------------------------------------------- # Local modules # ------------------------------------------------------- from . import common from . import stock from . import indices_html as indices from . import index_live_html as live from . import preopen_html as pre from . import eq_html as eq from . import bhavcopy_html as bhav from . import build_nse_fno as fno from . import nsepythonmodified as ns from . import yahooinfo from . import screener # executor only # ------------------------------------------------------- # Router # ------------------------------------------------------- router = APIRouter() # ------------------------------------------------------- # REQ TYPE MAP (stock & index) # ------------------------------------------------------- REQ_TYPE_MAP = { "stock": [ "info", "intraday", "daily", "nse_eq", "qresult", "result", "balance", "cashflow", "dividend", "split", "other", "stock_hist" ], "index": [ "indices", "open", "preopen", "fno", "fiidii", "events", "index_highlow", "stock_highlow", "bhav", "largedeals", "bulkdeals", "blockdeals", "most_active", "index_history", "Hlargedeals", "pe_pb", "total_returns" ], } # ------------------------------------------------------- # HTML builder for req_type discovery # ------------------------------------------------------- def build_req_type_list_html(): html = ["
"] for mode, items in REQ_TYPE_MAP.items(): html.append(f"

{mode.upper()}

") # SCREENER (from screener.py) html.append("

SCREENER

") return "".join(html) # ------------------------------------------------------- # Request model # ------------------------------------------------------- class FetchRequest(BaseModel): mode: str req_type: str name: str = "" date_start: str = "" date_end: str = "" # ------------------------------------------------------- # STOCK handler # ------------------------------------------------------- def handle_stock(req: FetchRequest): t = req.req_type.lower() if t == "info": return yahooinfo.fetch_info(req.name) if t == "intraday": return stock.fetch_intraday(req.name) if t == "daily": return stock.fetch_daily(req.name, req.date_end,req.date_start) if t == "nse_eq": return eq.build_eq_html(req.name) if t == "qresult": return stock.fetch_qresult(req.name) if t == "result": return stock.fetch_result(req.name) if t == "balance": return stock.fetch_balance(req.name) if t == "cashflow": return stock.fetch_cashflow(req.name) if t == "dividend": return stock.fetch_dividend(req.name) if t == "split": return stock.fetch_split(req.name) if t == "other": return stock.fetch_other(req.name) if t == "stock_hist": return ns.nse_stock_hist( req.date_start, req.date_end, req.name ).to_html() return common.wrap(f"

Unhandled stock req_type: {t}

") # ------------------------------------------------------- # INDEX handler # ------------------------------------------------------- def handle_index(req: FetchRequest): t = req.req_type.lower() if t == "indices": return indices.build_indices_html() if t == "open": return live.build_index_live_html(req.name) if t == "preopen": return pre.build_preopen_html(req.name) if t == "fno": return fno.nse_fno_html(req.date_end, req.name) if t == "fiidii": return ns.nse_fiidii() if t == "events": return ns.nse_events() if t == "index_highlow": return ns.nse_highlow(req.date_end) if t == "stock_highlow": return ns.stock_highlow(req.date_end) if t == "bhav": return bhav.build_bhavcopy_html(req.date_end) if t == "largedeals": return ns.nse_largedeals() if t == "bulkdeals": return ns.nse_bulkdeals() if t == "blockdeals": return ns.nse_blockdeals() if t == "most_active": return ns.nse_most_active() if t == "index_history": return ns.index_history("NIFTY", req.date_start, req.date_end) if t == "Hlargedeals": return ns.nse_largedeals_historical( req.date_start, req.date_end ) if t == "pe_pb": return ns.index_pe_pb_div( "NIFTY", req.date_start, req.date_end ) if t == "total_returns": return ns.index_total_returns( "NIFTY", req.date_start, req.date_end ) return common.wrap(f"

Unhandled index req_type: {t}

") # ------------------------------------------------------- # SCREENER handler # ------------------------------------------------------- def handle_screener(req: FetchRequest): return screener.fetch_screener(req.req_type.lower()) # ------------------------------------------------------- # Routes # ------------------------------------------------------- @router.get("/") def health(): return {"status": "ok", "service": "backend alive"} @router.post("/api/fetch", response_class=HTMLResponse) def fetch_data(req: FetchRequest): mode = req.mode.lower() # frontend discovery call if mode == "list": return HTMLResponse(content=build_req_type_list_html()) if mode == "stock": html = handle_stock(req) elif mode == "index": html = handle_index(req) elif mode == "screener": html = handle_screener(req) else: raise HTTPException(status_code=400, detail="Invalid mode") return HTMLResponse(content=str(html))