Files
h2h-prototype/backend/app/main.py
2026-01-11 18:57:47 -06:00

119 lines
3.0 KiB
Python

from fastapi import FastAPI, Depends
from fastapi.middleware.cors import CORSMiddleware
from contextlib import asynccontextmanager
from sqlalchemy.ext.asyncio import AsyncSession
from sqlalchemy import select, func
from decimal import Decimal
from app.database import init_db, get_db
from app.routers import auth, users, wallet, bets, websocket, admin, sport_events, spread_bets, gamification, matches
from app.models import User, Wallet
from app.utils.security import get_password_hash
@asynccontextmanager
async def lifespan(app: FastAPI):
# Startup
await init_db()
yield
# Shutdown
app = FastAPI(
title="H2H Betting Platform API",
description="Peer-to-peer betting platform MVP",
version="1.0.0",
lifespan=lifespan
)
# CORS middleware
app.add_middleware(
CORSMiddleware,
allow_origins=["*"],
allow_credentials=True,
allow_methods=["*"],
allow_headers=["*"],
)
# Include routers
app.include_router(auth.router)
app.include_router(users.router)
app.include_router(wallet.router)
app.include_router(bets.router)
app.include_router(websocket.router)
app.include_router(admin.router)
app.include_router(sport_events.router)
app.include_router(spread_bets.router)
app.include_router(gamification.router)
app.include_router(matches.router)
@app.get("/")
async def root():
return {"message": "H2H Betting Platform API", "version": "1.0.0"}
@app.get("/health")
async def health():
return {"status": "healthy"}
@app.get("/init")
async def init_admin(db: AsyncSession = Depends(get_db)):
"""
Initialize the application with a default admin user.
Only works if no admin users exist in the database.
Creates: admin@test.com / password123
"""
# Check if any admin users exist
result = await db.execute(
select(func.count(User.id)).where(User.is_admin == True)
)
admin_count = result.scalar()
if admin_count > 0:
return {
"success": False,
"message": "Admin user(s) already exist. Initialization skipped.",
"admin_count": admin_count
}
# Check if user with this email already exists
existing = await db.execute(
select(User).where(User.email == "admin@test.com")
)
if existing.scalar_one_or_none():
return {
"success": False,
"message": "User with email admin@test.com already exists but is not an admin."
}
# Create admin user
admin_user = User(
email="admin@test.com",
username="admin",
password_hash=get_password_hash("password123"),
display_name="Administrator",
is_admin=True,
)
db.add(admin_user)
await db.flush()
# Create wallet for admin
wallet = Wallet(
user_id=admin_user.id,
balance=Decimal("10000.00"),
escrow=Decimal("0.00"),
)
db.add(wallet)
await db.commit()
return {
"success": True,
"message": "Admin user created successfully",
"credentials": {
"email": "admin@test.com",
"password": "password123"
}
}