pluto/handler/app.py

141 lines
4.6 KiB
Python
Raw Normal View History

2021-12-28 12:52:19 +00:00
#!/usr/bin/env python3
2021-12-23 16:59:35 +00:00
# Twisted/Klein imports
2021-12-23 14:46:51 +00:00
from twisted.internet import reactor
from klein import Klein
2022-05-02 17:20:14 +00:00
from twisted.internet.protocol import Factory
2021-12-23 16:59:35 +00:00
# Other library imports
from json import dumps
from signal import signal, SIGINT
2022-05-02 15:32:01 +00:00
from sys import argv
2021-12-23 14:46:51 +00:00
2021-12-23 16:59:35 +00:00
# Project imports
2021-12-24 17:27:36 +00:00
from settings import settings
import util
# New style classes
2022-03-04 22:31:07 +00:00
import sinks
2022-03-14 21:19:26 +00:00
import sources
import ux
2022-05-05 17:16:56 +00:00
import lib.antifraud
import lib.transactions
import lib.markets
import lib.money
init_map = None
2022-05-02 17:20:14 +00:00
Factory.noisy = False
2022-03-04 21:05:52 +00:00
# TODO: extend this with more
2022-02-24 22:27:27 +00:00
def cleanup(sig, frame):
2022-05-09 07:23:05 +00:00
to_cleanup = []
if hasattr(init_map["money"], "lc_es_checks"):
to_cleanup.append(init_map["money"].lc_es_checks.stop)
if hasattr(init_map["sources"].agora, "lc_dash"):
to_cleanup.append(init_map["sources"].agora.lc_dash.stop)
if hasattr(init_map["sources"].agora, "lc_cheat"):
to_cleanup.append(init_map["sources"].agora.lc_cheat.stop)
if hasattr(init_map["sources"].lbtc, "lc_dash"):
to_cleanup.append(init_map["sources"].lbtc.lc_dash.stop)
if hasattr(init_map["sources"].lbtc, "lc_cheat"):
to_cleanup.append(init_map["sources"].lbtc.lc_cheat.stop)
if hasattr(init_map["sinks"], "truelayer"):
if hasattr(init_map["sinks"].truelayer, "lc"):
to_cleanup.append(init_map["sinks"].truelayer.lc.stop)
if hasattr(init_map["sinks"].truelayer, "lc_tx"):
to_cleanup.append(init_map["sinks"].truelayer.lc_tx.stop)
if hasattr(init_map["sinks"], "nordigen"):
if hasattr(init_map["sinks"].nordigen, "lc"):
to_cleanup.append(init_map["sinks"].nordigen.lc.stop)
if hasattr(init_map["sinks"].nordigen, "lc_tx"):
to_cleanup.append(init_map["sinks"].nordigen.lc_tx.stop)
if init_map:
2022-05-09 07:23:05 +00:00
for func in to_cleanup:
try:
func()
except: # noqa
print(f"Exception when stopping {func}")
pass # noqa
reactor.stop()
2022-02-24 22:27:27 +00:00
signal(SIGINT, cleanup) # Handle Ctrl-C and run the cleanup routine
2021-12-23 14:46:51 +00:00
class WebApp(util.Base):
2021-12-23 16:59:35 +00:00
"""
Our Klein webapp.
"""
2021-12-23 14:46:51 +00:00
2021-12-23 16:59:35 +00:00
app = Klein()
2021-12-23 14:46:51 +00:00
# @app.route("/callback", methods=["POST"])
# def callback(self, request):
# content = request.content.read()
# try:
# parsed = loads(content)
# except JSONDecodeError:
# self.log.error(f"Failed to parse JSON callback: {content}")
# return dumps(False)
# self.log.info("Callback received: {parsed}", parsed=parsed["data"]["id"])
# # self.tx.transaction(parsed)
# return dumps(True)
2021-12-23 14:46:51 +00:00
2022-03-04 21:05:52 +00:00
# set up another connection to a bank
@app.route("/signin/<string:account>", methods=["GET"])
def signin(self, request, account):
auth_url = self.sinks.truelayer.create_auth_url(account)
return f'Please sign in to {account} <a href="{auth_url}" target="_blank">here.</a>'
2022-03-04 21:05:52 +00:00
# endpoint called after we finish setting up a connection above
@app.route("/callback-truelayer", methods=["POST"])
def signin_callback_truelayer(self, request):
code = request.args[b"code"]
self.sinks.truelayer.handle_authcode_received(code)
return dumps(True)
@app.route("/callback-nordigen", methods=["GET"])
def signin_callback_nordigen(self, request):
# code = request.args[b"code"]
# self.sinks.truelayer.handle_authcode_received(code)
return dumps(True)
2022-04-20 18:07:07 +00:00
@app.route("/callback-verify", methods=["POST"])
def callback_verify(self, request):
# code = request.args[b"code"]
rtrn = self.ux.verify.handle_callback(request)
return dumps(rtrn)
@app.route("/accounts/<string:account>", methods=["GET"])
def balance(self, request, account):
accounts = self.sinks.truelayer.get_accounts(account)
2022-03-04 21:05:52 +00:00
return dumps(accounts, indent=2)
2021-12-23 14:46:51 +00:00
2021-12-23 16:59:35 +00:00
if __name__ == "__main__":
2022-05-02 15:32:01 +00:00
if "--debug" in argv:
util.debug = True
2022-02-07 13:24:09 +00:00
init_map = {
"ux": ux.UX(),
2022-05-05 17:16:56 +00:00
"markets": lib.markets.Markets(),
2022-03-14 21:19:26 +00:00
"sources": sources.Sources(),
2022-03-04 22:31:07 +00:00
"sinks": sinks.Sinks(),
2022-05-05 17:16:56 +00:00
"tx": lib.transactions.Transactions(),
2022-02-07 13:24:09 +00:00
"webapp": WebApp(),
2022-05-05 17:16:56 +00:00
"money": lib.money.Money(),
"antifraud": lib.antifraud.AntiFraud(),
2022-02-07 13:24:09 +00:00
}
# Merge all classes into each other
util.xmerge_attrs(init_map)
# Let the classes know they have been merged
for class_name, class_instance in init_map.items():
if hasattr(class_instance, "__xmerged__"):
class_instance.__xmerged__()
# Set up the loops to put data in ES
2022-05-05 08:18:35 +00:00
# init_map["tx"].setup_loops()
# Run the WebApp
init_map["webapp"].app.run(settings.App.BindHost, 8080)