Skip to content

Commit 8778646

Browse files
committed
fix: identify StarsPurchase (#4)
1 parent 176f02f commit 8778646

20 files changed

+392
-235
lines changed

src/ttt/application/player/complete_stars_purshase.py renamed to src/ttt/application/player/complete_stars_purshase_payment.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -8,12 +8,12 @@
88
)
99
from ttt.application.player.ports.player_views import PlayerViews
1010
from ttt.application.player.ports.players import Players
11-
from ttt.entities.finance.payment.payment import PaymentAlreadyCompletedError
11+
from ttt.entities.finance.payment.payment import PaymentIsNotInProcessError
1212
from ttt.entities.tools.tracking import Tracking
1313

1414

1515
@dataclass(frozen=True, unsafe_hash=False)
16-
class CompleteStarsPurshase:
16+
class CompleteStarsPurshasePayment:
1717
clock: Clock
1818
inbox: PaidStarsPurchasePaymentInbox
1919
players: Players
@@ -32,13 +32,13 @@ async def __call__(self) -> None:
3232

3333
tracking = Tracking()
3434
try:
35-
player.complete_stars_purchase(
35+
player.complete_stars_purchase_payment(
3636
paid_payment.purshase_id,
3737
paid_payment.success,
3838
current_datetime,
3939
tracking,
4040
)
41-
except (PaymentAlreadyCompletedError):
41+
except (PaymentIsNotInProcessError):
4242
...
4343
else:
4444
await self.map_(tracking)

src/ttt/application/player/ports/player_views.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -74,12 +74,12 @@ async def render_selected_emoji_removed_view(
7474
) -> None: ...
7575

7676
@abstractmethod
77-
async def render_wait_rubles_to_start_stars_purshase_view(
77+
async def render_wait_stars_to_start_stars_purshase_view(
7878
self, location: PlayerLocation, /,
7979
) -> None: ...
8080

8181
@abstractmethod
82-
async def render_non_exchangeable_rubles_for_stars_view(
82+
async def render_invalid_stars_for_stars_purchase_view(
8383
self, location: PlayerLocation, /,
8484
) -> None: ...
8585

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
from abc import ABC, abstractmethod
22
from collections.abc import AsyncIterable
3+
from uuid import UUID
34

45
from ttt.application.player.dto.common import PaidStarsPurchasePayment
56
from ttt.entities.core.player.location import PlayerLocation
@@ -8,13 +9,22 @@
89

910
class StarsPurchasePaymentGateway(ABC):
1011
@abstractmethod
11-
async def process_payment(
12+
async def send_invoice(
1213
self,
1314
purshase: StarsPurchase,
1415
location: PlayerLocation,
15-
) -> None:
16+
) -> None: ...
17+
18+
@abstractmethod
19+
async def start_payment(self, payment_id: UUID) -> None: ...
20+
21+
@abstractmethod
22+
async def stop_payment_due_to_dublicate(self, payment_id: UUID) -> None:
1623
...
1724

25+
@abstractmethod
26+
async def stop_payment_due_to_error(self, payment_id: UUID) -> None: ...
27+
1828
@abstractmethod
1929
def paid_payment_stream(self) -> AsyncIterable[PaidStarsPurchasePayment]:
2030
...

src/ttt/application/player/initiate_stars_purchase_payment.py renamed to src/ttt/application/player/start_stars_purchase.py

Lines changed: 13 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -12,14 +12,16 @@
1212
StarsPurchasePaymentGateway,
1313
)
1414
from ttt.entities.core.player.location import PlayerLocation
15-
from ttt.entities.core.player.stars_purchase import StarsPurchase
16-
from ttt.entities.core.stars import NonExchangeableRublesForStarsError
17-
from ttt.entities.finance.rubles import Rubles
15+
from ttt.entities.core.player.stars_purchase import (
16+
InvalidStarsForStarsPurchaseError,
17+
StarsPurchase,
18+
)
19+
from ttt.entities.core.stars import Stars
1820
from ttt.entities.tools.tracking import Tracking
1921

2022

2123
@dataclass(frozen=True, unsafe_hash=False)
22-
class InitiateStarsPurchasePayment:
24+
class StartStarsPurchase:
2325
fsm: PlayerFsm
2426
transaction: Transaction
2527
players: Players
@@ -29,39 +31,33 @@ class InitiateStarsPurchasePayment:
2931
payment_gateway: StarsPurchasePaymentGateway
3032
map_: Map
3133

32-
async def __call__(
33-
self, location: PlayerLocation, rubles: Rubles,
34-
) -> None:
34+
async def __call__(self, location: PlayerLocation, stars: Stars) -> None:
3535
async with self.transaction:
36-
player, purchase_id, payment_id, current_datetime = await gather(
36+
player, purchase_id = await gather(
3737
self.players.player_with_id(location.player_id),
3838
self.uuids.random_uuid(),
39-
self.uuids.random_uuid(),
40-
self.clock.current_datetime(),
4139
)
4240

4341
tracking = Tracking()
4442
try:
45-
player.initiate_stars_purchase_payment(
43+
player.start_stars_purchase(
4644
purchase_id,
4745
location.chat_id,
48-
payment_id,
49-
rubles,
50-
current_datetime,
46+
stars,
5147
tracking,
5248
)
53-
except NonExchangeableRublesForStarsError:
49+
except InvalidStarsForStarsPurchaseError:
5450
await self.fsm.set(None)
5551
await (
5652
self.player_views
57-
.render_non_exchangeable_rubles_for_stars_view(location)
53+
.render_invalid_stars_for_stars_purchase_view(location)
5854
)
5955
return
6056

6157
await self.map_(tracking)
6258
await self.fsm.set(None)
6359
await gather(*[
64-
self.payment_gateway.process_payment(it, location)
60+
self.payment_gateway.send_invoice(it, location)
6561
for it in tracking.new
6662
if isinstance(it, StarsPurchase)
6763
])
Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
from asyncio import gather
2+
from dataclasses import dataclass
3+
from uuid import UUID
4+
5+
from ttt.application.common.ports.clock import Clock
6+
from ttt.application.common.ports.map import Map
7+
from ttt.application.common.ports.transaction import Transaction
8+
from ttt.application.common.ports.uuids import UUIDs
9+
from ttt.application.player.ports.players import Players
10+
from ttt.application.player.ports.stars_purchase_payment_gateway import (
11+
StarsPurchasePaymentGateway,
12+
)
13+
from ttt.entities.core.player.player import NoPurchaseError
14+
from ttt.entities.finance.payment.payment import PaymentIsAlreadyBeingMadeError
15+
from ttt.entities.tools.tracking import Tracking
16+
17+
18+
@dataclass(frozen=True, unsafe_hash=False)
19+
class StartStarsPurchasePayment:
20+
transaction: Transaction
21+
uuids: UUIDs
22+
clock: Clock
23+
players: Players
24+
payment_gateway: StarsPurchasePaymentGateway
25+
map_: Map
26+
27+
async def __call__(self, player_id: int, purchase_id: UUID) -> None:
28+
async with self.transaction:
29+
player, payment_id, current_datetime = await gather(
30+
self.players.player_with_id(player_id),
31+
self.uuids.random_uuid(),
32+
self.clock.current_datetime(),
33+
)
34+
35+
tracking = Tracking()
36+
try:
37+
player.process_stars_purchase_payment(
38+
purchase_id, payment_id, current_datetime, tracking,
39+
)
40+
except PaymentIsAlreadyBeingMadeError:
41+
await self.payment_gateway.stop_payment_due_to_dublicate(
42+
payment_id,
43+
)
44+
except NoPurchaseError:
45+
await self.payment_gateway.stop_payment_due_to_error(
46+
payment_id,
47+
)
48+
else:
49+
await self.map_(tracking)
50+
await self.payment_gateway.start_payment(payment_id)

src/ttt/application/player/start_stars_purshase_completion.py renamed to src/ttt/application/player/start_stars_purshase_payment_completion.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010

1111

1212
@dataclass(frozen=True, unsafe_hash=False)
13-
class StartStarsPurshaseCompletion:
13+
class StartStarsPurshasePaymentCompletion:
1414
inbox: PaidStarsPurchasePaymentInbox
1515
payment_gateway: StarsPurchasePaymentGateway
1616
player_views: PlayerViews

src/ttt/application/player/wait_rubles_to_start_stars_purshase.py renamed to src/ttt/application/player/wait_stars_to_start_stars_purshase.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,12 +6,12 @@
66

77

88
@dataclass(frozen=True, unsafe_hash=False)
9-
class WaitRublesToStartStarsPurshase:
9+
class WaitStarsToStartStarsPurshase:
1010
fsm: PlayerFsm
1111
player_views: PlayerViews
1212

1313
async def __call__(self, location: PlayerLocation) -> None:
1414
await (
1515
self.player_views
16-
.render_wait_rubles_to_start_stars_purshase_view(location)
16+
.render_wait_stars_to_start_stars_purshase_view(location)
1717
)

src/ttt/entities/core/player/player.py

Lines changed: 33 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
from ttt.entities.core.player.stars_purchase import StarsPurchase
1010
from ttt.entities.core.player.win import Win
1111
from ttt.entities.core.stars import Stars
12+
from ttt.entities.finance.payment.payment import cancel_payment, complete_payment
1213
from ttt.entities.finance.payment.success import PaymentSuccess
1314
from ttt.entities.finance.rubles import Rubles
1415
from ttt.entities.math.random import Random, deviated_int
@@ -185,48 +186,60 @@ def remove_selected_emoji(self, tracking: Tracking) -> None:
185186
self.selected_emoji_id = None
186187
tracking.register_mutated(self)
187188

188-
def initiate_stars_purchase_payment( # noqa: PLR0913, PLR0917
189+
def start_stars_purchase(
189190
self,
190191
purchase_id: UUID,
191192
purchase_chat_id: int,
192-
payment_id: UUID,
193-
paid_rubles: Rubles,
194-
current_datetime: datetime,
193+
purchase_stars: Stars,
195194
tracking: Tracking,
196195
) -> None:
197196
"""
198-
:raises ttt.entities.core.stars.NonExchangeableRublesForStarsError:
197+
:raises ttt.entities.core.stars.InvalidStarsForStarsPurchaseError:
199198
"""
200199

201-
stars_purchase = StarsPurchase.initiate_payment(
200+
stars_purchase = StarsPurchase.start(
202201
purchase_id,
203202
PlayerLocation(self.id, purchase_chat_id),
204-
payment_id,
205-
paid_rubles,
206-
current_datetime,
203+
purchase_stars,
207204
tracking,
208205
)
209206
self.stars_purchases.append(stars_purchase)
210207

211-
def complete_stars_purchase(
208+
def process_stars_purchase_payment(
212209
self,
213210
purchase_id: UUID,
214-
payment_success: PaymentSuccess,
211+
payment_id: UUID,
215212
current_datetime: datetime,
216213
tracking: Tracking,
217214
) -> None:
218215
"""
219216
:raises ttt.entities.player.player.NoPurchaseError:
220-
:raises ttt.entities.finance.payment.payment.PaymentAlreadyCompletedError:
217+
:raises ttt.entities.finance.payment.payment.PaymentIsAlreadyBeingMadeError:
221218
""" # noqa: E501
222219

223220
purchase = self._stars_purchase(purchase_id)
221+
purchase.start_payment(payment_id, current_datetime, tracking)
224222

225-
self.account = self.account.map(
226-
lambda stars: stars + purchase.new_stars,
227-
)
223+
def complete_stars_purchase_payment(
224+
self,
225+
purchase_id: UUID,
226+
payment_success: PaymentSuccess,
227+
current_datetime: datetime,
228+
tracking: Tracking,
229+
) -> None:
230+
"""
231+
:raises ttt.entities.player.player.NoPurchaseError:
232+
:raises ttt.entities.finance.payment.payment.NoPaymentError:
233+
:raises ttt.entities.finance.payment.payment.PaymentIsNotInProcessError:
234+
"""
235+
236+
purchase = self._stars_purchase(purchase_id)
237+
238+
self.account = self.account.map(lambda stars: stars + purchase.stars)
228239
tracking.register_mutated(self)
229-
purchase.payment.complete(payment_success, current_datetime, tracking)
240+
complete_payment(
241+
purchase.payment, payment_success, current_datetime, tracking,
242+
)
230243

231244
def cancel_stars_purchase(
232245
self,
@@ -236,11 +249,12 @@ def cancel_stars_purchase(
236249
) -> None:
237250
"""
238251
:raises ttt.entities.player.player.NoPurchaseError:
239-
:raises ttt.entities.finance.payment.payment.PaymentAlreadyCompletedError:
240-
""" # noqa: E501
252+
:raises ttt.entities.finance.payment.payment.NoPaymentError:
253+
:raises ttt.entities.finance.payment.payment.PaymentIsNotInProcessError:
254+
"""
241255

242256
purchase = self._stars_purchase(purchase_id)
243-
purchase.payment.cancel(current_datetime, tracking)
257+
cancel_payment(purchase.payment, current_datetime, tracking)
244258

245259
def _stars_purchase(self, purchase_id: UUID) -> StarsPurchase:
246260
"""

0 commit comments

Comments
 (0)