feast: Add transaction history api route
All checks were successful
Build Docker / BuildImage (push) Successful in 31s

This commit is contained in:
Nathan Woodburn 2024-06-03 16:12:46 +10:00
parent 5354abca42
commit 7b2a25592e
Signed by: nathanwoodburn
GPG Key ID: 203B000478AD0EF1
2 changed files with 44 additions and 4 deletions

41
hsd.py
View File

@ -1,4 +1,5 @@
from functools import cache import functools
import time
import requests import requests
import dotenv import dotenv
import os import os
@ -41,6 +42,27 @@ if not os.path.exists(wallet_file):
with open(wallet_file, 'w') as f: with open(wallet_file, 'w') as f:
json.dump([], f, indent=4) json.dump([], f, indent=4)
def cache_with_ttl(max_age, maxsize=128, typed=False):
"""Least-recently-used cache decorator with time-based cache invalidation.
Args:
max_age: Time to live for cached results (in seconds).
maxsize: Maximum cache size (see `functools.lru_cache`).
typed: Cache on distinct input types (see `functools.lru_cache`).
"""
def _decorator(fn):
@functools.lru_cache(maxsize=maxsize, typed=typed)
def _new(*args, __time_salt, **kwargs):
return fn(*args, **kwargs)
@functools.wraps(fn)
def _wrapped(*args, **kwargs):
return _new(*args, **kwargs, __time_salt=int(time.time() / max_age))
return _wrapped
return _decorator
def url(walletURL:bool) -> str: def url(walletURL:bool) -> str:
if walletURL: if walletURL:
@ -159,7 +181,7 @@ def import_wallet(name:str,userID:str,xpub:str) -> dict:
} }
@cache @cache_with_ttl(60*60)
def get_wallet_UUID(userID:str, name:str) -> str|None: def get_wallet_UUID(userID:str, name:str) -> str|None:
accounts = get_accounts() accounts = get_accounts()
@ -217,7 +239,7 @@ def get_balance(userID:str, name:str) -> dict:
return return_json return return_json
@cache @cache_with_ttl(60*1)
def get_domains(userID:str, name:str) -> dict: def get_domains(userID:str, name:str) -> dict:
walletID = get_wallet_UUID(userID, name) walletID = get_wallet_UUID(userID, name)
if not walletID: if not walletID:
@ -327,11 +349,22 @@ def send_to_address(userID:str, name:str, address:str, amount:str) -> dict:
return response.json() return response.json()
@cache_with_ttl(60*1)
def get_transactions(userID:str, name:str) -> dict:
walletID = get_wallet_UUID(userID, name)
if not walletID:
return {
'error': 'Wallet not found'
}
request = requests.get(url(True)+'wallet/'+walletID+'/tx/history').json()
return request
# region Auctions # region Auctions
@cache @cache_with_ttl(60*1)
def get_auctions(userID:str, name:str) -> dict: def get_auctions(userID:str, name:str) -> dict:
walletID = get_wallet_UUID(userID, name) walletID = get_wallet_UUID(userID, name)
if not walletID: if not walletID:

View File

@ -75,6 +75,13 @@ def get_domains():
domain_json = hsd.get_domains(userID, name) domain_json = hsd.get_domains(userID, name)
return jsonify(domain_json) return jsonify(domain_json)
@app.route('/wallet/transactions', methods=['GET'])
def get_transactions():
userID = request.args.get('uuid')
name = request.args.get('name')
transaction_json = hsd.get_transactions(userID, name)
return jsonify(transaction_json)
@app.route('/wallet/send', methods=['POST']) @app.route('/wallet/send', methods=['POST'])
def send(): def send():
userID = request.args.get('uuid') userID = request.args.get('uuid')