119 lines
3.0 KiB
Python
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"
|
|
}
|
|
}
|