aboutsummaryrefslogtreecommitdiff
path: root/jb/api
diff options
context:
space:
mode:
authorGreg Stupp2026-09-24 22:00:58 +0000
committerGreg Stupp2026-09-24 22:00:58 +0000
commita5e1f9d5fe8b1d4e66c240a69eff34a8d0e8dff7 (patch)
tree61d38c3796c1e758a344edec7ce52bcb6ee64f36 /jb/api
parent6249139ee928b954e74ac42df81211f1a8094b53 (diff)
parentbe986ab84f7b12c211f7675071d4deae1bf2bd03 (diff)
downloadamt-jb-a5e1f9d5fe8b1d4e66c240a69eff34a8d0e8dff7.tar.gz
amt-jb-a5e1f9d5fe8b1d4e66c240a69eff34a8d0e8dff7.zip
Merges pull request #5
wallet views
Diffstat (limited to 'jb/api')
-rw-r--r--jb/api/cashout_token.py43
1 files changed, 43 insertions, 0 deletions
diff --git a/jb/api/cashout_token.py b/jb/api/cashout_token.py
new file mode 100644
index 0000000..274383c
--- /dev/null
+++ b/jb/api/cashout_token.py
@@ -0,0 +1,43 @@
+import secrets
+
+from fastapi import HTTPException, status
+from generalresearch.redis_helper import RedisConfig
+
+from jb.api.magic_token import MAGIC_TOKEN_TTL, redis_token_key
+from jb.decorators import get_redis_config
+from jb.models.wallet import PendingCashout
+
+CASHOUT_TOKEN_PREFIX = "wallet:cashout:"
+
+
+def create_cashout_token(
+ cashout: PendingCashout, redis_config: RedisConfig | None = None
+) -> str:
+ """Create a short-lived, single-use token bound to a cashout request."""
+ if redis_config is None:
+ redis_config = get_redis_config()
+
+ token = secrets.token_urlsafe(32)
+ redis_config.create_redis_client().set(
+ redis_token_key(token, CASHOUT_TOKEN_PREFIX),
+ cashout.model_dump_json(),
+ ex=MAGIC_TOKEN_TTL,
+ )
+ return token
+
+
+def consume_cashout_token(
+ token: str, redis_config: RedisConfig | None = None
+) -> PendingCashout:
+ if redis_config is None:
+ redis_config = get_redis_config()
+
+ raw_data = redis_config.create_redis_client().getdel(
+ redis_token_key(token, CASHOUT_TOKEN_PREFIX)
+ )
+ if raw_data is None:
+ raise HTTPException(
+ status_code=status.HTTP_401_UNAUTHORIZED,
+ detail="Invalid or expired cashout confirmation token",
+ )
+ return PendingCashout.model_validate_json(raw_data)