From 61ef27936cc1708ca4acd7f3dded1212da89ae56 Mon Sep 17 00:00:00 2001 From: Brian Wiborg Date: Sun, 28 Sep 2025 19:26:37 +0200 Subject: [PATCH] =?UTF-8?q?=F0=9F=8D=B1=20Add=20ohmyapi=5Fdemo?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/ohmyapi/builtin/demo/__init__.py | 2 ++ src/ohmyapi/builtin/demo/models.py | 50 ++++++++++++++++++++++++++ src/ohmyapi/builtin/demo/routes.py | 54 ++++++++++++++++++++++++++++ 3 files changed, 106 insertions(+) create mode 100644 src/ohmyapi/builtin/demo/__init__.py create mode 100644 src/ohmyapi/builtin/demo/models.py create mode 100644 src/ohmyapi/builtin/demo/routes.py diff --git a/src/ohmyapi/builtin/demo/__init__.py b/src/ohmyapi/builtin/demo/__init__.py new file mode 100644 index 0000000..322de88 --- /dev/null +++ b/src/ohmyapi/builtin/demo/__init__.py @@ -0,0 +1,2 @@ +from . import models +from . import routes diff --git a/src/ohmyapi/builtin/demo/models.py b/src/ohmyapi/builtin/demo/models.py new file mode 100644 index 0000000..d09276b --- /dev/null +++ b/src/ohmyapi/builtin/demo/models.py @@ -0,0 +1,50 @@ +from ohmyapi.db import Model, field +from ohmyapi_auth.models import User + +from datetime import datetime +from decimal import Decimal +from uuid import UUID + + +class Team(Model): + id: UUID = field.data.UUIDField(primary_key=True) + name: str = field.TextField() + members: field.ManyToManyRelation[User] = field.ManyToManyField( + 'ohmyapi_auth.User', + related_name="tournament_teams", + through='user_tournament_teams', + ) + + def __str__(self): + return self.name + + +class Tournament(Model): + id: UUID = field.data.UUIDField(primary_key=True) + name: str = field.TextField() + created: datetime = field.DatetimeField(auto_now_add=True) + + def __str__(self): + return self.name + + +class Event(Model): + id: UUID = field.data.UUIDField(primary_key=True) + name: str = field.TextField() + tournament: field.ForeignKeyRelation[Tournament] = field.ForeignKeyField( + 'ohmyapi_demo.Tournament', + related_name='events', + ) + participants: field.ManyToManyRelation[Team] = field.ManyToManyField( + 'ohmyapi_demo.Team', + related_name='events', + through='event_team', + ) + modified: datetime = field.DatetimeField(auto_now=True) + prize: Decimal = field.DecimalField(max_digits=10, decimal_places=2, null=True) + + class Schema: + exclude = ['tournament_id'] + + def __str__(self): + return self.name diff --git a/src/ohmyapi/builtin/demo/routes.py b/src/ohmyapi/builtin/demo/routes.py new file mode 100644 index 0000000..0533976 --- /dev/null +++ b/src/ohmyapi/builtin/demo/routes.py @@ -0,0 +1,54 @@ +from ohmyapi.router import APIRouter, HTTPException, HTTPStatus +from ohmyapi.db.exceptions import DoesNotExist + +from . import models + +from typing import List + +# Expose your app's routes via `router = fastapi.APIRouter`. +# Use prefixes wisely to avoid cross-app namespace-collisions. +# Tags improve the UX of the OpenAPI docs at /docs. +router = APIRouter(prefix="/tournemant") + + +@router.get("/", + tags=["tournament"], + response_model=List[models.Tournament.Schema.model]) +async def list(): + """List all tournaments.""" + return await models.Tournament.Schema.model.from_queryset(Tournament.all()) + + +@router.post("/", + tags=["tournament"], + status_code=HTTPStatus.CREATED) +async def post(tournament: models.Tournament.Schema.readonly): + """Create tournament.""" + return await models.Tournament.Schema.model.from_queryset(models.Tournament.create(**tournament.model_dump())) + + +@router.get("/{id}", + tags=["tournament"], + response_model=models.Tournament.Schema.model) +async def get(id: str): + """Get tournament by id.""" + return await models.Tournament.Schema.model.from_queryset(models.Tournament.get(id=id)) + + +@router.put("/{id}", + tags=["tournament"], + response_model=models.Tournament.Schema.model, + status_code=HTTPStatus.ACCEPTED) +async def put(tournament: models.Tournament.Schema.model): + """Update tournament.""" + return await models.Tournament.Schema.model.from_queryset(models.Tournament.update(**tournament.model_dump())) + + +@router.delete("/{id}", tags=["tournament"]) +async def delete(id: str): + try: + tournament = await models.Tournament.get(id=id) + return await tournament.delete() + except DoesNotExist: + raise HTTPException(status_code=HTTPStatus.NOT_FOUND, detail="not found") +