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 generalresearchutils.models.thl.user_profile import UserProfile from generalresearchutils.currency import USDCent from jb.config import settings from generalresearchutils.models.thl.definitions import PayoutStatus from typing import Optional import requests # TODO: Organize this more with other endpoints (offerwall, cashout # requests/approvals, etc). def get_user_profile(amt_worker_id: str) -> UserProfile: 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") user_profile = res["user_profile"] # todo: these are computed fields, need a UserProfile parser user_profile.pop("email_md5", None) user_profile.pop("email_sha1", None) user_profile.pop("email_sha256", None) # todo: this contains computed fields inside each streak object user_profile.pop("streaks", None) # todo: this shouldn't be in here anyways ---v user_profile['user'].pop("id", None) return UserProfile.model_validate(user_profile) def get_user_blocked(amt_worker_id: str) -> bool: # Not blocked if None res = get_user_profile(amt_worker_id=amt_worker_id) return res.user.blocked if res.user.blocked is not None else False def get_user_blocked_or_not_exists(amt_worker_id: str) -> Optional[bool]: try: res = get_user_profile(amt_worker_id=amt_worker_id) return res.user.blocked if res.user.blocked is not None else False except ValueError as e: if e.args[0] == "user not found": return True return None 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: str ) -> 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: dict[str, str | int] = { "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) -> USDCent: url = f"{settings.fsb_host}{settings.product_id}/wallet/" params = {"bpuid": amt_worker_id} return USDCent(requests.get(url, params=params).json()["wallet"]["amount"])