server/sbin/hypothesis_proxy.py
author ymh <ymh.work@gmail.com>
Mon, 04 Apr 2022 17:02:10 +0200
changeset 26 eb14941af2e7
parent 0 5f4fcbc80b37
permissions -rw-r--r--
Added tag 0.2.2 for changeset 7f7cdcd01dea

'''
Proxy server for getting hyperthesis annotation
'''
import os

import bottle
import requests
from bottle import route, response

app = application = bottle.Bottle()

config_file_path = os.getenv('CONFIG_PATH', "hypothesis_proxy.conf")

app.config.load_config(config_file_path)

# From https://stackoverflow.com/a/17262900
class EnableCors(object):
    name = 'enable_cors'
    api = 2

    def apply(self, fn, context):
        def _enable_cors(*args, **kwargs):
            # set CORS headers
            response.headers['Access-Control-Allow-Origin'] = '*'
            response.headers['Access-Control-Allow-Methods'] = 'GET, POST, PUT, OPTIONS'
            response.headers['Access-Control-Allow-Headers'] = 'Origin, Accept, Content-Type, X-Requested-With, X-CSRF-Token'

            if bottle.request.method != 'OPTIONS':
                # actual request; reply with the actual response
                return fn(*args, **kwargs)

        return _enable_cors

app.install(EnableCors())

@app.route('/annotations')
def query_hypothesis():
    '''
    query hypothesis
    '''

    annotations_json = app.config.get('proxy.annotations_json', None)

    if annotations_json and os.path.isfile(annotations_json):
        import json
        with open(annotations_json, 'r') as f:
            return json.load(f)

    url = app.config.get('proxy.url', 'https://h.projet-episteme.org/api/search')
    headers = {}
    token = app.config.get('proxy.token')
    if token is not None:
        headers["Authorization"] = "Bearer " + token

    params = {}
    for config_tag in ['group', 'user', 'tag', 'limit']:
        config_val = app.config.get('proxy.%s' % config_tag)
        if config_val is not None:
            params[config_tag] = config_val

    offset = 0
    total = -1

    rows = []

    while total < 0 or offset < total:
        #TODO: handle errors
        res = requests.get(url, params=params, headers=headers)
        res_json = res.json()
        total = int(res_json['total'])
        rows += res_json['rows']
        offset = len(rows)
        params['offset'] = offset

    return {
        'rows': rows,
        'total': len(rows)
    }


if __name__ == "__main__":
    app.run(
        host=app.config.get('proxy.host', '127.0.0.1'),
        port=int(app.config.get('proxy.port', 8888))
    )