diff --git a/auth.py b/auth.py index cdc32dd..ac42627 100644 --- a/auth.py +++ b/auth.py @@ -99,6 +99,9 @@ async def auth_twitch_callback(code: str, state: str, request: Request, db: Sess encrypted_tokens=encrypted_tokens ) db.add(user) + # Also create a default settings object for the new user + new_settings = models.Setting(owner=user) + db.add(new_settings) db.commit() diff --git a/main.py b/main.py index 3994e79..0827f46 100644 --- a/main.py +++ b/main.py @@ -1,5 +1,5 @@ import os -from fastapi import FastAPI, Request, Depends +from fastapi import FastAPI, Request, Depends, HTTPException from starlette.middleware.sessions import SessionMiddleware from starlette.staticfiles import StaticFiles from starlette.responses import FileResponse, RedirectResponse @@ -10,6 +10,7 @@ from sqlalchemy.orm import Session import models from database import engine import auth # Import the new auth module +import schemas from config import settings # Import settings to get the secret key # --- Absolute Path Configuration --- @@ -56,8 +57,13 @@ async def read_dashboard(request: Request, db: Session = Depends(auth.get_db)): user = db.query(models.User).filter(models.User.id == user_id).first() overlay_url = f"{settings.APP_BASE_URL}/overlay/{user.id}" + + # Ensure user has settings, create if they don't for some reason + if not user.settings: + user.settings = models.Setting() + db.commit() - return templates.TemplateResponse("dashboard.html", {"request": request, "user": user, "overlay_url": overlay_url}) + return templates.TemplateResponse("dashboard.html", {"request": request, "user": user, "overlay_url": overlay_url, "current_theme": user.settings.overlay_theme}) @app.get("/logout") async def logout(request: Request): @@ -66,7 +72,29 @@ async def logout(request: Request): return RedirectResponse(url="/") @app.get("/overlay/{user_id}") -async def read_overlay(request: Request, user_id: int): +async def read_overlay(request: Request, user_id: int, db: Session = Depends(auth.get_db)): # This endpoint serves the overlay page. - # For now, it just renders the template with placeholder text. - return templates.TemplateResponse("overlay.html", {"request": request}) \ No newline at end of file + user = db.query(models.User).filter(models.User.id == user_id).first() + if not user: + raise HTTPException(status_code=404, detail="User not found") + + theme = "dark-purple" # Default theme + if user.settings and user.settings.overlay_theme: + theme = user.settings.overlay_theme + + return templates.TemplateResponse(f"overlay-{theme}.html", {"request": request}) + +@app.post("/api/settings") +async def update_settings(settings_data: schemas.SettingsUpdate, request: Request, db: Session = Depends(auth.get_db)): + user_id = request.session.get('user_id') + if not user_id: + raise HTTPException(status_code=401, detail="Not authenticated") + + user = db.query(models.User).filter(models.User.id == user_id).first() + if not user.settings: + user.settings = models.Setting() + + user.settings.overlay_theme = settings_data.overlay_theme + db.commit() + + return {"message": "Settings updated successfully"} \ No newline at end of file diff --git a/models.py b/models.py index e64b077..e53f66e 100644 --- a/models.py +++ b/models.py @@ -22,6 +22,7 @@ class Setting(Base): id = Column(Integer, primary_key=True, index=True) custom_css = Column(Text, nullable=True) + overlay_theme = Column(String, default="dark-purple") user_id = Column(Integer, ForeignKey("users.id")) owner = relationship("User", back_populates="settings") \ No newline at end of file diff --git a/schemas.py b/schemas.py new file mode 100644 index 0000000..f101dff --- /dev/null +++ b/schemas.py @@ -0,0 +1,5 @@ +from pydantic import BaseModel +from typing import Literal + +class SettingsUpdate(BaseModel): + overlay_theme: Literal['dark-purple', 'bright-green'] \ No newline at end of file diff --git a/templates/dashboard.html b/templates/dashboard.html index 78df0e9..0e7ac15 100644 --- a/templates/dashboard.html +++ b/templates/dashboard.html @@ -21,7 +21,33 @@ {{ overlay_url }} +
+

Overlay Theme

+
+ + +
+

+
+

Logout

+ + \ No newline at end of file