diff options
| author | Greg Stupp | 2026-09-24 22:00:58 +0000 |
|---|---|---|
| committer | Greg Stupp | 2026-09-24 22:00:58 +0000 |
| commit | a5e1f9d5fe8b1d4e66c240a69eff34a8d0e8dff7 (patch) | |
| tree | 61d38c3796c1e758a344edec7ce52bcb6ee64f36 /jb/api | |
| parent | 6249139ee928b954e74ac42df81211f1a8094b53 (diff) | |
| parent | be986ab84f7b12c211f7675071d4deae1bf2bd03 (diff) | |
| download | amt-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.py | 43 |
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) |
