backendfastapi / app /router.py
eshan6704's picture
Update app/router.py
86c7881 verified
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 = ["<div id='req_type_list'>"]
for mode, items in REQ_TYPE_MAP.items():
html.append(f"<h3>{mode.upper()}</h3><ul>")
for it in items:
html.append(
f"<li class='{mode}-req' data-mode='{mode}'>{it}</li>"
)
html.append("</ul>")
# SCREENER (from screener.py)
html.append("<h3>SCREENER</h3><ul>")
for key in screener.SCREENER_MAP.keys():
html.append(
f"<li class='screener-req' data-mode='screener'>{key}</li>"
)
html.append("</ul></div>")
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"<h3>Unhandled stock req_type: {t}</h3>")
# -------------------------------------------------------
# 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"<h3>Unhandled index req_type: {t}</h3>")
# -------------------------------------------------------
# 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))