Skip to content

Commit 5d3c8f3

Browse files
committed
ref(User): remove aggregation data (#59)
1 parent bcc20f3 commit 5d3c8f3

File tree

8 files changed

+106
-80
lines changed

8 files changed

+106
-80
lines changed

src/ttt/entities/core/user/user.py

Lines changed: 0 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -83,10 +83,6 @@ class User:
8383
selected_emoji_id: UUID | None
8484
rating: EloRating
8585
admin_right: AdminRight | None
86-
87-
number_of_wins: int
88-
number_of_draws: int
89-
number_of_defeats: int
9086
game_location: UserGameLocation | None
9187

9288
emoji_cost: ClassVar[Stars] = 1000
@@ -253,7 +249,6 @@ def lose_to_user(
253249

254250
self.leave_game(tracking)
255251

256-
self.number_of_defeats += 1
257252
new_rating = new_elo_rating(
258253
self.rating,
259254
enemy_rating,
@@ -272,8 +267,6 @@ def lose_to_ai(self, tracking: Tracking) -> UserLoss:
272267
"""
273268

274269
self.leave_game(tracking)
275-
276-
self.number_of_defeats += 1
277270
tracking.register_mutated(self)
278271

279272
return UserLoss(user_id=self.id, rating_vector=None)
@@ -290,9 +283,6 @@ def win_against_user(
290283
"""
291284

292285
self.leave_game(tracking)
293-
294-
self.number_of_wins += 1
295-
296286
new_rating = new_elo_rating(
297287
self.rating,
298288
enemy_rating,
@@ -327,9 +317,6 @@ def be_draw_against_user(
327317
"""
328318

329319
self.leave_game(tracking)
330-
331-
self.number_of_draws += 1
332-
333320
new_rating = new_elo_rating(
334321
self.rating,
335322
enemy_rating,
@@ -348,8 +335,6 @@ def be_draw_against_ai(self, tracking: Tracking) -> UserDraw:
348335
"""
349336

350337
self.leave_game(tracking)
351-
352-
self.number_of_draws += 1
353338
tracking.register_mutated(self)
354339

355340
return UserDraw(self.id, rating_vector=None)
@@ -443,9 +428,6 @@ def register_user(user_id: int, tracking: Tracking) -> User:
443428
emojis=[],
444429
selected_emoji_id=None,
445430
rating=initial_elo_rating,
446-
number_of_wins=0,
447-
number_of_draws=0,
448-
number_of_defeats=0,
449431
game_location=None,
450432
admin_right=None,
451433
)
Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
"""
2+
remove aggregation data from `users`.
3+
4+
Revision ID: 679c935495d1
5+
Revises: dc59db88676c
6+
Create Date: 2025-09-16 04:42:25.995128
7+
8+
"""
9+
10+
from collections.abc import Sequence
11+
12+
import sqlalchemy as sa
13+
from alembic import op
14+
15+
16+
revision: str = "679c935495d1"
17+
down_revision: str | None = "dc59db88676c"
18+
branch_labels: str | Sequence[str] | None = None
19+
depends_on: str | Sequence[str] | None = None
20+
21+
22+
def upgrade() -> None:
23+
# ### commands auto generated by Alembic - please adjust! ###
24+
op.drop_column("users", "number_of_draws")
25+
op.drop_column("users", "number_of_wins")
26+
op.drop_column("users", "number_of_defeats")
27+
# ### end Alembic commands ###
28+
29+
30+
def downgrade() -> None:
31+
# ### commands auto generated by Alembic - please adjust! ###
32+
op.add_column(
33+
"users",
34+
sa.Column(
35+
"number_of_defeats",
36+
sa.INTEGER(),
37+
autoincrement=False,
38+
nullable=False,
39+
),
40+
)
41+
op.add_column(
42+
"users",
43+
sa.Column(
44+
"number_of_wins",
45+
sa.INTEGER(),
46+
autoincrement=False,
47+
nullable=False,
48+
),
49+
)
50+
op.add_column(
51+
"users",
52+
sa.Column(
53+
"number_of_draws",
54+
sa.INTEGER(),
55+
autoincrement=False,
56+
nullable=False,
57+
),
58+
)
59+
# ### end Alembic commands ###

src/ttt/infrastructure/sqlalchemy/tables/user.py

Lines changed: 0 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -82,9 +82,6 @@ class TableUser(Base[User]):
8282
index=True,
8383
)
8484
rating: Mapped[float]
85-
number_of_wins: Mapped[int]
86-
number_of_draws: Mapped[int]
87-
number_of_defeats: Mapped[int]
8885
game_location_game_id: Mapped[UUID | None] = mapped_column(
8986
ForeignKey("games.id", deferrable=True, initially="DEFERRED"),
9087
index=True,
@@ -134,9 +131,6 @@ def __entity__(self) -> User:
134131
emojis=[it.entity() for it in self.emojis],
135132
selected_emoji_id=self.selected_emoji_id,
136133
rating=self.rating,
137-
number_of_wins=self.number_of_wins,
138-
number_of_draws=self.number_of_draws,
139-
number_of_defeats=self.number_of_defeats,
140134
game_location=location,
141135
admin_right=admin_right,
142136
)
@@ -164,9 +158,6 @@ def of(cls, it: User) -> "TableUser":
164158
account_stars=it.account.stars,
165159
selected_emoji_id=it.selected_emoji_id,
166160
rating=it.rating,
167-
number_of_wins=it.number_of_wins,
168-
number_of_draws=it.number_of_draws,
169-
number_of_defeats=it.number_of_defeats,
170161
game_location_game_id=game_location_game_id,
171162
admin_right=admin_right,
172163
admin_right_via_other_admin_admin_id=(

src/ttt/presentation/adapters/user_views.py

Lines changed: 46 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -20,10 +20,12 @@
2020
from ttt.entities.core.stars import Stars
2121
from ttt.entities.core.user.location import UserGameLocation
2222
from ttt.entities.core.user.user import User, is_user_in_game, user_stars
23+
from ttt.entities.tools.assertion import not_none
2324
from ttt.infrastructure.sqlalchemy.stmts import (
2425
selected_user_emoji_str_from_postgres,
2526
user_emojis_from_postgres,
2627
)
28+
from ttt.infrastructure.sqlalchemy.tables.game import TableGame
2729
from ttt.infrastructure.sqlalchemy.tables.invitation_to_game import (
2830
TableInvitationToGame,
2931
TableInvitationToGameState,
@@ -80,13 +82,7 @@ async def view_of_user_with_id(
8082
/,
8183
) -> None:
8284
user_stmt = (
83-
select(
84-
TableUser.number_of_wins,
85-
TableUser.number_of_draws,
86-
TableUser.number_of_defeats,
87-
TableUser.account_stars,
88-
TableUser.rating,
89-
)
85+
select(TableUser.account_stars, TableUser.rating)
9086
.where(TableUser.id == user_id)
9187
)
9288
result = await self._session.execute(user_stmt)
@@ -96,10 +92,31 @@ async def view_of_user_with_id(
9692
await need_to_start_message(self._bot, user_id)
9793
return
9894

95+
wins_stmt = (
96+
select(func.count(1))
97+
.where(TableGame.result_decided_game_user_win_user_id == user_id)
98+
)
99+
wins = not_none(await self._session.scalar(wins_stmt))
100+
101+
draws_stmt = (
102+
select(func.count(1))
103+
.where(
104+
(TableGame.result_draw_game_user_draw1_user_id == user_id)
105+
| (TableGame.result_draw_game_user_draw2_user_id == user_id),
106+
)
107+
)
108+
draws = not_none(await self._session.scalar(draws_stmt))
109+
110+
defeats_stmt = (
111+
select(func.count(1))
112+
.where(TableGame.result_decided_game_user_loss_user_id == user_id)
113+
)
114+
defeats = not_none(await self._session.scalar(defeats_stmt))
115+
99116
view = UserProfileView.of(
100-
user_row.number_of_wins,
101-
user_row.number_of_draws,
102-
user_row.number_of_defeats,
117+
wins,
118+
draws,
119+
defeats,
103120
user_row.account_stars,
104121
user_row.rating,
105122
)
@@ -326,9 +343,6 @@ async def user_is_not_admin_view(self, user: User, /) -> None:
326343
async def other_user_view(self, user: User, other_user_id: int, /) -> None:
327344
stmt = (
328345
select(
329-
TableUser.number_of_wins,
330-
TableUser.number_of_draws,
331-
TableUser.number_of_defeats,
332346
TableUser.account_stars,
333347
TableUser.rating,
334348
TableUser.admin_right,
@@ -349,6 +363,22 @@ async def other_user_view(self, user: User, other_user_id: int, /) -> None:
349363
)
350364
return
351365

366+
wins_stmt = select(func.count(1)).where(
367+
TableGame.result_decided_game_user_win_user_id == other_user_id,
368+
)
369+
wins = not_none(await self._session.scalar(wins_stmt))
370+
371+
draws_stmt = select(func.count(1)).where(
372+
(TableGame.result_draw_game_user_draw1_user_id == other_user_id)
373+
| (TableGame.result_draw_game_user_draw2_user_id == other_user_id),
374+
)
375+
draws = not_none(await self._session.scalar(draws_stmt))
376+
377+
defeats_stmt = select(func.count(1)).where(
378+
TableGame.result_decided_game_user_loss_user_id == other_user_id,
379+
)
380+
defeats = not_none(await self._session.scalar(defeats_stmt))
381+
352382
if row.admin_right is None:
353383
admin_right = None
354384
else:
@@ -359,9 +389,9 @@ async def other_user_view(self, user: User, other_user_id: int, /) -> None:
359389
view = OtherUserProfileView.of(
360390
other_user_id,
361391
admin_right,
362-
row.number_of_wins,
363-
row.number_of_draws,
364-
row.number_of_defeats,
392+
wins,
393+
draws,
394+
defeats,
365395
row.account_stars,
366396
row.rating,
367397
)

tests/test_ttt/test_entities/test_core/conftest.py

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -28,9 +28,6 @@ def user1() -> User:
2828
emojis=[],
2929
selected_emoji_id=None,
3030
rating=1000.,
31-
number_of_wins=0,
32-
number_of_draws=0,
33-
number_of_defeats=0,
3431
game_location=UserGameLocation(1, UUID(int=0)),
3532
admin_right=None,
3633
)
@@ -44,9 +41,6 @@ def user2() -> User:
4441
emojis=[],
4542
rating=1000.,
4643
selected_emoji_id=None,
47-
number_of_wins=0,
48-
number_of_draws=0,
49-
number_of_defeats=0,
5044
game_location=UserGameLocation(2, UUID(int=0)),
5145
admin_right=None,
5246
)

tests/test_ttt/test_entities/test_core/test_game.py

Lines changed: 0 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -428,9 +428,6 @@ def test_winning_game( # noqa: PLR0913, PLR0917
428428
emojis=[],
429429
rating=1020.0,
430430
selected_emoji_id=None,
431-
number_of_wins=1,
432-
number_of_draws=0,
433-
number_of_defeats=0,
434431
game_location=None,
435432
admin_right=None,
436433
)
@@ -442,9 +439,6 @@ def test_winning_game( # noqa: PLR0913, PLR0917
442439
emojis=[],
443440
rating=981.1500225556907,
444441
selected_emoji_id=None,
445-
number_of_wins=0,
446-
number_of_draws=0,
447-
number_of_defeats=1,
448442
game_location=None,
449443
admin_right=None,
450444
)
@@ -521,9 +515,6 @@ def test_drawn_game( # noqa: PLR0913, PLR0917
521515
emojis=[],
522516
rating=1020.0,
523517
selected_emoji_id=None,
524-
number_of_wins=0,
525-
number_of_draws=1,
526-
number_of_defeats=0,
527518
game_location=None,
528519
admin_right=None,
529520
)
@@ -535,9 +526,6 @@ def test_drawn_game( # noqa: PLR0913, PLR0917
535526
emojis=[],
536527
rating=1020.0,
537528
selected_emoji_id=None,
538-
number_of_wins=0,
539-
number_of_draws=1,
540-
number_of_defeats=0,
541529
game_location=None,
542530
admin_right=None,
543531
)
@@ -614,9 +602,6 @@ def test_winning_game_with_filled_board( # noqa: PLR0913, PLR0917
614602
emojis=[],
615603
rating=1020.0,
616604
selected_emoji_id=None,
617-
number_of_wins=1,
618-
number_of_draws=0,
619-
number_of_defeats=0,
620605
game_location=None,
621606
admin_right=None,
622607
)
@@ -628,9 +613,6 @@ def test_winning_game_with_filled_board( # noqa: PLR0913, PLR0917
628613
emojis=[],
629614
rating=981.1500225556907,
630615
selected_emoji_id=None,
631-
number_of_wins=0,
632-
number_of_draws=0,
633-
number_of_defeats=1,
634616
game_location=None,
635617
admin_right=None,
636618
)

tests/test_ttt/test_entities/test_core/test_user.py

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -16,9 +16,6 @@ def test_create_user(tracking: Tracking, object_: str) -> None:
1616
emojis=[],
1717
rating=1000.,
1818
selected_emoji_id=None,
19-
number_of_wins=0,
20-
number_of_draws=0,
21-
number_of_defeats=0,
2219
game_location=None,
2320
admin_right=None,
2421
)

tests/test_ttt/test_infrastructure/test_adapters/test_game_dao.py

Lines changed: 1 addition & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -31,9 +31,6 @@ def player1() -> User:
3131
emojis=[],
3232
selected_emoji_id=None,
3333
rating=1000.,
34-
number_of_wins=0,
35-
number_of_draws=0,
36-
number_of_defeats=0,
3734
game_location=UserGameLocation(1, UUID(int=0)),
3835
admin_right=None,
3936
)
@@ -97,13 +94,7 @@ async def test_games_played_by_player_id(
9794
) -> None:
9895
async with session.begin():
9996
await session.execute(
100-
insert(TableUser).values({
101-
"id": 1,
102-
"rating": 1000,
103-
"number_of_wins": 0,
104-
"number_of_draws": 0,
105-
"number_of_defeats": 0,
106-
}),
97+
insert(TableUser).values({"id": 1, "rating": 1000}),
10798
)
10899
if games:
109100
await session.execute(

0 commit comments

Comments
 (0)