Skip to content

Commit c437482

Browse files
Copilotmadebygps
andcommitted
Address code review: extract helpers, fix template nesting, format
Co-authored-by: madebygps <6733686+madebygps@users.noreply.github.com>
1 parent 00620d7 commit c437482

2 files changed

Lines changed: 42 additions & 66 deletions

File tree

app/main.py

Lines changed: 37 additions & 59 deletions
Original file line numberDiff line numberDiff line change
@@ -2,13 +2,14 @@
22

33
import uuid
44
from pathlib import Path
5+
from typing import Any
56

67
from fastapi import FastAPI, Request, Response
78
from fastapi.responses import HTMLResponse
89
from fastapi.staticfiles import StaticFiles
910
from fastapi.templating import Jinja2Templates
1011

11-
from app.game_service import get_session
12+
from app.game_service import GameSession, get_session
1213
from app.models import GameState
1314

1415
BASE_DIR = Path(__file__).resolve().parent
@@ -21,103 +22,80 @@
2122
SESSION_COOKIE = "soc_ops_session"
2223

2324

24-
def _get_session_id(request: Request, response: Response) -> str:
25-
"""Get or create a session ID from cookies."""
25+
def _session_from_request(
26+
request: Request,
27+
) -> tuple[GameSession, Response]:
28+
"""Get or create session, returning the session and a Response for cookies."""
29+
response = Response()
2630
session_id = request.cookies.get(SESSION_COOKIE)
2731
if not session_id:
2832
session_id = uuid.uuid4().hex
2933
response.set_cookie(SESSION_COOKIE, session_id, httponly=True, samesite="lax")
30-
return session_id
34+
return get_session(session_id), response
35+
36+
37+
def _render(
38+
request: Request,
39+
response: Response,
40+
template: str,
41+
context: dict[str, Any],
42+
) -> Response:
43+
"""Render a template, copying any set-cookie headers from response."""
44+
content = templates.TemplateResponse(request, template, context)
45+
for key, value in response.headers.items():
46+
if key.lower() == "set-cookie":
47+
content.headers.append(key, value)
48+
return content
3149

3250

3351
@app.get("/", response_class=HTMLResponse)
3452
async def home(request: Request) -> Response:
35-
response = Response()
36-
session_id = _get_session_id(request, response)
37-
session = get_session(session_id)
38-
39-
content = templates.TemplateResponse(
53+
session, response = _session_from_request(request)
54+
return _render(
4055
request,
56+
response,
4157
"home.html",
4258
{"session": session, "GameState": GameState},
4359
)
44-
# Copy cookies from our response to the template response
45-
for key, morsel in response.headers.items():
46-
if key.lower() == "set-cookie":
47-
content.headers.append(key, morsel)
48-
return content
4960

5061

5162
@app.post("/start", response_class=HTMLResponse)
5263
async def start_game(request: Request) -> Response:
53-
response = Response()
54-
session_id = _get_session_id(request, response)
55-
session = get_session(session_id)
64+
session, response = _session_from_request(request)
5665
session.start_game()
57-
58-
content = templates.TemplateResponse(
59-
request,
60-
"components/game_screen.html",
61-
{"session": session},
66+
return _render(
67+
request, response, "components/game_screen.html", {"session": session}
6268
)
63-
for key, morsel in response.headers.items():
64-
if key.lower() == "set-cookie":
65-
content.headers.append(key, morsel)
66-
return content
6769

6870

6971
@app.post("/toggle/{square_id}", response_class=HTMLResponse)
7072
async def toggle_square(request: Request, square_id: int) -> Response:
71-
response = Response()
72-
session_id = _get_session_id(request, response)
73-
session = get_session(session_id)
73+
session, response = _session_from_request(request)
7474
session.handle_square_click(square_id)
75-
76-
content = templates.TemplateResponse(
77-
request,
78-
"components/game_screen.html",
79-
{"session": session},
75+
return _render(
76+
request, response, "components/game_screen.html", {"session": session}
8077
)
81-
for key, morsel in response.headers.items():
82-
if key.lower() == "set-cookie":
83-
content.headers.append(key, morsel)
84-
return content
8578

8679

8780
@app.post("/reset", response_class=HTMLResponse)
8881
async def reset_game(request: Request) -> Response:
89-
response = Response()
90-
session_id = _get_session_id(request, response)
91-
session = get_session(session_id)
82+
session, response = _session_from_request(request)
9283
session.reset_game()
93-
94-
content = templates.TemplateResponse(
84+
return _render(
9585
request,
86+
response,
9687
"components/start_screen.html",
9788
{"session": session, "GameState": GameState},
9889
)
99-
for key, morsel in response.headers.items():
100-
if key.lower() == "set-cookie":
101-
content.headers.append(key, morsel)
102-
return content
10390

10491

10592
@app.post("/dismiss-modal", response_class=HTMLResponse)
10693
async def dismiss_modal(request: Request) -> Response:
107-
response = Response()
108-
session_id = _get_session_id(request, response)
109-
session = get_session(session_id)
94+
session, response = _session_from_request(request)
11095
session.dismiss_modal()
111-
112-
content = templates.TemplateResponse(
113-
request,
114-
"components/game_screen.html",
115-
{"session": session},
96+
return _render(
97+
request, response, "components/game_screen.html", {"session": session}
11698
)
117-
for key, morsel in response.headers.items():
118-
if key.lower() == "set-cookie":
119-
content.headers.append(key, morsel)
120-
return content
12199

122100

123101
def run() -> None:

app/templates/home.html

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,9 @@
11
{% extends "base.html" %}
22

33
{% block content %}
4-
<div id="game-container">
5-
{% if session.game_state == GameState.START %}
6-
{% include "components/start_screen.html" %}
7-
{% else %}
8-
{% include "components/game_screen.html" %}
9-
{% endif %}
10-
</div>
4+
{% if session.game_state == GameState.START %}
5+
{% include "components/start_screen.html" %}
6+
{% else %}
7+
{% include "components/game_screen.html" %}
8+
{% endif %}
119
{% endblock %}

0 commit comments

Comments
 (0)