aboutsummaryrefslogtreecommitdiff
path: root/jb/managers/thl.py
diff options
context:
space:
mode:
authorMax Nanis2026-02-21 02:39:34 -0500
committerMax Nanis2026-02-21 02:39:34 -0500
commit25d8c3c214baf10f6520cc1351f78473150e5d7a (patch)
treeac05d02b76275066c5495c14d2d9764b7e3316ac /jb/managers/thl.py
parent67ab724561e4ceb8fe8fb4031de277168f7d9724 (diff)
downloadamt-jb-25d8c3c214baf10f6520cc1351f78473150e5d7a.tar.gz
amt-jb-25d8c3c214baf10f6520cc1351f78473150e5d7a.zip
Cashout Methods (Assignment, Bonus) into Settings.
Diffstat (limited to 'jb/managers/thl.py')
-rw-r--r--jb/managers/thl.py87
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"])