Switch from Flask to Klein

This commit is contained in:
Mark Veidemanis 2021-12-23 14:46:51 +00:00
parent 78a3419013
commit ffd035dfbf
Signed by: m
GPG Key ID: 5ACFCEED46C0904F
3 changed files with 96 additions and 69 deletions

View File

@ -1,20 +0,0 @@
from flask import Flask
from flask_sqlalchemy import SQLAlchemy
# init SQLAlchemy so we can use it later in our models
db = SQLAlchemy()
def create_app():
app = Flask(__name__)
app.config["SECRET_KEY"] = "4c7c2f455ffa53edf78d2b2e9c3f24f6f9340975"
app.config["SQLALCHEMY_DATABASE_URI"] = "sqlite:///db.sqlite"
db.init_app(app)
from .main import main as main_blueprint
app.register_blueprint(main_blueprint)
return app

96
handler/app.py Normal file
View File

@ -0,0 +1,96 @@
from twisted.logger import Logger
from twisted.internet import reactor
from twisted.internet.task import LoopingCall, deferLater
from klein import Klein
from json import dumps, loads
from json.decoder import JSONDecodeError
import pprint
import requests
from settings import refresh_token, client_id, jwt
token_refresh_sec = 30
api_base = "https://sandbox-b2b.revolut.com/api/1.0"
webhook_url = "https://callback-sandbox.pathogen.is/callback"
# SYSTEM VARIABLES BELOW #
app = Klein()
access_token = ""
log = Logger()
pp = pprint.PrettyPrinter(indent=2)
def get_new_token():
headers = {"Content-Type": "application/x-www-form-urlencoded"}
data = {
"grant_type": "refresh_token",
"refresh_token": refresh_token,
"client_id": client_id,
"client_assertion_type": "urn:ietf:params:oauth:client-assertion-type:jwt-bearer",
"client_assertion": jwt,
}
r = requests.post(f"{api_base}/auth/token", data=data, headers=headers)
parsed = r.json()
if r.status_code == 200:
if "access_token" in parsed.keys():
access_token = parsed["access_token"]
if len(access_token) == len(refresh_token):
log.info("Refreshed access token")
return True
else:
log.error(f"Token refresh didn't contain access token: {parsed}", parsed=parsed)
return False
else:
log.error(f"Cannot refresh token: {parsed}", parsed=parsed)
return False
def transaction(sender, source_currency, dest_currency, source_amount, dest_amount):
pass
def setup_webhook():
log.info("Setting up webhook")
headers = {"Authorization": f"Bearer {access_token}"}
data = {
"url": webhook_url
}
r = requests.post (f"{api_base}/webhook", data=data, headers=headers)
parsed = r.json()
if r.status_code == 200:
log.info("Set up webhook")
return dumps({"success": True})
else:
log.info("Failed setting up webhook")
@app.route("/refresh", methods=["GET"])
def refresh(request):
rtrn = get_new_token()
return dumps({"success": rtrn})
@app.route("/callback", methods=["POST"])
def callback(request):
content = request.content.read()
try:
parsed = loads(content)
except JSONDecodeError:
log.error("Failed to parse JSON callback: {content}", content=content)
return dumps({"success": False})
log.info("Callback received: {parsed}", parsed=parsed)
return dumps({"success": True})
# Set up loop to refresh token, but get one first
deferLater(reactor, 1, get_new_token)
deferLater(reactor, 2, setup_webhook)
lc = LoopingCall(get_new_token)
lc.start(token_refresh_sec)
resource = app.resource
app.run("127.0.0.1", 8080)

View File

@ -1,49 +0,0 @@
from flask import Blueprint, request, jsonify
import pprint
import requests
from .settings import *
# SYSTEM VARIABLES BELOW #
access_token = ""
main = Blueprint("main", __name__)
pp = pprint.PrettyPrinter(indent=2)
def get_new_token():
headers = {"Content-Type": "application/x-www-form-urlencoded"}
data = {
"grant_type": "refresh_token",
"refresh_token": refresh_token,
"client_id": client_id,
"client_assertion_type": "urn:ietf:params:oauth:client-assertion-type:jwt-bearer",
"client_assertion": jwt,
}
r = requests.post(f"{api_base}/auth/token", data=data, headers=headers)
parsed = r.json()
if r.status_code == 200:
if "access_token" in parsed.keys():
access_token = parsed["access_token"]
if len(access_token) == len(refresh_token):
return True
else:
main.logger.error(f"Token refresh didn't contain access token: {parsed}")
return False
else:
main.logger.error(f"Cannot refresh token: {parsed}")
return False
@main.route("/refresh", methods=["GET"])
def refresh():
rtrn = get_new_token()
return jsonify(success=rtrn)
@main.route("/callback", methods=["POST"])
def callback():
pp.pprint(request.json)
if request.json is None:
return jsonify(success=False)
return jsonify(success=True)