aboutsummaryrefslogtreecommitdiff
path: root/jb/views
diff options
context:
space:
mode:
authorstuppie2026-09-23 15:07:47 -0600
committerstuppie2026-09-23 15:07:47 -0600
commit785adc51b2cc2b4d3e845a454f38b2a5197cc7f0 (patch)
treef7866bfb76e359f8078de4437f0f06e313847805 /jb/views
parent064a55c754e02da54b13c47028b233b265327518 (diff)
downloadamt-jb-785adc51b2cc2b4d3e845a454f38b2a5197cc7f0.tar.gz
amt-jb-785adc51b2cc2b4d3e845a454f38b2a5197cc7f0.zip
working on cashout postback, to be hit by thl upon cashout status change, which will send the user an email with the info
Diffstat (limited to 'jb/views')
-rw-r--r--jb/views/wallet.py67
1 files changed, 63 insertions, 4 deletions
diff --git a/jb/views/wallet.py b/jb/views/wallet.py
index 9fda533..681cc21 100644
--- a/jb/views/wallet.py
+++ b/jb/views/wallet.py
@@ -1,17 +1,35 @@
+from datetime import timedelta
from typing import Annotated
from urllib.parse import urlencode
-from fastapi import APIRouter, Depends
+from fastapi import APIRouter, Depends, HTTPException, status
from fastapi.responses import HTMLResponse
+from generalresearch.models.thl.definitions import PayoutStatus
from generalresearch.models.thl.wallet.cashout_method import CashoutRequestInfo
+from generalresearch.redis_helper import RedisConfig
from jb.api.auth import get_authenticated_user
from jb.api.cashout_token import consume_cashout_token, create_cashout_token
from jb.config import settings
-from jb.managers.email_manager import send_cashout_confirmation_email
-from jb.managers.thl import get_cashout_method, user_cashout_request
+from jb.decorators import get_redis_config
+from jb.dependencies import get_gr_api_manager
+from jb.managers.email_manager import (
+ send_cashout_confirmation_email,
+ send_cashout_status_email,
+)
+from jb.managers.gr_api import GRApiManager
+from jb.managers.thl import (
+ get_cashout_detail,
+ get_cashout_method,
+ user_cashout_request,
+)
from jb.models.auth import User
-from jb.models.wallet import CashoutConfirmation, CashoutRequest, PendingCashout
+from jb.models.wallet import (
+ CashoutConfirmation,
+ CashoutPostback,
+ CashoutRequest,
+ PendingCashout,
+)
from jb.settings import render_base_html
wallet_router = APIRouter(prefix="/wallet", tags=["Wallet"])
@@ -71,3 +89,44 @@ def confirm_cashout(
amount=cashout.amount,
cashout_method_id=cashout.cashout_method_id,
)
+
+
+@wallet_router.post("/cashout/postback/", status_code=status.HTTP_204_NO_CONTENT)
+def cashout_postback(
+ body: CashoutPostback,
+ gr_api: Annotated[GRApiManager, Depends(get_gr_api_manager)],
+ redis_config: Annotated[RedisConfig, Depends(get_redis_config)],
+) -> None:
+ # Treat the posted ID only as a lookup key; THL supplies the trusted details.
+ try:
+ cashout = get_cashout_detail(body.cashout_id)
+ except Exception as e:
+ raise HTTPException(
+ status_code=status.HTTP_400_BAD_REQUEST,
+ detail=f"Cashout not found: {e}",
+ )
+ if cashout.product_id != settings.product_id:
+ raise HTTPException(
+ status_code=status.HTTP_400_BAD_REQUEST,
+ detail="Cashout not found",
+ )
+ if cashout.status != PayoutStatus.COMPLETE:
+ raise HTTPException(
+ status_code=status.HTTP_422_UNPROCESSABLE_CONTENT,
+ detail="Cashout is not complete",
+ )
+ # In case THL retries, send at most one email for each
+ dedupe_key = f"wallet:cashout-email-sent:{cashout.id}:{cashout.status.value}"
+ redis_client = redis_config.create_redis_client()
+ claimed = redis_client.set(dedupe_key, "sending", nx=True, ex=timedelta(minutes=5))
+ if not claimed:
+ return
+
+ try:
+ user = gr_api.get_user(product_user_id=cashout.product_user_id)
+ send_cashout_status_email(email=str(user.email), cashout=cashout)
+ redis_client.set(dedupe_key, "sent", ex=timedelta(minutes=30))
+ except Exception:
+ # Allow a later retry when user lookup or email delivery fails.
+ redis_client.delete(dedupe_key)
+ raise