Skip to content

Commit 964020c

Browse files
authored
Fix for Terms & Conditions (#193)
* Add IPFS Gateway to conf * Move safe_getattr from CLI to SDK * Add get_stored_content
1 parent 859cbd0 commit 964020c

File tree

4 files changed

+52
-2
lines changed

4 files changed

+52
-2
lines changed

src/aleph/sdk/client/http.py

Lines changed: 36 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@
2020
import aiohttp
2121
from aiohttp.web import HTTPNotFound
2222
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
2424
from aleph_message.status import MessageStatus
2525
from pydantic import ValidationError
2626

@@ -33,13 +33,14 @@
3333
)
3434
from ..query.filters import MessageFilter, PostFilter
3535
from ..query.responses import MessagesResponse, Post, PostsResponse, PriceResponse
36-
from ..types import GenericMessage
36+
from ..types import GenericMessage, StoredContent
3737
from ..utils import (
3838
Writable,
3939
check_unix_socket_valid,
4040
copy_async_readable_to_buffer,
4141
extended_json_encoder,
4242
get_message_type_value,
43+
safe_getattr,
4344
)
4445
from .abstract import AlephClient
4546

@@ -469,3 +470,36 @@ async def get_message_status(self, item_hash: str) -> MessageStatus:
469470
resp.raise_for_status()
470471
result = await resp.json()
471472
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)

src/aleph/sdk/conf.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -85,6 +85,7 @@ class Settings(BaseSettings):
8585

8686
VM_URL_PATH = "https://aleph.sh/vm/{hash}"
8787
VM_URL_HOST = "https://{hash_base32}.aleph.sh"
88+
IPFS_GATEWAY = "https://ipfs.aleph.cloud/ipfs/"
8889

8990
# Web3Provider settings
9091
TOKEN_DECIMALS = 18

src/aleph/sdk/types.py

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -80,3 +80,10 @@ class ChainInfo(BaseModel):
8080
token: Optional[str] = None
8181
super_token: Optional[str] = None
8282
active: bool = True
83+
84+
85+
class StoredContent(BaseModel):
86+
filename: Optional[str]
87+
hash: Optional[str]
88+
url: Optional[str]
89+
error: Optional[str]

src/aleph/sdk/utils.py

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -393,3 +393,11 @@ def make_packet_header(
393393
header[20:52] = h.digest()
394394

395395
return header
396+
397+
398+
def safe_getattr(obj, attr, default=None):
399+
for part in attr.split("."):
400+
obj = getattr(obj, part, default)
401+
if obj is default:
402+
break
403+
return obj

0 commit comments

Comments
 (0)