from fastapi.responses import HTMLResponse from fastapi.templating import Jinja2Templates from fastapi import FastAPI, Request, HTTPException from fastapi.middleware.cors import CORSMiddleware from utils import StockDataFetcher from pydantic import BaseModel from typing import List, Dict app = FastAPI(swagger_ui_parameters={"syntaxHighlight.theme": "obsidian"}) class StockPriceResponse(BaseModel): ltp: float fetcher = StockDataFetcher() origins = ["*"] app.add_middleware( CORSMiddleware, allow_origins=origins, allow_credentials=True, allow_methods=["*"], allow_headers=["*"], ) templates = Jinja2Templates(directory="templates") @app.get("/", response_class=HTMLResponse) async def read_root(request: Request): return templates.TemplateResponse("hello.html", {"request": request}) @app.get('/ltp', response_model=StockPriceResponse, response_model_exclude_unset=True, summary="Get the latest price of a stock", response_description="Latest stock price", responses={200: {"content": {"application/json": {"example": {"ltp": 123.45}}}}})) async def get_data(ticker: str): try: response = fetcher.fetch_latest_price(ticker) return {'ltp' :response} except: return {"Timeout" : "Error"} @app.get('/historical') async def get_stocks_data(ticker: str, intervals: int, days: int): try: response = fetcher.fetch_stock_data(ticker, 15, 10).to_dict(orient="records") return response except: return {"data" : response} @app.get('/chain') async def get_stocks_data(ticker: str): try: response = fetcher.fetch_option_chain(ticker).to_dict(orient="records") return response except: return {"data" : response} @app.get('/search') async def get_stocks_data(ticker: str): try: response = fetcher.search_entity(ticker) return response except: return {"data" : response} @app.get('/news') async def get_stocks_data(ticker: str, page: int, size: int): try: response = fetcher.fetch_stock_news(ticker, page=page, size=size).to_dict(orient="records") return response except: return {"data" : response} @app.get('/all') async def get_stocks_data(): try: response = fetcher.fetch_all_stock().to_dict(orient="records") return response except: return {"data" : response} @app.get('/signal') async def get_stocks_data(index: str): try: response = fetcher.realtime_signal(index).tail(1).to_dict(orient="records")[0] return response except: return {"data" : response}