diff options
Diffstat (limited to 'jb/managers/thl.py')
| -rw-r--r-- | jb/managers/thl.py | 87 |
1 files changed, 87 insertions, 0 deletions
diff --git a/jb/managers/thl.py b/jb/managers/thl.py new file mode 100644 index 0000000..b1dcbde --- /dev/null +++ b/jb/managers/thl.py @@ -0,0 +1,87 @@ +from decimal import Decimal +from typing import Dict, Optional + +import requests +from generalresearchutils.models.thl.payout import UserPayoutEvent +from generalresearchutils.models.thl.task_status import TaskStatusResponse +from generalresearchutils.models.thl.wallet.cashout_method import ( + CashoutRequestResponse, + CashoutRequestInfo, +) + +from jb.config import settings +from jb.models.currency import USDCent +from jb.models.definitions import PayoutStatus + +# TODO: Organize this more with other endpoints (offerwall, cashout requests/approvals, etc). + + +def get_user_profile(amt_worker_id: str) -> Dict: + url = f"{settings.fsb_host}{settings.product_id}/user/{amt_worker_id}/profile/" + res = requests.get(url).json() + if res.get("detail") == "user not found": + raise ValueError("user not found") + return res["user_profile"] + + +def get_user_blocked(amt_worker_id: str) -> bool: + res = get_user_profile(amt_worker_id=amt_worker_id) + return res["user"]["blocked"] + + +def get_user_blocked_or_not_exists(amt_worker_id: str) -> bool: + try: + res = get_user_profile(amt_worker_id=amt_worker_id) + return res["user"]["blocked"] + except ValueError as e: + if e.args[0] == "user not found": + return True + + +def get_task_status(tsid: str) -> Optional[TaskStatusResponse]: + url = f"{settings.fsb_host}{settings.product_id}/status/{tsid}/" + d = requests.get(url).json() + if d.get("msg") == "invalid tsid": + return None + return TaskStatusResponse.model_validate(d) + + +def user_cashout_request( + amt_worker_id: str, amount: USDCent, cashout_method_id +) -> CashoutRequestInfo: + assert cashout_method_id in { + settings.amt_assignment_cashout_method, + settings.amt_bonus_cashout_method, + } + assert isinstance(amount, USDCent) + assert USDCent(0) < amount < USDCent(10_00) + url = f"{settings.fsb_host}{settings.product_id}/cashout/" + body = { + "bpuid": amt_worker_id, + "amount": int(amount), + "cashout_method_id": cashout_method_id, + } + res = requests.post(url, json=body) + d = res.json() + + return CashoutRequestResponse.model_validate(d).cashout + + +def manage_pending_cashout( + cashout_id: str, payout_status: PayoutStatus +) -> UserPayoutEvent: + url = f"{settings.fsb_host}{settings.fsb_host_private_route}/thl/manage_cashout/" + body = { + "payout_id": cashout_id, + "new_status": payout_status.value, + } + res = requests.post(url, json=body) + d = res.json() + + return UserPayoutEvent.model_validate(d) + + +def get_wallet_balance(amt_worker_id: str): + url = f"{settings.fsb_host}{settings.product_id}/wallet/" + params = {"bpuid": amt_worker_id} + return USDCent(requests.get(url, params=params).json()["wallet"]["amount"]) |
