|
20 | 20 | import aiohttp |
21 | 21 | from aiohttp.web import HTTPNotFound |
22 | 22 | from aleph_message import parse_message |
23 | | -from aleph_message.models import AlephMessage, ItemHash, ItemType |
| 23 | +from aleph_message.models import AlephMessage, ItemHash, ItemType, MessageType |
24 | 24 | from aleph_message.status import MessageStatus |
25 | 25 | from pydantic import ValidationError |
26 | 26 |
|
|
33 | 33 | ) |
34 | 34 | from ..query.filters import MessageFilter, PostFilter |
35 | 35 | from ..query.responses import MessagesResponse, Post, PostsResponse, PriceResponse |
36 | | -from ..types import GenericMessage |
| 36 | +from ..types import GenericMessage, StoredContent |
37 | 37 | from ..utils import ( |
38 | 38 | Writable, |
39 | 39 | check_unix_socket_valid, |
40 | 40 | copy_async_readable_to_buffer, |
41 | 41 | extended_json_encoder, |
42 | 42 | get_message_type_value, |
| 43 | + safe_getattr, |
43 | 44 | ) |
44 | 45 | from .abstract import AlephClient |
45 | 46 |
|
@@ -469,3 +470,36 @@ async def get_message_status(self, item_hash: str) -> MessageStatus: |
469 | 470 | resp.raise_for_status() |
470 | 471 | result = await resp.json() |
471 | 472 | return MessageStatus(result["status"]) |
| 473 | + |
| 474 | + async def get_stored_content( |
| 475 | + self, |
| 476 | + item_hash: str, |
| 477 | + ) -> StoredContent: |
| 478 | + """return the underlying content for a store message""" |
| 479 | + |
| 480 | + result, resp = None, None |
| 481 | + try: |
| 482 | + message: AlephMessage |
| 483 | + message, status = await self.get_message( |
| 484 | + item_hash=ItemHash(item_hash), with_status=True |
| 485 | + ) |
| 486 | + if status != MessageStatus.PROCESSED: |
| 487 | + resp = f"Invalid message status: {status}" |
| 488 | + elif message.type != MessageType.store: |
| 489 | + resp = f"Invalid message type: {message.type}" |
| 490 | + elif not message.content.item_hash: |
| 491 | + resp = f"Invalid CID: {message.content.item_hash}" |
| 492 | + else: |
| 493 | + filename = safe_getattr(message.content, "metadata.name") |
| 494 | + hash = message.content.item_hash |
| 495 | + url = ( |
| 496 | + f"{self.api_server}/api/v0/storage/raw/" |
| 497 | + if len(hash) == 64 |
| 498 | + else settings.IPFS_GATEWAY |
| 499 | + ) + hash |
| 500 | + result = StoredContent(filename=filename, hash=hash, url=url) |
| 501 | + except MessageNotFoundError: |
| 502 | + resp = f"Message not found: {item_hash}" |
| 503 | + except ForgottenMessageError: |
| 504 | + resp = f"Message forgotten: {item_hash}" |
| 505 | + return result if result else StoredContent(error=resp) |
0 commit comments