Protocol.receive: resume existing create if it's not complete

pull/601/head
Ryan Barrett 2023-07-24 14:07:44 -07:00
rodzic 95cbfba31c
commit 414fa5f197
Nie znaleziono w bazie danych klucza dla tego podpisu
ID klucza GPG: 6BE31FDF4776E9D4
4 zmienionych plików z 64 dodań i 54 usunięć

Wyświetl plik

@ -648,28 +648,31 @@ class Protocol:
},
}
logger.info(f'Wrapping in update: {json_dumps(update_as1, indent=2)}')
obj = Object(id=id, our_as1=update_as1,
source_protocol=obj.source_protocol)
return Object(id=id, our_as1=update_as1,
source_protocol=obj.source_protocol)
# HACK: 'force' in request.form here is specific to webmention
elif obj.new or 'force' in request.form:
logger.info(f'New Object {obj.key.id()}')
id = f'{obj.key.id()}#bridgy-fed-create'
create_id = f'{obj.key.id()}#bridgy-fed-create'
create = cls.load(create_id, remote=False)
if (obj.new or not create or create.status != 'complete'
# HACK: force query param here is specific to webmention
or 'force' in request.form):
if create:
logger.info(f'Existing create {create.key} status {create.status}')
else:
logger.info(f'No existing create activity')
create_as1 = {
'objectType': 'activity',
'verb': 'post',
'id': id,
'id': create_id,
'actor': obj_actor,
'object': obj.as1,
'published': now,
}
logger.info(f'Wrapping in post: {json_dumps(create_as1, indent=2)}')
obj = Object.get_or_create(id, our_as1=create_as1,
source_protocol=obj.source_protocol)
else:
error(f'{obj.key.id()} is unchanged, nothing to do', status=204)
return Object.get_or_create(create_id, our_as1=create_as1,
source_protocol=obj.source_protocol)
return obj
error(f'{obj.key.id()} is unchanged, nothing to do', status=204)
@classmethod
def _deliver(cls, obj):

Wyświetl plik

@ -359,6 +359,51 @@ class ProtocolReceiveTest(TestCase):
self.assertEqual([(obj, 'shared:target')], Fake.sent)
def test_create_post_bare_object_existing_failed_create(self):
self.make_followers()
post_as1 = {
'id': 'fake:post',
'objectType': 'note',
'author': 'fake:user',
}
self.store_object(id='fake:post', our_as1=post_as1)
self.store_object(id='fake:post#bridgy-fed-create', status='failed')
self.assertEqual('OK', Fake.receive(post_as1))
obj = self.assert_object('fake:post#bridgy-fed-create',
status='complete',
delivered=['shared:target'],
type='post',
users=[g.user.key],
ignore=['our_as1'],
)
self.assertEqual([(obj, 'shared:target')], Fake.sent)
def test_create_post_bare_object_no_existing_create(self):
self.make_followers()
post_as1 = {
'id': 'fake:post',
'objectType': 'note',
'author': 'fake:user',
}
self.store_object(id='fake:post', our_as1=post_as1)
self.assertEqual('OK', Fake.receive(post_as1))
obj = self.assert_object('fake:post#bridgy-fed-create',
status='complete',
delivered=['shared:target'],
type='post',
users=[g.user.key],
ignore=['our_as1'],
)
self.assertEqual([(obj, 'shared:target')], Fake.sent)
def test_update_post(self):
self.make_followers()
@ -549,46 +594,6 @@ class ProtocolReceiveTest(TestCase):
)
self.assertEqual([(obj, 'fake:post:target')], Fake.sent)
# TODO: revisit? remove?
# def test_reply_not_feed_not_notification(self):
# Follower.get_or_create(to=g.user, from_=self.alice)
# g.user = None
# Fake.fetchable['fake:post'] = {
# 'objectType': 'note',
# 'id': 'fake:post',
# 'author': 'fake:eve', # we have no user for this id
# }
# reply_as1 = {
# 'objectType': 'comment',
# 'id': 'fake:reply',
# 'author': 'fake:bob',
# 'content': 'A ☕ reply',
# 'inReplyTo': 'fake:post',
# }
# create_as1 = {
# 'objectType': 'post',
# 'id': 'fake:create',
# 'object': reply_as1,
# }
# Fake.receive(create_as1)
# self.assert_object('fake:reply',
# our_as1=reply_as1,
# type='comment',
# )
# self.assert_object('fake:create',
# our_as1=create_as1,
# type='post',
# users=[Fake(id='fake:eve').key],
# # not feed since it's a reply
# # not notification since it doesn't involve the user
# delivered=['fake:post:target'],
# status='complete',
# )
# self.assertEqual([(obj, 'fake:post:target')], Fake.sent)
def test_repost(self):
self.make_followers()

Wyświetl plik

@ -780,7 +780,9 @@ class WebTest(TestCase):
def test_skip_update_if_content_unchanged(self, mock_get, mock_post):
"""https://github.com/snarfed/bridgy-fed/issues/78"""
Object(id='https://user.com/reply', mf2=REPLY_MF2).put()
self.store_object(id='https://user.com/reply', mf2=REPLY_MF2)
self.store_object(id='https://user.com/reply#bridgy-fed-create',
status='complete')
mock_get.side_effect = ACTIVITYPUB_GETS

Wyświetl plik

@ -261,7 +261,7 @@ class TestCase(unittest.TestCase, testutil.Asserts):
def store_object(**kwargs):
obj = Object(**kwargs)
obj.put()
del protocol.objects_cache[obj.key.id()]
protocol.objects_cache.pop(obj.key.id(), None)
return obj
@staticmethod