From d14d50a4b15e5705b5a6715aa32a84c60a0acc41 Mon Sep 17 00:00:00 2001 From: codl Date: Fri, 14 May 2021 19:37:18 +0200 Subject: [PATCH 1/2] add import_statuses endpoint. not tested yet --- routes/api.py | 36 +++++++++++++++++++++++++++++++++++- 1 file changed, 35 insertions(+), 1 deletion(-) diff --git a/routes/api.py b/routes/api.py index 4f35f17..44d9438 100644 --- a/routes/api.py +++ b/routes/api.py @@ -1,10 +1,11 @@ from app import app, db from libforget.auth import require_auth_api, get_viewer from flask import jsonify, redirect, make_response, request, Response -from model import Account +from model import Account, Post import libforget.settings import libforget.json import random +from werkzeug.exceptions import BadRequest @app.route('/api/health_check') def health_check(): @@ -79,3 +80,36 @@ def known_instances(): resp = Response('', 204) resp.set_cookie('forget_known_instances', '', max_age=0) return resp + +class MalformedStatusList(werkzeug.exceptions.BadRequest): + pass + +@app.route('/api/import_statuses', method=('POST',)) +@require_auth_api +def import_statuses(): + """ + accepts json in the form + + [ {id, favourite, has_media, direct, is_reblog}, ... ] + """ + statuses = request.json + viewer = get_viewer() + if not isinstance(statuses, list): + raise MalformedStatusList() + with db.session.no_autoflush: + for post in statuses: + expected_keys = ('id', 'favourite', 'has_media', 'direct', 'is_reblog') + if set(post.keys()) != expected_keys: + raise MalformedStatusList() + + post['author_id'] = viewer.id + if viewer.service == 'twitter': + post['id'] = "twitter:{}".format(post['id']) + elif viewer.service == 'mastodon': + post['id'] = "mastodon:{}:{}".format( + viewer.mastdon_instance, + post['id']) + + db.session.merge(Post(**post)) + + db.session.commit() From 6bd8b0da58624119be11c5af4987d2a25c15a0ab Mon Sep 17 00:00:00 2001 From: codl Date: Fri, 14 May 2021 19:54:39 +0200 Subject: [PATCH 2/2] import_statuses fixes --- routes/api.py | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/routes/api.py b/routes/api.py index 44d9438..1672777 100644 --- a/routes/api.py +++ b/routes/api.py @@ -96,13 +96,20 @@ def import_statuses(): viewer = get_viewer() if not isinstance(statuses, list): raise MalformedStatusList() + + expected_keys = ('id', 'favourite', 'has_media', 'direct', 'is_reblog') + boolean_keys = ('favourite', 'has_media', 'direct', 'is_reblog') + with db.session.no_autoflush: for post in statuses: - expected_keys = ('id', 'favourite', 'has_media', 'direct', 'is_reblog') - if set(post.keys()) != expected_keys: + if not isinstance(post, dict) or set(post.keys()) != expected_keys: raise MalformedStatusList() + for key in boolean_keys: + post[key] = post[key] == 'true' + post['author_id'] = viewer.id + if viewer.service == 'twitter': post['id'] = "twitter:{}".format(post['id']) elif viewer.service == 'mastodon':