|
1 |
| -import json |
| 1 | +import functools |
2 | 2 | import typing
|
3 | 3 |
|
4 | 4 | import chalice.app
|
5 |
| -import chalicelib.sender as sender_module |
| 5 | +import chalicelib.send_manager as send_manager |
| 6 | +import chalicelib.send_manager.__interface__ as send_mgr_interface |
| 7 | +import pydantic |
6 | 8 |
|
7 | 9 | if typing.TYPE_CHECKING:
|
8 | 10 | import mypy_boto3_sqs.type_defs
|
|
12 | 14 | type RecordType = dict[str, typing.Any]
|
13 | 15 |
|
14 | 16 |
|
| 17 | +class WorkerPayload(pydantic.BaseModel): |
| 18 | + sender_type: str |
| 19 | + sender_payload: dict[str, typing.Any] |
| 20 | + |
| 21 | + @functools.cached_property |
| 22 | + def send_manager(self) -> send_mgr_interface.SendManagerInterface: |
| 23 | + return send_manager.send_managers[self.sender_type] |
| 24 | + |
| 25 | + @functools.cached_property |
| 26 | + def send_request_payload(self) -> send_mgr_interface.SendRequest: |
| 27 | + return self.send_manager.send_request_cls.model_validate(self.sender_payload) |
| 28 | + |
| 29 | + @pydantic.field_validator("sender_type", mode="before") |
| 30 | + @classmethod |
| 31 | + def validate_sender_type(cls, value: str) -> str: |
| 32 | + if value not in send_manager.send_managers: |
| 33 | + raise ValueError(f"Invalid sender type: {value}") |
| 34 | + return value |
| 35 | + |
| 36 | + @pydantic.model_validator(mode="after") |
| 37 | + def validate_sender_payload(self) -> typing.Self: |
| 38 | + self.send_request_payload |
| 39 | + return self |
| 40 | + |
| 41 | + def send(self) -> dict[str, str]: |
| 42 | + return self.send_manager.send(self.send_request_payload) |
| 43 | + |
| 44 | + |
15 | 45 | def notification_sender(app: chalice.app.Chalice, record: RecordType) -> dict[str, str]:
|
16 |
| - worker_payload = json.loads(record["body"])["worker_payload"] |
17 |
| - sender = sender_module.senders[worker_payload["sender_type"]] |
18 |
| - return sender(worker_payload["sender_payload"]) |
| 46 | + return WorkerPayload.model_validate_json(record["body"]).send() |
19 | 47 |
|
20 | 48 |
|
21 | 49 | workers = [notification_sender]
|
0 commit comments