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."}