ATProto.send: support likes, reposts, follows

snarfed/bridgy-fed#717
pull/729/head
Ryan Barrett 2023-11-14 10:54:36 -08:00
rodzic 85ae5bc675
commit 9c5adab4f4
Nie znaleziono w bazie danych klucza dla tego podpisu
ID klucza GPG: 6BE31FDF4776E9D4
2 zmienionych plików z 100 dodań i 11 usunięć

Wyświetl plik

@ -276,17 +276,17 @@ class ATProto(User, Protocol):
type = as1.object_type(obj.as1)
base_obj = obj
if type in ('accept', 'undo'):
logger.info(f'Skipping unsupported type {type}, not writing to repo')
return False
elif type in ('post', 'update', 'delete'):
if type in ('post', 'update', 'delete'):
obj_as1 = as1.get_object(obj.as1)
type = as1.object_type(obj_as1)
base_obj = PROTOCOLS[obj.source_protocol].load(obj_as1['id'])
if not base_obj:
base_obj = obj
assert type in ('note', 'article')
collection = bluesky.AS1_TO_COLLECTION.get(type)
if not collection:
logger.info(f'Skipping unsupported type {type}, not writing to repo')
return False
from_cls = PROTOCOLS[obj.source_protocol]
from_key = from_cls.actor_key(obj)
@ -318,14 +318,13 @@ class ATProto(User, Protocol):
ndb.transactional()
def write():
tid = next_tid()
logger.info(f'Storing ATProto app.bsky.feed.post {tid}: ' +
logger.info(f'Storing ATProto {collection} {tid}: ' +
json_dumps(dag_json.encode(record).decode(), indent=2))
repo.apply_writes(
[Write(action=Action.CREATE, collection='app.bsky.feed.post',
rkey=tid, record=record)])
repo.apply_writes([Write(action=Action.CREATE, collection=collection,
rkey=tid, record=record)])
at_uri = f'at://{user.atproto_did}/app.bsky.feed.post/{tid}'
at_uri = f'at://{user.atproto_did}/{collection}/{tid}'
base_obj.add('copies', Target(uri=at_uri, protocol=to_cls.LABEL))
base_obj.put()

Wyświetl plik

@ -487,7 +487,7 @@ class ATProtoTest(TestCase):
mock_create_task.assert_called()
@patch.object(tasks_client, 'create_task', return_value=Task(name='my task'))
def test_send_existing_repo(self, mock_create_task):
def test_send_note_existing_repo(self, mock_create_task):
user = self.make_user_and_repo()
obj = self.store_object(id='fake:post', source_protocol='fake', our_as1={
**POST_AS,
@ -507,6 +507,96 @@ class ATProtoTest(TestCase):
mock_create_task.assert_called()
@patch.object(tasks_client, 'create_task', return_value=Task(name='my task'))
def test_send_like(self, mock_create_task):
user = self.make_user_and_repo()
obj = self.store_object(id='fake:like', source_protocol='fake', our_as1={
'objectType': 'activity',
'verb': 'like',
'id': 'fake:like',
'actor': 'fake:user',
'object': 'at://did/app.bsky.feed.post/tid',
})
self.assertTrue(ATProto.send(obj, 'https://atproto.brid.gy/'))
# check repo, record
repo = self.storage.load_repo(user.atproto_did)
last_tid = arroba.util.int_to_tid(arroba.util._tid_ts_last)
record = repo.get_record('app.bsky.feed.like', last_tid)
self.assertEqual({
'$type': 'app.bsky.feed.like',
'subject': {
'uri': 'at://did/app.bsky.feed.post/tid',
'cid': 'TODO',
},
'createdAt': '',
}, record)
at_uri = f'at://{user.atproto_did}/app.bsky.feed.like/{last_tid}'
self.assertEqual([Target(uri=at_uri, protocol='atproto')],
Object.get_by_id(id='fake:like').copies)
mock_create_task.assert_called()
@patch.object(tasks_client, 'create_task', return_value=Task(name='my task'))
def test_send_repost(self, mock_create_task):
user = self.make_user_and_repo()
obj = self.store_object(id='fake:repost', source_protocol='fake', our_as1={
'objectType': 'activity',
'verb': 'share',
'id': 'fake:repost',
'actor': 'fake:user',
'object': 'at://did/app.bsky.feed.post/tid',
})
self.assertTrue(ATProto.send(obj, 'https://atproto.brid.gy/'))
# check repo, record
repo = self.storage.load_repo(user.atproto_did)
last_tid = arroba.util.int_to_tid(arroba.util._tid_ts_last)
record = repo.get_record('app.bsky.feed.repost', last_tid)
self.assertEqual({
'$type': 'app.bsky.feed.repost',
'subject': {
'uri': 'at://did/app.bsky.feed.post/tid',
'cid': 'TODO',
},
'createdAt': '',
}, record)
at_uri = f'at://{user.atproto_did}/app.bsky.feed.repost/{last_tid}'
self.assertEqual([Target(uri=at_uri, protocol='atproto')],
Object.get_by_id(id='fake:repost').copies)
mock_create_task.assert_called()
@patch.object(tasks_client, 'create_task', return_value=Task(name='my task'))
def test_send_follow(self, mock_create_task):
user = self.make_user_and_repo()
obj = self.store_object(id='fake:follow', source_protocol='fake', our_as1={
'objectType': 'activity',
'verb': 'follow',
'id': 'fake:follow',
'actor': 'fake:user',
'object': 'did:plc:bob',
})
self.assertTrue(ATProto.send(obj, 'https://atproto.brid.gy/'))
# check repo, record
repo = self.storage.load_repo(user.atproto_did)
last_tid = arroba.util.int_to_tid(arroba.util._tid_ts_last)
record = repo.get_record('app.bsky.graph.follow', last_tid)
self.assertEqual({
'$type': 'app.bsky.graph.follow',
'subject': 'did:plc:bob',
'createdAt': '',
}, record)
at_uri = f'at://{user.atproto_did}/app.bsky.graph.follow/{last_tid}'
self.assertEqual([Target(uri=at_uri, protocol='atproto')],
Object.get_by_id(id='fake:follow').copies)
mock_create_task.assert_called()
@patch.object(tasks_client, 'create_task')
def test_send_not_our_repo(self, mock_create_task):
self.assertFalse(ATProto.send(Object(id='fake:post'), 'http://other.pds/'))