Skip to content

Commit 41169d1

Browse files
committed
Move existing models to schemas namespace
This is to make room for a new ORM namespace for SQLAlchemy models
1 parent 3b5d3e4 commit 41169d1

21 files changed

+72
-49
lines changed

backend/authentication/user.py

+3-2
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,9 @@
44
from pymongo.database import Database
55
from starlette.authentication import BaseUser
66

7-
from backend import discord, models
7+
from backend import discord
88
from backend.constants import SECRET_KEY
9+
from backend.models import dtos
910

1011

1112
class User(BaseUser):
@@ -15,7 +16,7 @@ def __init__(
1516
self,
1617
token: str,
1718
payload: dict[str, t.Any],
18-
member: models.DiscordMember | None,
19+
member: dtos.DiscordMember | None,
1920
) -> None:
2021
self.token = token
2122
self.payload = payload

backend/discord.py

+12-11
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,8 @@
66
import starlette.requests
77
from starlette import exceptions
88

9-
from backend import constants, models
9+
from backend import constants
10+
from backend.models import dtos
1011

1112

1213
async def fetch_bearer_token(code: str, redirect: str, *, refresh: bool) -> dict:
@@ -51,7 +52,7 @@ async def fetch_user_details(bearer_token: str) -> dict:
5152
return r.json()
5253

5354

54-
async def _get_role_info() -> list[models.DiscordRole]:
55+
async def _get_role_info() -> list[dtos.DiscordRole]:
5556
"""Get information about the roles in the configured guild."""
5657
async with httpx.AsyncClient() as client:
5758
r = await client.get(
@@ -60,13 +61,13 @@ async def _get_role_info() -> list[models.DiscordRole]:
6061
)
6162

6263
r.raise_for_status()
63-
return [models.DiscordRole(**role) for role in r.json()]
64+
return [dtos.DiscordRole(**role) for role in r.json()]
6465

6566

6667
async def get_roles(
6768
*,
6869
force_refresh: bool = False,
69-
) -> list[models.DiscordRole]:
70+
) -> list[dtos.DiscordRole]:
7071
"""
7172
Get a list of all roles from the cache, or discord API if not available.
7273
@@ -77,7 +78,7 @@ async def get_roles(
7778
roles = await constants.REDIS_CLIENT.hgetall(role_cache_key)
7879
if roles:
7980
return [
80-
models.DiscordRole(**json.loads(role_data)) for role_id, role_data in roles.items()
81+
dtos.DiscordRole(**json.loads(role_data)) for role_id, role_data in roles.items()
8182
]
8283

8384
roles = await _get_role_info()
@@ -86,7 +87,7 @@ async def get_roles(
8687
return roles
8788

8889

89-
async def _fetch_member_api(member_id: str) -> models.DiscordMember | None:
90+
async def _fetch_member_api(member_id: str) -> dtos.DiscordMember | None:
9091
"""Get a member by ID from the configured guild using the discord API."""
9192
async with httpx.AsyncClient() as client:
9293
r = await client.get(
@@ -99,14 +100,14 @@ async def _fetch_member_api(member_id: str) -> models.DiscordMember | None:
99100
return None
100101

101102
r.raise_for_status()
102-
return models.DiscordMember(**r.json())
103+
return dtos.DiscordMember(**r.json())
103104

104105

105106
async def get_member(
106107
user_id: str,
107108
*,
108109
force_refresh: bool = False,
109-
) -> models.DiscordMember | None:
110+
) -> dtos.DiscordMember | None:
110111
"""
111112
Get a member from the cache, or from the discord API.
112113
@@ -118,7 +119,7 @@ async def get_member(
118119
if not force_refresh:
119120
result = await constants.REDIS_CLIENT.get(member_key)
120121
if result:
121-
return models.DiscordMember(**json.loads(result))
122+
return dtos.DiscordMember(**json.loads(result))
122123

123124
member = await _fetch_member_api(user_id)
124125
if member:
@@ -150,14 +151,14 @@ async def _verify_access_helper(
150151
if "admin" in request.auth.scopes:
151152
return
152153

153-
form = models.Form(**form)
154+
form = dtos.Form(**form)
154155

155156
for role_id in getattr(form, attribute, None) or []:
156157
role = await request.state.db.roles.find_one({"id": role_id})
157158
if not role:
158159
continue
159160

160-
role = models.DiscordRole(**json.loads(role["data"]))
161+
role = dtos.DiscordRole(**json.loads(role["data"]))
161162

162163
if role.name in request.auth.scopes:
163164
return

backend/models/__init__.py

-19
Original file line numberDiff line numberDiff line change
@@ -1,19 +0,0 @@
1-
from .antispam import AntiSpam
2-
from .discord_role import DiscordRole
3-
from .discord_user import DiscordMember, DiscordUser
4-
from .form import Form, FormList
5-
from .form_response import FormResponse, ResponseList
6-
from .question import CodeQuestion, Question
7-
8-
__all__ = [
9-
"AntiSpam",
10-
"CodeQuestion",
11-
"DiscordMember",
12-
"DiscordRole",
13-
"DiscordUser",
14-
"Form",
15-
"FormList",
16-
"FormResponse",
17-
"Question",
18-
"ResponseList",
19-
]

backend/models/dtos/__init__.py

+19
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
from .antispam import AntiSpam
2+
from .discord_role import DiscordRole
3+
from .discord_user import DiscordMember, DiscordUser
4+
from .form import Form, FormList
5+
from .form_response import FormResponse, ResponseList
6+
from .question import CodeQuestion, Question
7+
8+
__all__ = [
9+
"AntiSpam",
10+
"CodeQuestion",
11+
"DiscordMember",
12+
"DiscordRole",
13+
"DiscordUser",
14+
"Form",
15+
"FormList",
16+
"FormResponse",
17+
"Question",
18+
"ResponseList",
19+
]
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.

backend/models/orm/__init__.py

Whitespace-only changes.

backend/routes/discord.py

+5-4
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,8 @@
66
from starlette.responses import JSONResponse
77
from starlette.routing import Request
88

9-
from backend import discord, models, route
9+
from backend import discord, route
10+
from backend.models import dtos
1011
from backend.validation import ErrorMessage, api
1112

1213
NOT_FOUND_EXCEPTION = JSONResponse(
@@ -24,7 +25,7 @@ class RolesRoute(route.Route):
2425
class RolesResponse(pydantic.BaseModel):
2526
"""A list of all roles on the configured server."""
2627

27-
roles: list[models.DiscordRole]
28+
roles: list[dtos.DiscordRole]
2829

2930
@requires(["authenticated", "admin"])
3031
@api.validate(
@@ -53,7 +54,7 @@ class MemberRequest(pydantic.BaseModel):
5354

5455
@requires(["authenticated", "admin"])
5556
@api.validate(
56-
resp=Response(HTTP_200=models.DiscordMember, HTTP_400=ErrorMessage),
57+
resp=Response(HTTP_200=dtos.DiscordMember, HTTP_400=ErrorMessage),
5758
json=MemberRequest,
5859
tags=["auth"],
5960
)
@@ -68,7 +69,7 @@ async def delete(self, request: Request) -> JSONResponse:
6869

6970
@requires(["authenticated", "admin"])
7071
@api.validate(
71-
resp=Response(HTTP_200=models.DiscordMember, HTTP_400=ErrorMessage),
72+
resp=Response(HTTP_200=dtos.DiscordMember, HTTP_400=ErrorMessage),
7273
json=MemberRequest,
7374
tags=["auth"],
7475
)

backend/routes/forms/condorcet.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99
from starlette.responses import JSONResponse
1010

1111
from backend import discord
12-
from backend.models import Form, FormResponse, Question
12+
from backend.models.dtos import Form, FormResponse, Question
1313
from backend.route import Route
1414
from backend.validation import api
1515

backend/routes/forms/discover.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
from starlette.responses import JSONResponse
66

77
from backend import constants
8-
from backend.models import Form, FormList, Question
8+
from backend.models.dtos import Form, FormList, Question
99
from backend.route import Route
1010
from backend.validation import api
1111

backend/routes/forms/form.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
from starlette.responses import JSONResponse
1111

1212
from backend import constants, discord
13-
from backend.models import Form
13+
from backend.models.dtos import Form
1414
from backend.route import Route
1515
from backend.routes.forms.discover import AUTH_FORM
1616
from backend.validation import ErrorMessage, OkayResponse, api

backend/routes/forms/index.py

+2-2
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,8 @@
66
from starlette.responses import JSONResponse
77

88
from backend.constants import WebHook
9-
from backend.models import Form, FormList
10-
from backend.models.form import validate_hook_url
9+
from backend.models.dtos import Form, FormList
10+
from backend.models.dtos.form import validate_hook_url
1111
from backend.route import Route
1212
from backend.validation import ErrorMessage, OkayResponse, api
1313

backend/routes/forms/response.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
from starlette.responses import JSONResponse
77

88
from backend import discord
9-
from backend.models import FormResponse
9+
from backend.models.dtos import FormResponse
1010
from backend.route import Route
1111
from backend.validation import ErrorMessage, OkayResponse, api
1212

backend/routes/forms/responses.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
from starlette.responses import JSONResponse
88

99
from backend import discord
10-
from backend.models import FormResponse, ResponseList
10+
from backend.models.dtos import FormResponse, ResponseList
1111
from backend.route import Route
1212
from backend.validation import ErrorMessage, OkayResponse, api
1313

backend/routes/forms/submit.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@
1919

2020
from backend import constants
2121
from backend.authentication.user import User
22-
from backend.models import Form, FormResponse
22+
from backend.models.dtos import Form, FormResponse
2323
from backend.route import Route
2424
from backend.routes.auth.authorize import set_response_token
2525
from backend.routes.forms.discover import AUTH_FORM

backend/routes/forms/unittesting.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
from httpx import HTTPStatusError
99

1010
from backend.constants import SNEKBOX_URL
11-
from backend.models import Form, FormResponse
11+
from backend.models.dtos import Form, FormResponse
1212

1313
with Path("resources/unittest_template.py").open(encoding="utf8") as file:
1414
TEST_TEMPLATE = file.read()

docker-compose.yml

+24-4
Original file line numberDiff line numberDiff line change
@@ -20,22 +20,42 @@ services:
2020
ports:
2121
- "127.0.0.1:6379:6379"
2222

23+
postgres:
24+
image: postgres:16-alpine
25+
environment:
26+
POSTGRES_DB: backend
27+
POSTGRES_PASSWORD: backend
28+
POSTGRES_USER: backend
29+
healthcheck:
30+
test: ["CMD-SHELL", "pg_isready -U backend"]
31+
interval: 2s
32+
timeout: 1s
33+
retries: 5
34+
ports:
35+
- 5000:5432
36+
2337
backend:
2438
build: .
2539
command: ["uvicorn", "--reload", "--host", "0.0.0.0", "backend:app"]
2640
ports:
2741
- "127.0.0.1:8000:8000"
2842
depends_on:
29-
- mongo
30-
- snekbox
31-
- redis
43+
mongo:
44+
condition: service_started
45+
snekbox:
46+
condition: service_started
47+
redis:
48+
condition: service_started
49+
postgres:
50+
condition: service_healthy
3251
tty: true
3352
env_file:
3453
- .env
3554
volumes:
3655
- .:/app:ro
3756
environment:
38-
- DATABASE_URL=mongodb://forms-backend:forms-backend@mongo:27017
57+
- MONGO_DATABASE_URL=mongodb://forms-backend:forms-backend@mongo:27017
58+
- PSQL_DATABASE_URL=postgresql+psycopg_async://backend:backend@postgres:5432/backend
3959
- SNEKBOX_URL=http://snekbox:8060/eval
4060
- OAUTH2_CLIENT_ID
4161
- OAUTH2_CLIENT_SECRET

0 commit comments

Comments
 (0)