|
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