eshan6704 commited on
Commit
1af41e5
·
verified ·
1 Parent(s): 82ee7c9

Update app/app.py

Browse files
Files changed (1) hide show
  1. app/app.py +125 -38
app/app.py CHANGED
@@ -4,6 +4,9 @@ from fastapi.middleware.cors import CORSMiddleware
4
  from fastapi.middleware.gzip import GZipMiddleware
5
  from pydantic import BaseModel
6
 
 
 
 
7
  from . import common
8
  from . import stock
9
  from . import indices_html as indices
@@ -15,8 +18,11 @@ from . import build_nse_fno as fno
15
  from . import nsepythonmodified as ns
16
  from . import yahooinfo
17
  from . import screener
18
- from . import ui_html # ✅ NEW
19
 
 
 
 
20
  app = FastAPI(title="Stock / Index Backend")
21
 
22
  app.add_middleware(
@@ -27,6 +33,9 @@ app.add_middleware(
27
  )
28
  app.add_middleware(GZipMiddleware, minimum_size=1000)
29
 
 
 
 
30
  class FetchRequest(BaseModel):
31
  mode: str
32
  req_type: str = ""
@@ -34,38 +43,53 @@ class FetchRequest(BaseModel):
34
  date_start: str = ""
35
  date_end: str = ""
36
 
 
 
 
37
  @app.get("/")
38
  def health():
39
- return {"status": "ok"}
40
-
41
- @app.get("/ui", response_class=HTMLResponse)
42
- def frontend():
43
- return ui_html.build_frontend_html()
44
 
 
 
 
45
  REQ_TYPE_MAP = {
46
- "stock": ["info","intraday","daily","nse_eq","qresult","result","balance",
47
- "cashflow","dividend","split","other","stock_hist","nse_bhav"],
48
- "index": ["indices","nse_open","nse_preopen","nse_fno","nse_fiidii",
49
- "nse_events","nse_future","nse_highlow","stock_highlow",
50
- "nse_largedeals","nse_bulkdeals","nse_blockdeals",
51
- "nse_most_active","index_history","largedeals_historical",
52
- "index_pe_pb_div","index_total_returns"]
 
 
 
 
 
 
53
  }
54
 
 
 
 
55
  FNO_STOCK_LIST = ["ITC","ZEEL","PNB","NIFTY"]
56
  OPEN_INDICES_LIST = ["NIFTY 50","NIFTY BANK"]
57
  PREOPEN_INDICES_LIST = ["NIFTY 50","NIFTY BANK"]
58
 
 
 
 
59
  def build_req_type_list_html():
60
- h = ["<div>"]
61
 
62
- h.append("<h3>STOCK</h3><ul>")
63
  for t in REQ_TYPE_MAP["stock"]:
64
  names = ",".join(FNO_STOCK_LIST) if t in ["stock_hist","nse_bhav"] else ""
65
- h.append(f"<li data-mode='stock' data-type='{t}' data-names='{names}'>{t}</li>")
66
- h.append("</ul>")
 
67
 
68
- h.append("<h3>INDEX</h3><ul>")
69
  for t in REQ_TYPE_MAP["index"]:
70
  if t == "nse_open":
71
  names = ",".join(OPEN_INDICES_LIST)
@@ -73,28 +97,91 @@ def build_req_type_list_html():
73
  names = ",".join(PREOPEN_INDICES_LIST)
74
  else:
75
  names = ""
76
- h.append(f"<li data-mode='index' data-type='{t}' data-names='{names}'>{t}</li>")
77
- h.append("</ul>")
78
-
79
- h.append("<h3>SCREENER</h3><ul>")
80
- for k in screener.SCREENER_MAP:
81
- h.append(f"<li data-mode='screener' data-type='{k}'>{k}</li>")
82
- h.append("</ul></div>")
83
-
84
- return "".join(h)
85
-
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
86
  @app.post("/api/fetch", response_class=HTMLResponse)
87
- def fetch(req: FetchRequest):
 
 
88
  if req.mode == "list":
89
  return build_req_type_list_html()
90
 
91
  if req.mode == "stock":
92
- return HTMLResponse(str(stock.fetch_intraday(req.name))) if req.req_type=="intraday" else yahooinfo.fetch_info(req.name)
93
-
94
- if req.mode == "index":
95
- return indices.build_indices_html()
96
-
97
- if req.mode == "screener":
98
- return screener.fetch_screener(req.req_type)
99
-
100
- raise HTTPException(400, "Invalid mode")
 
4
  from fastapi.middleware.gzip import GZipMiddleware
5
  from pydantic import BaseModel
6
 
7
+ # -------------------------------------------------------
8
+ # Local modules (UNCHANGED)
9
+ # -------------------------------------------------------
10
  from . import common
11
  from . import stock
12
  from . import indices_html as indices
 
18
  from . import nsepythonmodified as ns
19
  from . import yahooinfo
20
  from . import screener
21
+ from . import ui_html # ✅ ONLY HTML, no logic
22
 
23
+ # -------------------------------------------------------
24
+ # FastAPI app
25
+ # -------------------------------------------------------
26
  app = FastAPI(title="Stock / Index Backend")
27
 
28
  app.add_middleware(
 
33
  )
34
  app.add_middleware(GZipMiddleware, minimum_size=1000)
35
 
36
+ # -------------------------------------------------------
37
+ # Request model
38
+ # -------------------------------------------------------
39
  class FetchRequest(BaseModel):
40
  mode: str
41
  req_type: str = ""
 
43
  date_start: str = ""
44
  date_end: str = ""
45
 
46
+ # -------------------------------------------------------
47
+ # Health
48
+ # -------------------------------------------------------
49
  @app.get("/")
50
  def health():
51
+ return {"status": "ok", "service": "backend alive"}
 
 
 
 
52
 
53
+ # -------------------------------------------------------
54
+ # CONFIG (single source of truth)
55
+ # -------------------------------------------------------
56
  REQ_TYPE_MAP = {
57
+ "stock": [
58
+ "info","intraday","daily","nse_eq","qresult",
59
+ "result","balance","cashflow","dividend",
60
+ "split","other","stock_hist","nse_bhav"
61
+ ],
62
+ "index": [
63
+ "indices","nse_open","nse_preopen","nse_fno",
64
+ "nse_fiidii","nse_events","nse_future",
65
+ "nse_highlow","stock_highlow","nse_largedeals",
66
+ "nse_bulkdeals","nse_blockdeals","nse_most_active",
67
+ "index_history","largedeals_historical",
68
+ "index_pe_pb_div","index_total_returns"
69
+ ],
70
  }
71
 
72
+ # -------------------------------------------------------
73
+ # Name lists (backend authority)
74
+ # -------------------------------------------------------
75
  FNO_STOCK_LIST = ["ITC","ZEEL","PNB","NIFTY"]
76
  OPEN_INDICES_LIST = ["NIFTY 50","NIFTY BANK"]
77
  PREOPEN_INDICES_LIST = ["NIFTY 50","NIFTY BANK"]
78
 
79
+ # -------------------------------------------------------
80
+ # 🔹 LIST BUILDER (frontend bootstrap)
81
+ # -------------------------------------------------------
82
  def build_req_type_list_html():
83
+ html = ["<div id='backend_meta'>"]
84
 
85
+ # STOCK
86
  for t in REQ_TYPE_MAP["stock"]:
87
  names = ",".join(FNO_STOCK_LIST) if t in ["stock_hist","nse_bhav"] else ""
88
+ html.append(
89
+ f"<li data-mode='stock' data-type='{t}' data-names='{names}'></li>"
90
+ )
91
 
92
+ # INDEX
93
  for t in REQ_TYPE_MAP["index"]:
94
  if t == "nse_open":
95
  names = ",".join(OPEN_INDICES_LIST)
 
97
  names = ",".join(PREOPEN_INDICES_LIST)
98
  else:
99
  names = ""
100
+ html.append(
101
+ f"<li data-mode='index' data-type='{t}' data-names='{names}'></li>"
102
+ )
103
+
104
+ # SCREENER
105
+ for key in screener.SCREENER_MAP:
106
+ html.append(
107
+ f"<li data-mode='screener' data-type='{key}'></li>"
108
+ )
109
+
110
+ html.append("</div>")
111
+ return "".join(html)
112
+
113
+ # -------------------------------------------------------
114
+ # UI (HTML only)
115
+ # -------------------------------------------------------
116
+ @app.get("/ui", response_class=HTMLResponse)
117
+ def ui():
118
+ return ui_html.HTML
119
+
120
+ # -------------------------------------------------------
121
+ # HANDLERS (ALL preserved)
122
+ # -------------------------------------------------------
123
+ def handle_stock(req: FetchRequest):
124
+ t = req.req_type.lower()
125
+ if t == "info": return yahooinfo.fetch_info(req.name)
126
+ if t == "intraday": return stock.fetch_intraday(req.name)
127
+ if t == "daily": return stock.fetch_daily(req.name, req.date_end)
128
+ if t == "nse_eq": return eq.build_eq_html(req.name)
129
+ if t == "qresult": return stock.fetch_qresult(req.name)
130
+ if t == "result": return stock.fetch_result(req.name)
131
+ if t == "balance": return stock.fetch_balance(req.name)
132
+ if t == "cashflow": return stock.fetch_cashflow(req.name)
133
+ if t == "dividend": return stock.fetch_dividend(req.name)
134
+ if t == "split": return stock.fetch_split(req.name)
135
+ if t == "other": return stock.fetch_other(req.name)
136
+ if t in ["stock_hist","nse_bhav"]:
137
+ return ns.nse_stock_hist(req.date_start, req.date_end, req.name).to_html()
138
+ return common.wrap(f"<h3>Unhandled stock req_type: {t}</h3>")
139
+
140
+ def handle_index(req: FetchRequest):
141
+ t = req.req_type.lower()
142
+ if t == "indices": return indices.build_indices_html()
143
+ if t == "nse_open": return live.build_index_live_html()
144
+ if t == "nse_preopen": return pre.build_preopen_html()
145
+ if t == "nse_fno": return fno.nse_fno_html(req.date_end, req.name)
146
+ if t == "nse_fiidii": return ns.nse_fiidii()
147
+ if t == "nse_events": return ns.nse_events()
148
+ if t == "nse_future": return ns.nse_future(req.name)
149
+ if t == "nse_highlow": return ns.nse_highlow(req.date_end)
150
+ if t == "stock_highlow": return ns.stock_highlow(req.date_end)
151
+ if t == "nse_largedeals": return ns.nse_largedeals()
152
+ if t == "nse_bulkdeals": return ns.nse_bulkdeals()
153
+ if t == "nse_blockdeals": return ns.nse_blockdeals()
154
+ if t == "nse_most_active": return ns.nse_most_active()
155
+ if t == "index_history":
156
+ return ns.index_history("NIFTY", req.date_start, req.date_end)
157
+ if t == "largedeals_historical":
158
+ return ns.nse_largedeals_historical(req.date_start, req.date_end)
159
+ if t == "index_pe_pb_div":
160
+ return ns.index_pe_pb_div("NIFTY", req.date_start, req.date_end)
161
+ if t == "index_total_returns":
162
+ return ns.index_total_returns("NIFTY", req.date_start, req.date_end)
163
+ return common.wrap(f"<h3>Unhandled index req_type: {t}</h3>")
164
+
165
+ def handle_screener(req: FetchRequest):
166
+ return screener.fetch_screener(req.req_type.lower())
167
+
168
+ # -------------------------------------------------------
169
+ # MAIN API
170
+ # -------------------------------------------------------
171
  @app.post("/api/fetch", response_class=HTMLResponse)
172
+ def fetch_data(req: FetchRequest):
173
+
174
+ # 🔑 Frontend bootstrap
175
  if req.mode == "list":
176
  return build_req_type_list_html()
177
 
178
  if req.mode == "stock":
179
+ html = handle_stock(req)
180
+ elif req.mode == "index":
181
+ html = handle_index(req)
182
+ elif req.mode == "screener":
183
+ html = handle_screener(req)
184
+ else:
185
+ raise HTTPException(status_code=400, detail="Invalid mode")
186
+
187
+ return HTMLResponse(content=str(html))