from datetime import datetime, timezone from fastapi import APIRouter, FastAPI, status from fastapi.staticfiles import StaticFiles from sqlmodel import ( ARRAY, Column, Relationship, SQLModel, Field, Session, String, create_engine, select, ) from fastapi.middleware.cors import CORSMiddleware with open("db.secrets", "r") as f: db_secrets = f.readline().strip() app = FastAPI(title="cutt") engine = create_engine(db_secrets) origins = [ "*", "http://localhost", "http://localhost:3000", "http://localhost:8000", ] app.add_middleware( CORSMiddleware, allow_origins=origins, allow_credentials=True, allow_methods=["*"], allow_headers=["*"], ) def utctime(): return datetime.now(tz=timezone.utc) class PlayerTeamLink(SQLModel, table=True): team_id: int | None = Field(default=None, foreign_key="team.id", primary_key=True) player_id: int | None = Field( default=None, foreign_key="player.id", primary_key=True ) class Team(SQLModel, table=True): id: int | None = Field(default=None, primary_key=True) name: str location: str | None country: str | None players: list["Player"] | None = Relationship( back_populates="teams", link_model=PlayerTeamLink ) class Player(SQLModel, table=True): id: int | None = Field(default=None, primary_key=True) name: str number: str | None = None teams: list[Team] | None = Relationship( back_populates="players", link_model=PlayerTeamLink ) class Chemistry(SQLModel, table=True): id: int | None = Field(default=None, primary_key=True) time: datetime | None = Field(default_factory=utctime) user: str love: list[str] = Field(sa_column=Column(ARRAY(String))) hate: list[str] = Field(sa_column=Column(ARRAY(String))) undecided: list[str] = Field(sa_column=Column(ARRAY(String))) class MVPRanking(SQLModel, table=True): id: int | None = Field(default=None, primary_key=True) time: datetime | None = Field(default_factory=utctime) user: str mvps: list[str] = Field(sa_column=Column(ARRAY(String))) SQLModel.metadata.create_all(engine) def add_team(team: Team): with Session(engine) as session: session.add(team) session.commit() def add_player(player: Player): with Session(engine) as session: session.add(player) session.commit() def add_players(players: list[Player]): with Session(engine) as session: for player in players: session.add(player) session.commit() def list_players(): with Session(engine) as session: statement = select(Player) return session.exec(statement).fetchall() def list_teams(): with Session(engine) as session: statement = select(Team) return session.exec(statement) player_router = APIRouter(prefix="/player") player_router.add_api_route("/list", endpoint=list_players, methods=["GET"]) player_router.add_api_route("/add", endpoint=add_player, methods=["POST"]) team_router = APIRouter(prefix="/team") team_router.add_api_route("/list", endpoint=list_teams, methods=["GET"]) team_router.add_api_route("/add", endpoint=add_team, methods=["POST"]) @app.post("/mvps/", status_code=status.HTTP_200_OK) def submit_mvps(mvps: MVPRanking): with Session(engine) as session: session.add(mvps) session.commit() @app.post("/chemistry/", status_code=status.HTTP_200_OK) def submit_chemistry(chemistry: Chemistry): with Session(engine) as session: session.add(chemistry) session.commit() app.include_router(player_router) app.include_router(team_router) app.mount("/", StaticFiles(directory="dist", html=True), name="site")