1
1
import logging
2
+ from dataclasses import dataclass
2
3
3
4
import socketio
4
5
from fastapi import FastAPI
5
6
from fastapi .encoders import jsonable_encoder
6
7
from models_library .api_schemas_payments .socketio import (
7
8
SOCKET_IO_PAYMENT_COMPLETED_EVENT ,
9
+ SOCKET_IO_PAYMENT_METHOD_ACKED_EVENT ,
10
+ )
11
+ from models_library .api_schemas_webserver .wallets import (
12
+ PaymentMethodTransaction ,
13
+ PaymentTransaction ,
8
14
)
9
- from models_library .api_schemas_webserver .wallets import PaymentTransaction
10
15
from models_library .users import GroupID
11
16
from servicelib .socketio_utils import cleanup_socketio_async_pubsub_manager
12
17
from settings_library .rabbit import RabbitSettings
16
21
_logger = logging .getLogger (__name__ )
17
22
18
23
24
+ @dataclass
25
+ class Notifier :
26
+ _sio_manager : socketio .AsyncAioPikaManager
27
+
28
+ async def notify_payment_completed (
29
+ self ,
30
+ user_primary_group_id : GroupID ,
31
+ payment : PaymentTransaction ,
32
+ ):
33
+ # NOTE: We assume that the user has been added to all
34
+ # rooms associated to his groups
35
+ assert payment .completed_at is not None # nosec
36
+
37
+ return await self ._sio_manager .emit (
38
+ SOCKET_IO_PAYMENT_COMPLETED_EVENT ,
39
+ data = jsonable_encoder (payment , by_alias = True ),
40
+ room = f"{ user_primary_group_id } " ,
41
+ )
42
+
43
+ async def notify_payment_method_acked (
44
+ self ,
45
+ user_primary_group_id : GroupID ,
46
+ payment_method : PaymentMethodTransaction ,
47
+ ):
48
+ return await self ._sio_manager .emit (
49
+ SOCKET_IO_PAYMENT_METHOD_ACKED_EVENT ,
50
+ data = jsonable_encoder (payment_method , by_alias = True ),
51
+ room = f"{ user_primary_group_id } " ,
52
+ )
53
+
54
+
19
55
def setup_socketio (app : FastAPI ):
20
56
settings : RabbitSettings = get_rabbitmq_settings (app )
21
57
@@ -31,6 +67,9 @@ async def _on_startup() -> None:
31
67
url = settings .dsn , logger = _logger , write_only = True
32
68
)
33
69
70
+ # NOTE: this might be moved somewhere else when notifier incorporates emails etc
71
+ app .state .notifier = Notifier (_sio_manager = app .state .external_socketio )
72
+
34
73
async def _on_shutdown () -> None :
35
74
if app .state .external_socketio :
36
75
await cleanup_socketio_async_pubsub_manager (
@@ -47,14 +86,9 @@ async def notify_payment_completed(
47
86
user_primary_group_id : GroupID ,
48
87
payment : PaymentTransaction ,
49
88
):
50
- # NOTE: We assume that the user has been added to all
51
- # rooms associated to his groups
52
- assert payment .completed_at is not None # nosec
53
89
54
- external_socketio : socketio . AsyncAioPikaManager = app .state .external_socketio
90
+ notifier : Notifier = app .state .notifier
55
91
56
- return await external_socketio .emit (
57
- SOCKET_IO_PAYMENT_COMPLETED_EVENT ,
58
- data = jsonable_encoder (payment , by_alias = True ),
59
- room = f"{ user_primary_group_id } " ,
92
+ return await notifier .notify_payment_completed (
93
+ user_primary_group_id = user_primary_group_id , payment = payment
60
94
)
0 commit comments