81 lines
2.7 KiB
Python
81 lines
2.7 KiB
Python
from fastapi import APIRouter, HTTPException, Depends
|
|
from pydantic import BaseModel
|
|
from typing import Optional
|
|
import structlog
|
|
|
|
from auth import get_db, get_current_user
|
|
|
|
logger = structlog.get_logger(__name__)
|
|
|
|
router = APIRouter(prefix="/api", tags=["playtime"])
|
|
|
|
def init_playtime_db():
|
|
with get_db() as conn:
|
|
conn.executescript("""
|
|
CREATE TABLE IF NOT EXISTS playtime (
|
|
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
user_id INTEGER NOT NULL,
|
|
pack_name TEXT DEFAULT '',
|
|
minutes INTEGER DEFAULT 0,
|
|
last_updated TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
|
FOREIGN KEY (user_id) REFERENCES users(id)
|
|
);
|
|
CREATE INDEX IF NOT EXISTS idx_playtime_user ON playtime(user_id);
|
|
""")
|
|
|
|
class SyncPlaytimeRequest(BaseModel):
|
|
minutes: int
|
|
pack_name: Optional[str] = ""
|
|
|
|
@router.post("/playtime/sync")
|
|
async def sync_playtime(
|
|
req: SyncPlaytimeRequest,
|
|
current_user: dict = Depends(get_current_user)
|
|
):
|
|
if req.minutes < 0 or req.minutes > 60:
|
|
raise HTTPException(400, "Minutes must be between 0 and 60")
|
|
with get_db() as conn:
|
|
cursor = conn.execute(
|
|
"SELECT id, minutes FROM playtime WHERE user_id = ? AND pack_name = ?",
|
|
(current_user["user_id"], req.pack_name)
|
|
)
|
|
existing = cursor.fetchone()
|
|
if existing:
|
|
conn.execute(
|
|
"UPDATE playtime SET minutes = minutes + ?, last_updated = CURRENT_TIMESTAMP WHERE id = ?",
|
|
(req.minutes, existing[0])
|
|
)
|
|
else:
|
|
conn.execute(
|
|
"INSERT INTO playtime (user_id, pack_name, minutes) VALUES (?, ?, ?)",
|
|
(current_user["user_id"], req.pack_name, req.minutes)
|
|
)
|
|
logger.info("Playtime synced", user=current_user["user_id"], minutes=req.minutes)
|
|
return {"status": "ok"}
|
|
|
|
@router.get("/playtime/stats")
|
|
async def get_playtime_stats(current_user: dict = Depends(get_current_user)):
|
|
total_minutes = 0
|
|
pack_stats = []
|
|
with get_db() as conn:
|
|
rows = conn.execute(
|
|
"SELECT COALESCE(SUM(minutes), 0) FROM playtime WHERE user_id = ?",
|
|
(current_user["user_id"],)
|
|
)
|
|
total_minutes = rows.fetchone()[0]
|
|
|
|
rows = conn.execute(
|
|
"SELECT pack_name, minutes FROM playtime WHERE user_id = ? AND pack_name != '' ORDER BY minutes DESC",
|
|
(current_user["user_id"],)
|
|
)
|
|
for row in rows:
|
|
pack_stats.append({
|
|
"pack_name": row[0],
|
|
"minutes": row[1]
|
|
})
|
|
return {
|
|
"total_minutes": total_minutes,
|
|
"total_hours": round(total_minutes / 60, 1),
|
|
"packs": pack_stats
|
|
}
|