Loading .gitignore 0 → 100644 +35 −0 Original line number Diff line number Diff line # === Node.js / React frontend === frontend/node_modules/ frontend/build/ frontend/.env frontend/.DS_Store # === Python backend === backend/__pycache__/ backend/.venv/ backend/venv/ backend/.env *.pyc *.pyo # === Docker volumes and system files === db_data/ pg_data/* *.log *.sqlite3 # === OS/system files === .DS_Store Thumbs.db # === VSCode/editor configs (optional) === .vscode/ .idea/ *.swp # === Python virtual env (top level, if any) === .venv/ venv/ # === dotenv files at root (if present) === .env backend/Dockerfile 0 → 100644 +5 −0 Original line number Diff line number Diff line FROM python:3.11-slim WORKDIR /app COPY . . RUN pip install -r requirements.txt CMD ["python", "app.py"] backend/app.py 0 → 100644 +26 −0 Original line number Diff line number Diff line import tornado.ioloop import tornado.web from db import init_db, get_nvda_data, store_nvda_data import json class NVDAHandler(tornado.web.RequestHandler): def get(self): data = get_nvda_data() self.write(json.dumps(data, default=str)) # default=str handles date serialization class FetchAndStoreHandler(tornado.web.RequestHandler): def post(self): store_nvda_data() self.write({"status": "NVDA stock data fetched and stored."}) def make_app(): return tornado.web.Application([ (r"/api/nvda", NVDAHandler), (r"/api/nvda/fetch", FetchAndStoreHandler), ]) if __name__ == "__main__": init_db() app = make_app() app.listen(8000) tornado.ioloop.IOLoop.current().start() backend/db.py 0 → 100644 +38 −0 Original line number Diff line number Diff line import os import pandas as pd import yfinance as yf from sqlalchemy import create_engine, text from dotenv import load_dotenv load_dotenv() DATABASE_URL = os.getenv("DATABASE_URL", "postgresql://postgres:postgres@localhost:5432/postgres") engine = create_engine(DATABASE_URL) def init_db(): with engine.connect() as conn: conn.execute(text(""" CREATE TABLE IF NOT EXISTS nvda_stock ( date DATE PRIMARY KEY, open FLOAT, high FLOAT, low FLOAT, close FLOAT, volume BIGINT ) """)) def store_nvda_data(): df = yf.Ticker("NVDA").history(period="5y") df = df[["Open", "High", "Low", "Close", "Volume"]] df.reset_index(inplace=True) df.columns = ["date", "open", "high", "low", "close", "volume"] with engine.begin() as conn: df.to_sql("nvda_stock", con=conn, if_exists="append", index=False, method="multi") def get_nvda_data(): with engine.connect() as conn: result = conn.execute(text("SELECT * FROM nvda_stock ORDER BY date DESC LIMIT 100")) rows = [dict(row) for row in result] return rows backend/requirements.txt 0 → 100644 +7 −0 Original line number Diff line number Diff line yfinance pandas SQLAlchemy psycopg2-binary requests tornado python-dotenv Loading
.gitignore 0 → 100644 +35 −0 Original line number Diff line number Diff line # === Node.js / React frontend === frontend/node_modules/ frontend/build/ frontend/.env frontend/.DS_Store # === Python backend === backend/__pycache__/ backend/.venv/ backend/venv/ backend/.env *.pyc *.pyo # === Docker volumes and system files === db_data/ pg_data/* *.log *.sqlite3 # === OS/system files === .DS_Store Thumbs.db # === VSCode/editor configs (optional) === .vscode/ .idea/ *.swp # === Python virtual env (top level, if any) === .venv/ venv/ # === dotenv files at root (if present) === .env
backend/Dockerfile 0 → 100644 +5 −0 Original line number Diff line number Diff line FROM python:3.11-slim WORKDIR /app COPY . . RUN pip install -r requirements.txt CMD ["python", "app.py"]
backend/app.py 0 → 100644 +26 −0 Original line number Diff line number Diff line import tornado.ioloop import tornado.web from db import init_db, get_nvda_data, store_nvda_data import json class NVDAHandler(tornado.web.RequestHandler): def get(self): data = get_nvda_data() self.write(json.dumps(data, default=str)) # default=str handles date serialization class FetchAndStoreHandler(tornado.web.RequestHandler): def post(self): store_nvda_data() self.write({"status": "NVDA stock data fetched and stored."}) def make_app(): return tornado.web.Application([ (r"/api/nvda", NVDAHandler), (r"/api/nvda/fetch", FetchAndStoreHandler), ]) if __name__ == "__main__": init_db() app = make_app() app.listen(8000) tornado.ioloop.IOLoop.current().start()
backend/db.py 0 → 100644 +38 −0 Original line number Diff line number Diff line import os import pandas as pd import yfinance as yf from sqlalchemy import create_engine, text from dotenv import load_dotenv load_dotenv() DATABASE_URL = os.getenv("DATABASE_URL", "postgresql://postgres:postgres@localhost:5432/postgres") engine = create_engine(DATABASE_URL) def init_db(): with engine.connect() as conn: conn.execute(text(""" CREATE TABLE IF NOT EXISTS nvda_stock ( date DATE PRIMARY KEY, open FLOAT, high FLOAT, low FLOAT, close FLOAT, volume BIGINT ) """)) def store_nvda_data(): df = yf.Ticker("NVDA").history(period="5y") df = df[["Open", "High", "Low", "Close", "Volume"]] df.reset_index(inplace=True) df.columns = ["date", "open", "high", "low", "close", "volume"] with engine.begin() as conn: df.to_sql("nvda_stock", con=conn, if_exists="append", index=False, method="multi") def get_nvda_data(): with engine.connect() as conn: result = conn.execute(text("SELECT * FROM nvda_stock ORDER BY date DESC LIMIT 100")) rows = [dict(row) for row in result] return rows
backend/requirements.txt 0 → 100644 +7 −0 Original line number Diff line number Diff line yfinance pandas SQLAlchemy psycopg2-binary requests tornado python-dotenv