Quellcode durchsuchen

use meta endpoint for hash, qr and preview

Pi vor 3 Monaten
Ursprung
Commit
1582f293ee

+ 38 - 49
rest/pyapi.py

@@ -63,49 +63,51 @@ SELECT content FROM upload_temp WHERE rowid = ? LIMIT 1;
     return data
 
 
-@route('/goto/preview', method=['GET'])
-def get_goto_preview():
-    link = request.params.link
+@route('/<route:re:(clip|goto|upload|code)>/meta', method=['POST'])
+def get_meta(route):
     response.content_type = 'application/json'
-    if not link:
-        return dumps(None)
-    try:
-        page = link_preview(link, parser="lxml")
-        return dumps({
-            'title': page.title,
-            'img': page.absolute_image,
-            'domain': page.site_name,
-            'link': link,
-        })
-    except:
-        return dumps(None)
-
-@route('/code/preview', method=['POST'])
-def get_code_preview():
-    body = load(request.body)
-    if not body:
-        abort(404, 'Empty request')
-    
-    response.content_type = 'text/plain'
-    if body['format'] == 'QR_CODE':
-        return b64encode(get_qr_code(body['content'], err_lvl=body['errorCorrectionLevel']))
-    return b64encode(get_bar_code(body))
-
-
-@route('/<route:re:(clip|goto|upload|code)>/hash', method=['POST'])
-def get_hash(route):
     body = load(request.body)
-    data = body['data']
-    person = body.get('person', None)
+    person = route
     if route == 'upload':
-        data = parse_upload_placeholder(data)
+        data = parse_upload_placeholder(body['data'])
     elif route == 'code':
-        data = dumps(loads(body['data']), sort_keys=True).encode('utf-8')
+        data = dumps(body['data'], sort_keys=True).encode('utf-8')
     else:
-        data = data.encode('utf-8')
+        data = body['data'].encode('utf-8')
 
     _bytes = blake(data, person = person and person.encode('utf-8'))
-    return bytes_to_base32(_bytes)
+    hash = bytes_to_base32(_bytes)
+    fallback = f'https://shandan.one/{route}/{hash}'
+
+    preview = None
+    if route == 'goto':
+        link = data.decode('utf-8')
+        try:
+            page = link_preview(link, parser="lxml")
+            preview = {
+                'title': page.title,
+                'img': page.absolute_image,
+                'domain': page.site_name,
+                'link': link,
+            }
+        except:
+            pass
+    elif route == 'code':
+        if body['data']['format'] == 'QR_CODE':
+            preview = b64encode(get_qr_code(body['data']['content'], err_lvl=body['data']['errorCorrectionLevel']))
+        else:
+            preview = b64encode(get_bar_code(body['data']))
+        preview = preview.decode('utf-8')
+
+    qr = None
+    if route != 'code':
+        qr = get_qr_code(data, fallback = fallback).decode('utf-8')
+
+    return dumps({
+        'hash': hash,
+        'qr': qr,
+        'preview': preview,
+    })
 
 @route('/<route:re:(clip|goto|upload)>/normalize', method=['GET'])
 def normalize(route):
@@ -116,19 +118,6 @@ def normalize(route):
         'o': normalize_base32(_hash) if _hash else None,
     })
 
-@route('/<route:re:(clip|goto|upload)>/qr', method=['POST'])
-def get_qr(route):
-    body = load(request.body)
-    data = body['data']
-    fallback = body.get('fallback', None)
-    if route == 'upload':
-        data = parse_upload_placeholder(data)
-    else:
-        data = data.encode('utf-8')
-
-    response.content_type = 'image/svg+xml'
-    return get_qr_code(data, fallback = fallback).decode('utf-8')
-
 @route('/static/<filename:path>')
 def send_static(filename):
     return static_file(filename, root='rest/static')

+ 11 - 3
util-sqlpage/code.sql

@@ -1,8 +1,16 @@
 SET ":has_post_params" = (SELECT 1 FROM json_each(sqlpage.variables('post')) LIMIT 1);
 SET ":content" = (SELECT json_patch(sqlpage.variables('post'), '{
     "has_post_params": null,
-    "inner": null,
     "timestamp": null
 }'));
-SET ":inner" = 'code/Index.sql';
-SELECT 'dynamic' AS component, sqlpage.run_sql('code/entry.sql') AS properties;
+SET ":title" = 'Code';
+SET ":tool" = 'code';
+SET ":hash" = COALESCE($hash, '');
+SET ":hash" = sqlpage.url_encode(:hash);
+SET ":link" = '/code.sql';
+SET ":color" = '#f59f00';
+SET ":tabler_color" = 'azure';
+SET ":image" = '/static/code/qr.svg';
+--SET ":favicon" = :image;
+--SET ":manifest" = '/static/upload/manifest.json';
+SELECT 'dynamic' AS component, sqlpage.run_sql('code/Index.sql') AS properties;

+ 0 - 11
util-sqlpage/code/entry.sql

@@ -1,11 +0,0 @@
-SET ":title" = 'Code';
-SET ":tool" = 'code';
-SET ":hash" = COALESCE($hash, '');
-SET ":hash" = sqlpage.url_encode(:hash);
-SET ":link" = '/code.sql';
-SET ":color" = '#f59f00';
-SET ":tabler_color" = 'azure';
-SET ":image" = '/static/code/qr.svg';
---SET ":favicon" = :image;
---SET ":manifest" = '/static/upload/manifest.json';
-SELECT 'dynamic' AS component, sqlpage.run_sql(:inner) AS properties;

+ 5 - 11
util-sqlpage/code/save.sql

@@ -1,18 +1,12 @@
 SET ":request" = json_object(
     'method', 'POST',
-    'url', 'https://shandan.one/code/hash',
+    'url', 'https://shandan.one/code/meta',
     'headers', json_object(),
     'body', json_object(
-        'data', :content,
-        'person', :tool
+        'data', json(:content)
     )
 );
-SET ":hash" = sqlpage.fetch(:request);
-SET ":request" = json_object(
-    'method', 'POST',
-    'url', 'https://shandan.one/code/preview',
-    'headers', json_object(),
-    'body', :content
-);
-SET ":preview" = sqlpage.fetch(:request);
+SET ":meta" = sqlpage.fetch(:request);
+SET ":hash" = :meta->>'hash';
+SET ":preview" = :meta->>'preview';
 SELECT 'dynamic' AS component, sqlpage.run_sql('code/new.sql') AS properties;

+ 3 - 6
util-sqlpage/goto/preview.sql

@@ -1,9 +1,6 @@
-SET ":content" = COALESCE(:content, '');
-SET ":url" = 'https://shandan.one/goto/preview?link=' || sqlpage.url_encode(:content);
-SET ":api_results" = sqlpage.fetch(:url);
-SET ":title" = :api_results->>'title';
-SET ":image" = :api_results->>'img';
-SET ":domain" = :api_results->>'domain';
+SET ":title" = :preview->>'title';
+SET ":image" = :preview->>'img';
+SET ":domain" = :preview->>'domain';
 SELECT 'card' AS component
 , 2 AS columns
 ;

+ 9 - 16
util-sqlpage/sqlpage/save.sql

@@ -1,24 +1,17 @@
 SET ":request" = json_object(
     'method', 'POST',
-    'url', 'https://shandan.one/'||:tool||'/hash',
+    'url', 'https://shandan.one/'||:tool||'/meta',
     'headers', json_object(),
     'timeout_ms', 15000,
     'body', json_object(
-        'data', :content,
-        'person', :tool
+        'data', CASE :tool
+            WHEN 'code' THEN json(:content)
+            ELSE :content
+        END
     )
 );
-SET ":hash" = sqlpage.fetch(:request);
-SET ":fallback" = 'https://shandan.one/'||:tool||'/'||sqlpage.url_encode(:hash);
-SET ":request" = json_object(
-    'method', 'POST',
-    'url', 'https://shandan.one/'||:tool||'/qr',
-    'headers', json_object(),
-    'timeout_ms', 15000,
-    'body', json_object(
-        'data', :content,
-        'fallback', :fallback
-    )
-);
-SET ":qr" = sqlpage.fetch(:request);
+SET ":meta" = json(sqlpage.fetch(:request));
+SET ":qr" = :meta->>'qr';
+SET ":hash" = :meta->>'hash';
+SET ":preview" = :meta->>'preview';
 SELECT 'dynamic' AS component, sqlpage.run_sql(:tool||'/save.sql') AS properties;