🍱 Add ohmyapi_demo
This commit is contained in:
parent
90f257ae38
commit
61ef27936c
3 changed files with 106 additions and 0 deletions
2
src/ohmyapi/builtin/demo/__init__.py
Normal file
2
src/ohmyapi/builtin/demo/__init__.py
Normal file
|
|
@ -0,0 +1,2 @@
|
|||
from . import models
|
||||
from . import routes
|
||||
50
src/ohmyapi/builtin/demo/models.py
Normal file
50
src/ohmyapi/builtin/demo/models.py
Normal file
|
|
@ -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
|
||||
54
src/ohmyapi/builtin/demo/routes.py
Normal file
54
src/ohmyapi/builtin/demo/routes.py
Normal file
|
|
@ -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")
|
||||
|
||||
Loading…
Add table
Add a link
Reference in a new issue