File size: 3,989 Bytes
1e7e130 7875b25 1e7e130 7875b25 1e7e130 7875b25 1e7e130 7875b25 1e7e130 7875b25 1e7e130 7875b25 1e7e130 7875b25 1e7e130 7875b25 33ed18b 1e7e130 33ed18b 1e7e130 7875b25 1e7e130 7875b25 1e7e130 7875b25 1e7e130 768269f 33ed18b 768269f |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 |
import httpx
from typing import Optional, Union, List
from functools import wraps
from .Schema import (
RegisterUserRequest,
LoginRequest,
SetUserStatusRequest,
APIResponse,
)
from App.Portals.PortalRoutes import ANDROID
from App.Portals.Model import Portal
def require_base_url(func):
"""Decorator to set base_url before making a request."""
@wraps(func)
async def wrapper(self, *args, **kwargs):
await self.set_base_url()
return await func(self, *args, **kwargs)
return wrapper
class AndroidClient:
def __init__(self):
self.client = httpx.AsyncClient()
async def set_base_url(self):
"""Fetch the base_url from the database."""
portal = await Portal.get(name=ANDROID)
self.client.base_url = portal.url
@require_base_url
async def register_user(self, request: RegisterUserRequest) -> APIResponse:
"""Register a new user."""
response = await self.client.post("/users/register", json=request.dict())
return APIResponse(**response.json())
@require_base_url
async def login_user(self, request: LoginRequest) -> APIResponse:
"""Login an existing user."""
response = await self.client.post("/login", json=request.dict())
return APIResponse(**response.json())
@require_base_url
async def logout_user(self, phone: str) -> APIResponse:
"""Logout a user by phone."""
response = await self.client.post(f"/logout/{phone}")
return APIResponse(**response.json())
@require_base_url
async def get_active_users(self) -> APIResponse:
"""Retrieve all active users."""
response = await self.client.get("/users/active")
print(response.json())
return APIResponse(**response.json())
@require_base_url
async def disable_user(self, request: SetUserStatusRequest) -> APIResponse:
"""Enable or disable a user."""
path = f"/users/{request.phone}/disable"
response = await self.client.post(path, json=None)
return APIResponse(**response.json())
@require_base_url
async def enable_user(self, request: SetUserStatusRequest) -> APIResponse:
"""Enable or disable a user."""
path = f"/users/{request.phone}/enable"
response = await self.client.post(path, json=None)
return APIResponse(**response.json())
@require_base_url
async def get_users_list(self) -> APIResponse:
"""Retrieve all users (active and inactive)."""
response = await self.client.get("/users")
return APIResponse(**response.json())
@require_base_url
async def get_user_stats(self, phone: Optional[str] = None) -> APIResponse:
"""Retrieve user statistics for a specific user or all users."""
url = f"/user/stats/{phone}" if phone else "/user/stats"
response = await self.client.get(url)
return APIResponse(**response.json())
@require_base_url
async def send_message(
self,
message: str,
phone_numbers: Union[str, List[str]],
event: str = "string",
) -> APIResponse:
"""Send a message to a single phone number or a list of phone numbers."""
# Ensure phone_numbers is a list
if isinstance(phone_numbers, str):
phone_numbers = [phone_numbers]
data = {
"message": message,
"phoneNumbers": phone_numbers,
"event": event,
}
response = await self.client.post("/send_message", json=data)
print(response)
return response
async def close(self):
"""Close the client session."""
await self.client.aclose()
async def activate_user(self, phone_number: str):
request = SetUserStatusRequest(phone=phone_number, disabled=False)
await self.enable_user(request=request)
# Replace this with actual API call logic
return {"status": "success", "message": "User activated."}
|