gengineapi 0.1.0__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,196 @@
1
+ """
2
+ Базовый класс для всех модулей API G-Engine.
3
+
4
+ Содержит общие методы и функциональность, используемые всеми модулями.
5
+ """
6
+ import logging
7
+ from abc import ABC
8
+ from typing import Any, Dict, List, Optional, Union
9
+
10
+ from ..http import AsyncHttpClient
11
+
12
+
13
+ class BaseApiModule(ABC):
14
+ """
15
+ Базовый класс для всех модулей API.
16
+
17
+ Attributes:
18
+ http_client: HTTP-клиент для выполнения запросов
19
+ logger: Логгер для записи информации
20
+ """
21
+
22
+ def __init__(
23
+ self,
24
+ http_client: AsyncHttpClient,
25
+ logger: Optional[logging.Logger] = None,
26
+ ) -> None:
27
+ """
28
+ Инициализация базового класса модуля API.
29
+
30
+ Args:
31
+ http_client: HTTP-клиент для выполнения запросов
32
+ logger: Логгер для записи информации (опционально)
33
+ """
34
+ self.http_client = http_client
35
+ self.logger = logger or logging.getLogger(f"{__name__}.{self.__class__.__name__}")
36
+
37
+ async def _get(
38
+ self,
39
+ endpoint: str,
40
+ params: Optional[Dict[str, Any]] = None,
41
+ **kwargs,
42
+ ) -> Any:
43
+ """
44
+ Выполняет GET-запрос.
45
+
46
+ Args:
47
+ endpoint: Конечная точка API
48
+ params: Параметры запроса (опционально)
49
+ **kwargs: Дополнительные параметры для HTTP-клиента
50
+
51
+ Returns:
52
+ Any: Данные из ответа API
53
+ """
54
+ return await self.http_client.get(endpoint, params=params, **kwargs)
55
+
56
+ async def _post(
57
+ self,
58
+ endpoint: str,
59
+ data: Optional[Dict[str, Any]] = None,
60
+ params: Optional[Dict[str, Any]] = None,
61
+ **kwargs,
62
+ ) -> Any:
63
+ """
64
+ Выполняет POST-запрос.
65
+
66
+ Args:
67
+ endpoint: Конечная точка API
68
+ data: Данные для отправки (опционально)
69
+ params: Параметры запроса (опционально)
70
+ **kwargs: Дополнительные параметры для HTTP-клиента
71
+
72
+ Returns:
73
+ Any: Данные из ответа API
74
+ """
75
+ return await self.http_client.post(endpoint, json_data=data, params=params, **kwargs)
76
+
77
+ async def _put(
78
+ self,
79
+ endpoint: str,
80
+ data: Optional[Dict[str, Any]] = None,
81
+ params: Optional[Dict[str, Any]] = None,
82
+ **kwargs,
83
+ ) -> Any:
84
+ """
85
+ Выполняет PUT-запрос.
86
+
87
+ Args:
88
+ endpoint: Конечная точка API
89
+ data: Данные для отправки (опционально)
90
+ params: Параметры запроса (опционально)
91
+ **kwargs: Дополнительные параметры для HTTP-клиента
92
+
93
+ Returns:
94
+ Any: Данные из ответа API
95
+ """
96
+ return await self.http_client.put(endpoint, json_data=data, params=params, **kwargs)
97
+
98
+ async def _delete(
99
+ self,
100
+ endpoint: str,
101
+ params: Optional[Dict[str, Any]] = None,
102
+ data: Optional[Dict[str, Any]] = None,
103
+ **kwargs,
104
+ ) -> Any:
105
+ """
106
+ Выполняет DELETE-запрос.
107
+
108
+ Args:
109
+ endpoint: Конечная точка API
110
+ params: Параметры запроса (опционально)
111
+ data: Данные для отправки (опционально)
112
+ **kwargs: Дополнительные параметры для HTTP-клиента
113
+
114
+ Returns:
115
+ Any: Данные из ответа API
116
+ """
117
+ return await self.http_client.delete(endpoint, params=params, json_data=data, **kwargs)
118
+
119
+ async def _patch(
120
+ self,
121
+ endpoint: str,
122
+ data: Optional[Dict[str, Any]] = None,
123
+ params: Optional[Dict[str, Any]] = None,
124
+ **kwargs,
125
+ ) -> Any:
126
+ """
127
+ Выполняет PATCH-запрос.
128
+
129
+ Args:
130
+ endpoint: Конечная точка API
131
+ data: Данные для отправки (опционально)
132
+ params: Параметры запроса (опционально)
133
+ **kwargs: Дополнительные параметры для HTTP-клиента
134
+
135
+ Returns:
136
+ Any: Данные из ответа API
137
+ """
138
+ return await self.http_client.patch(endpoint, json_data=data, params=params, **kwargs)
139
+
140
+ @staticmethod
141
+ def extract_data(response: Dict[str, Any]) -> Any:
142
+ """
143
+ Извлекает данные из стандартного формата ответа API.
144
+
145
+ Обрабатывает общую структуру ответа G-Engine API:
146
+ {
147
+ "success": true,
148
+ "message": "...",
149
+ "data": { ... }
150
+ }
151
+
152
+ Args:
153
+ response: Ответ от API
154
+
155
+ Returns:
156
+ Any: Извлеченные данные или исходный ответ, если не удалось извлечь
157
+ """
158
+ if isinstance(response, dict):
159
+ # Для стандартного формата ответа G-Engine API
160
+ if "success" in response and "data" in response:
161
+ return response["data"]
162
+ return response
163
+
164
+ @staticmethod
165
+ def remove_none_values(data: Dict[str, Any]) -> Dict[str, Any]:
166
+ """
167
+ Удаляет значения None из словаря.
168
+
169
+ Args:
170
+ data: Исходный словарь
171
+
172
+ Returns:
173
+ Dict[str, Any]: Словарь без значений None
174
+ """
175
+ return {k: v for k, v in data.items() if v is not None}
176
+
177
+ @staticmethod
178
+ def format_date_param(date_value: Any) -> Optional[str]:
179
+ """
180
+ Форматирует параметр даты для API.
181
+
182
+ Args:
183
+ date_value: Значение даты (может быть строкой, объектом datetime или date)
184
+
185
+ Returns:
186
+ Optional[str]: Форматированная дата или None, если значение не было предоставлено
187
+ """
188
+ if date_value is None:
189
+ return None
190
+
191
+ if hasattr(date_value, "strftime"):
192
+ # Если это datetime или date объект
193
+ return date_value.strftime("%Y-%m-%d")
194
+
195
+ # Предполагаем, что это уже строка
196
+ return str(date_value)
@@ -0,0 +1,54 @@
1
+ """
2
+ Модуль для работы с курсами валют в API G-Engine.
3
+
4
+ Предоставляет методы для получения актуальных курсов валют.
5
+ """
6
+ from typing import Any, Dict, Literal, Optional, Union
7
+
8
+ from .base import BaseApiModule
9
+
10
+
11
+ # Типы для параметров API
12
+ RateSource = Literal["cb_rf", "steam"]
13
+ CurrencyPair = Literal["USD:RUB", "EUR:RUB"]
14
+
15
+
16
+ class CurrenciesModule(BaseApiModule):
17
+ """
18
+ Модуль для работы с курсами валют.
19
+
20
+ Предоставляет методы для получения актуальных курсов валют.
21
+ """
22
+
23
+ async def get_rate(
24
+ self,
25
+ source: RateSource,
26
+ pair: CurrencyPair,
27
+ ) -> Dict[str, Any]:
28
+ """
29
+ Получает актуальный курс валют.
30
+
31
+ Args:
32
+ source: Источник курса валют ("cb_rf" или "steam")
33
+ pair: Валютная пара ("USD:RUB" или "EUR:RUB")
34
+
35
+ Returns:
36
+ Dict[str, Any]: Информация о курсе валют
37
+
38
+ Examples:
39
+ >>> async with Client(...) as client:
40
+ >>> rate = await client.currencies.get_rate(
41
+ >>> source="cb_rf",
42
+ >>> pair="USD:RUB"
43
+ >>> )
44
+ >>> print(f"Курс USD:RUB по ЦБ РФ: {rate['currency_rate']}")
45
+ """
46
+ params = {
47
+ "source": source,
48
+ "pair": pair,
49
+ }
50
+
51
+ self.logger.info(f"Получение курса валют: источник {source}, пара {pair}")
52
+ response = await self._get("currencies", params=params)
53
+
54
+ return self.extract_data(response)
@@ -0,0 +1,81 @@
1
+ """
2
+ Модуль для работы с финансами в API G-Engine.
3
+
4
+ Предоставляет методы для получения данных о финансах по кошелькам пользователей.
5
+ """
6
+ from datetime import date
7
+ from typing import Any, Dict, List, Optional, Union
8
+
9
+ from .base import BaseApiModule
10
+
11
+
12
+ class FinancesModule(BaseApiModule):
13
+ """
14
+ Модуль для работы с финансами.
15
+
16
+ Предоставляет методы для получения финансовой информации по кошелькам пользователей.
17
+ """
18
+
19
+ async def get_finances(
20
+ self,
21
+ user_cache: bool = True,
22
+ funds_type: Optional[str] = None,
23
+ limit: int = 100,
24
+ offset: int = 0,
25
+ sort_by: str = "date",
26
+ sort_order: str = "desc",
27
+ start_date: Optional[Union[str, date]] = None,
28
+ end_date: Optional[Union[str, date]] = None,
29
+ search_field: Optional[str] = None,
30
+ search_value: Optional[str] = None,
31
+ ) -> List[Dict[str, Any]]:
32
+ """
33
+ Получает данные о финансах по кошелькам пользователей.
34
+
35
+ Args:
36
+ user_cache: Использовать кэш пользователя
37
+ funds_type: Тип средств ("balance" или "cashback")
38
+ limit: Ограничение на количество результатов (макс. 500)
39
+ offset: Смещение для пагинации
40
+ sort_by: Поле для сортировки
41
+ sort_order: Порядок сортировки ("asc" или "desc")
42
+ start_date: Начальная дата для фильтрации
43
+ end_date: Конечная дата для фильтрации
44
+ search_field: Поле для поиска
45
+ search_value: Значение для поиска
46
+
47
+ Returns:
48
+ List[Dict[str, Any]]: Список финансовых данных
49
+
50
+ Examples:
51
+ >>> async with Client(...) as client:
52
+ >>> finances = await client.finances.get_finances(
53
+ >>> funds_type="balance",
54
+ >>> limit=50,
55
+ >>> sort_by="amount",
56
+ >>> sort_order="desc"
57
+ >>> )
58
+ >>> print(f"Получено {len(finances)} финансовых записей")
59
+ """
60
+ params = self.remove_none_values({
61
+ "user_cache": user_cache,
62
+ "funds_type": funds_type,
63
+ "limit": limit,
64
+ "offset": offset,
65
+ "sort_by": sort_by,
66
+ "sort_order": sort_order,
67
+ "start_date": self.format_date_param(start_date),
68
+ "end_date": self.format_date_param(end_date),
69
+ "search_field": search_field,
70
+ "search_value": search_value,
71
+ })
72
+
73
+ self.logger.info(f"Получение финансовых данных с параметрами: {params}")
74
+ response = await self._get("finances", params=params)
75
+
76
+ # В этом API ожидаем список данных в поле "data"
77
+ data = self.extract_data(response)
78
+ if data is None:
79
+ return []
80
+
81
+ return data
@@ -0,0 +1,115 @@
1
+ """
2
+ Модуль для работы с платежами в API G-Engine.
3
+
4
+ Поддерживает создание и верификацию платежей, выполнение платежей и получение статуса платежей.
5
+ """
6
+ from decimal import Decimal
7
+ from typing import Any, Dict, Optional, Union
8
+
9
+ from .base import BaseApiModule
10
+
11
+
12
+ class PaymentsModule(BaseApiModule):
13
+ """
14
+ Модуль для работы с платежами.
15
+
16
+ Предоставляет методы для создания, верификации и выполнения платежей,
17
+ а также для получения статуса платежей.
18
+ """
19
+
20
+ async def verify(
21
+ self,
22
+ transaction_id: str,
23
+ service_id: int,
24
+ account: str,
25
+ amount: Union[Decimal, float, str],
26
+ currency: str,
27
+ ) -> Dict[str, Any]:
28
+ """
29
+ Создает и верифицирует платеж.
30
+
31
+ Args:
32
+ transaction_id: Идентификатор транзакции (UUID)
33
+ service_id: Идентификатор сервиса
34
+ account: Аккаунт для пополнения
35
+ amount: Сумма транзакции
36
+ currency: Код валюты (3 символа)
37
+
38
+ Returns:
39
+ Dict[str, Any]: Информация о созданном платеже
40
+
41
+ Examples:
42
+ >>> async with Client(...) as client:
43
+ >>> payment = await client.payments.verify(
44
+ >>> transaction_id="b3f1c8d2-4e9a-42f5-bb8d-8e3b6c6c6a7f",
45
+ >>> service_id=1,
46
+ >>> account="user@example.com",
47
+ >>> amount=10.99,
48
+ >>> currency="USD"
49
+ >>> )
50
+ >>> print(f"Создан платеж: {payment['transaction_id']}")
51
+ """
52
+ # Преобразуем amount в строку, если это не строка
53
+ if not isinstance(amount, str):
54
+ amount = str(amount)
55
+
56
+ data = {
57
+ "transaction_id": transaction_id,
58
+ "service_id": service_id,
59
+ "account": account,
60
+ "amount": amount,
61
+ "currency": currency,
62
+ }
63
+
64
+ self.logger.info(f"Создание платежа: {transaction_id}, сервис: {service_id}, сумма: {amount} {currency}")
65
+ response = await self._post("payment/verify", data=data)
66
+
67
+ return self.extract_data(response)
68
+
69
+ async def execute(self, transaction_id: str) -> Dict[str, Any]:
70
+ """
71
+ Выполняет платеж на основе идентификатора транзакции.
72
+
73
+ Args:
74
+ transaction_id: Идентификатор транзакции (UUID)
75
+
76
+ Returns:
77
+ Dict[str, Any]: Результат выполнения платежа
78
+
79
+ Examples:
80
+ >>> async with Client(...) as client:
81
+ >>> result = await client.payments.execute(
82
+ >>> transaction_id="b3f1c8d2-4e9a-42f5-bb8d-8e3b6c6c6a7f"
83
+ >>> )
84
+ >>> print(f"Статус платежа: {result['status_code']}")
85
+ """
86
+ data = {"transaction_id": transaction_id}
87
+
88
+ self.logger.info(f"Выполнение платежа для транзакции: {transaction_id}")
89
+ response = await self._post("payment/execute", data=data)
90
+
91
+ return self.extract_data(response)
92
+
93
+ async def get_status(self, transaction_id: str) -> Dict[str, Any]:
94
+ """
95
+ Получает статус платежа.
96
+
97
+ Args:
98
+ transaction_id: Идентификатор транзакции (UUID)
99
+
100
+ Returns:
101
+ Dict[str, Any]: Статус платежа
102
+
103
+ Examples:
104
+ >>> async with Client(...) as client:
105
+ >>> status = await client.payments.get_status(
106
+ >>> transaction_id="b3f1c8d2-4e9a-42f5-bb8d-8e3b6c6c6a7f"
107
+ >>> )
108
+ >>> print(f"Текущий статус платежа: {status['status_code']}")
109
+ """
110
+ params = {"transaction_id": transaction_id}
111
+
112
+ self.logger.info(f"Получение статуса платежа для транзакции: {transaction_id}")
113
+ response = await self._get("payment/status", params=params)
114
+
115
+ return self.extract_data(response)
@@ -0,0 +1,70 @@
1
+ """
2
+ Модуль для работы с транзакциями в API G-Engine.
3
+
4
+ Предоставляет методы для получения списка транзакций с различными фильтрами.
5
+ """
6
+ from datetime import date
7
+ from typing import Any, Dict, List, Optional, Union
8
+
9
+ from .base import BaseApiModule
10
+
11
+
12
+ class TransactionsModule(BaseApiModule):
13
+ """
14
+ Модуль для работы с транзакциями.
15
+
16
+ Предоставляет методы для получения списка транзакций с различными фильтрами.
17
+ """
18
+
19
+ async def get_transactions(
20
+ self,
21
+ user_cache: bool = True,
22
+ limit: int = 100,
23
+ offset: int = 0,
24
+ sort_by: str = "date",
25
+ sort_order: str = "desc",
26
+ start_date: Optional[Union[str, date]] = None,
27
+ end_date: Optional[Union[str, date]] = None,
28
+ search_field: Optional[str] = None,
29
+ search_value: Optional[str] = None,
30
+ ) -> List[Dict[str, Any]]:
31
+ """
32
+ Получает список транзакций.
33
+
34
+ Args:
35
+ user_cache: Использовать кэш пользователя
36
+ limit: Ограничение на количество результатов (макс. 500)
37
+ offset: Смещение для пагинации
38
+ sort_by: Поле для сортировки
39
+ sort_order: Порядок сортировки ("asc" или "desc")
40
+ start_date: Начальная дата для фильтрации
41
+ end_date: Конечная дата для фильтрации
42
+ search_field: Поле для поиска
43
+ search_value: Значение для поиска
44
+
45
+ Returns:
46
+ List[Dict[str, Any]]: Список транзакций
47
+
48
+ Examples:
49
+ >>> async with Client(...) as client:
50
+ >>> transactions = await client.transactions.get_transactions(
51
+ >>> limit=50,
52
+ >>> start_date="2023-01-01",
53
+ >>> end_date="2023-12-31"
54
+ >>> )
55
+ >>> print(f"Получено {len(transactions)} транзакций")
56
+ """
57
+ params = self.remove_none_values({
58
+ "user_cache": user_cache,
59
+ "limit": limit,
60
+ "offset": offset,
61
+ "sort_by": sort_by,
62
+ "sort_order": sort_order,
63
+ "start_date": self.format_date_param(start_date),
64
+ "end_date": self.format_date_param(end_date),
65
+ "search_field": search_field,
66
+ "search_value": search_value,
67
+ })
68
+
69
+ self.logger.info(f"Получение списка транзакций с параметрами: {params}")
70
+ return await self._get("transaction/view", params=params)
@@ -0,0 +1,100 @@
1
+ """
2
+ Модуль для работы с пользователями в API G-Engine.
3
+
4
+ Предоставляет методы для получения информации о пользователях, их балансах и текущем пользователе.
5
+ """
6
+ from datetime import date
7
+ from typing import Any, Dict, List, Optional, Union
8
+
9
+ from .base import BaseApiModule
10
+
11
+
12
+ class UsersModule(BaseApiModule):
13
+ """
14
+ Модуль для работы с пользователями.
15
+
16
+ Предоставляет методы для получения информации о пользователях,
17
+ их балансах и текущем пользователе.
18
+ """
19
+
20
+ async def get_users(
21
+ self,
22
+ limit: int = 100,
23
+ offset: int = 0,
24
+ sort_by: Optional[str] = None,
25
+ sort_order: Optional[str] = None,
26
+ start_date: Optional[Union[str, date]] = None,
27
+ end_date: Optional[Union[str, date]] = None,
28
+ search_field: Optional[str] = None,
29
+ search_value: Optional[str] = None,
30
+ role_name: Optional[str] = None,
31
+ ) -> List[Dict[str, Any]]:
32
+ """
33
+ Получает список пользователей (только для Observer).
34
+
35
+ Args:
36
+ limit: Ограничение на количество результатов (макс. 500)
37
+ offset: Смещение для пагинации
38
+ sort_by: Поле для сортировки
39
+ sort_order: Порядок сортировки ("asc" или "desc")
40
+ start_date: Начальная дата для фильтрации
41
+ end_date: Конечная дата для фильтрации
42
+ search_field: Поле для поиска
43
+ search_value: Значение для поиска
44
+ role_name: Название роли для фильтрации
45
+
46
+ Returns:
47
+ List[Dict[str, Any]]: Список пользователей
48
+
49
+ Examples:
50
+ >>> async with Client(...) as client:
51
+ >>> users = await client.users.get_users(
52
+ >>> limit=50,
53
+ >>> role_name="User"
54
+ >>> )
55
+ >>> print(f"Получено {len(users)} пользователей")
56
+ """
57
+ params = self.remove_none_values({
58
+ "limit": limit,
59
+ "offset": offset,
60
+ "sort_by": sort_by,
61
+ "sort_order": sort_order,
62
+ "start_date": self.format_date_param(start_date),
63
+ "end_date": self.format_date_param(end_date),
64
+ "search_field": search_field,
65
+ "search_value": search_value,
66
+ "role_name": role_name,
67
+ })
68
+
69
+ self.logger.info(f"Получение списка пользователей с параметрами: {params}")
70
+ return await self._get("user", params=params)
71
+
72
+ async def get_balance(self) -> Dict[str, Any]:
73
+ """
74
+ Получает баланс текущего пользователя.
75
+
76
+ Returns:
77
+ Dict[str, Any]: Информация о балансе пользователя
78
+
79
+ Examples:
80
+ >>> async with Client(...) as client:
81
+ >>> balance = await client.users.get_balance()
82
+ >>> print(f"Баланс: {balance['balance']} {balance['currency']}")
83
+ """
84
+ self.logger.info("Получение баланса текущего пользователя")
85
+ return await self._get("user/balance")
86
+
87
+ async def get_me(self) -> Dict[str, Any]:
88
+ """
89
+ Получает данные текущего пользователя.
90
+
91
+ Returns:
92
+ Dict[str, Any]: Информация о текущем пользователе
93
+
94
+ Examples:
95
+ >>> async with Client(...) as client:
96
+ >>> user = await client.users.get_me()
97
+ >>> print(f"Текущий пользователь: {user['login']}")
98
+ """
99
+ self.logger.info("Получение данных текущего пользователя")
100
+ return await self._get("user/me")