glow-sdk 0.1.0__tar.gz
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.
- glow_sdk-0.1.0/PKG-INFO +12 -0
- glow_sdk-0.1.0/pyproject.toml +24 -0
- glow_sdk-0.1.0/src/glow_sdk/models.py +24 -0
- glow_sdk-0.1.0/src/glow_sdk/sdk.py +136 -0
glow_sdk-0.1.0/PKG-INFO
ADDED
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
Metadata-Version: 2.1
|
|
2
|
+
Name: glow-sdk
|
|
3
|
+
Version: 0.1.0
|
|
4
|
+
Summary:
|
|
5
|
+
Author: Gustav Ebbers
|
|
6
|
+
Author-email: gueb01@gmail.com
|
|
7
|
+
Requires-Python: >=3.13,<4.0
|
|
8
|
+
Classifier: Programming Language :: Python :: 3
|
|
9
|
+
Classifier: Programming Language :: Python :: 3.13
|
|
10
|
+
Requires-Dist: loguru (>=0.7.3,<0.8.0)
|
|
11
|
+
Requires-Dist: pydantic (>=2.10.4,<3.0.0)
|
|
12
|
+
Requires-Dist: requests (>=2.32.3,<3.0.0)
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
[tool.poetry]
|
|
2
|
+
name = "glow-sdk"
|
|
3
|
+
version = "0.1.0"
|
|
4
|
+
description = ""
|
|
5
|
+
authors = ["Gustav Ebbers <gueb01@gmail.com>"]
|
|
6
|
+
#readme = "README.md"
|
|
7
|
+
|
|
8
|
+
[tool.poetry.dependencies]
|
|
9
|
+
python = "^3.13"
|
|
10
|
+
loguru = "^0.7.3"
|
|
11
|
+
requests = "^2.32.3"
|
|
12
|
+
pydantic = "^2.10.4"
|
|
13
|
+
|
|
14
|
+
[tool.poetry.dev-dependencies]
|
|
15
|
+
black = "^24.10.0"
|
|
16
|
+
responses = "^0.25.3"
|
|
17
|
+
pytest = "^8.3.4"
|
|
18
|
+
|
|
19
|
+
[build-system]
|
|
20
|
+
requires = ["poetry-core"]
|
|
21
|
+
build-backend = "poetry.core.masonry.api"
|
|
22
|
+
|
|
23
|
+
[tool.black]
|
|
24
|
+
line-length = 119
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
# Copyright Gustav Ebbers
|
|
2
|
+
import datetime
|
|
3
|
+
|
|
4
|
+
from pydantic import BaseModel
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
class Member(BaseModel):
|
|
8
|
+
id: int
|
|
9
|
+
user_id: int
|
|
10
|
+
platform_id: int
|
|
11
|
+
email: str
|
|
12
|
+
first_name: str | None
|
|
13
|
+
last_name: str | None
|
|
14
|
+
point_balance: int
|
|
15
|
+
lifetime_points: int
|
|
16
|
+
birthday: str | None
|
|
17
|
+
created_at: datetime.datetime
|
|
18
|
+
updated_at: datetime.datetime
|
|
19
|
+
referral_code: str | None
|
|
20
|
+
referred_by: str | None
|
|
21
|
+
multiplier: str
|
|
22
|
+
vip_tier_id: int
|
|
23
|
+
current_vip_tier_id: None
|
|
24
|
+
current_vip_tier_name: None
|
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
# Copyright Gustav Ebbers
|
|
2
|
+
from enum import Enum
|
|
3
|
+
|
|
4
|
+
import requests
|
|
5
|
+
from loguru import logger
|
|
6
|
+
|
|
7
|
+
from src.glow_sdk.models import Member
|
|
8
|
+
|
|
9
|
+
HTTP_TIMEOUT_SECONDS = 10
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
class GlowSDK:
|
|
13
|
+
def __init__(self, api_url: str, api_key: str, api_secret: str) -> None:
|
|
14
|
+
self.api_url = api_url
|
|
15
|
+
self.api_key = api_key
|
|
16
|
+
self.api_secret = api_secret
|
|
17
|
+
|
|
18
|
+
class MemberSortOrder(str, Enum):
|
|
19
|
+
DESC = "desc"
|
|
20
|
+
ASC = "asc"
|
|
21
|
+
|
|
22
|
+
def list_members(self, ordering: str = MemberSortOrder.DESC, search: str = None) -> [Member]:
|
|
23
|
+
|
|
24
|
+
params = {"ordering": ordering, "page": 1}
|
|
25
|
+
|
|
26
|
+
if search is not None:
|
|
27
|
+
params["search"] = search
|
|
28
|
+
|
|
29
|
+
members = []
|
|
30
|
+
|
|
31
|
+
while True:
|
|
32
|
+
try:
|
|
33
|
+
r = requests.get(
|
|
34
|
+
self.api_url + "members",
|
|
35
|
+
headers={
|
|
36
|
+
"api-key": self.api_key,
|
|
37
|
+
"api_secret": self.api_secret,
|
|
38
|
+
},
|
|
39
|
+
params=params,
|
|
40
|
+
timeout=HTTP_TIMEOUT_SECONDS,
|
|
41
|
+
)
|
|
42
|
+
r.raise_for_status()
|
|
43
|
+
except requests.exceptions.ConnectionError as err:
|
|
44
|
+
raise ValueError("Connection error, check `GlowSDK.api_url` is set correctly") from err
|
|
45
|
+
except requests.exceptions.HTTPError as err:
|
|
46
|
+
if err.response.status_code == 403:
|
|
47
|
+
raise ValueError(
|
|
48
|
+
"Authentication error, check `GlowSDK.api_key` and `GlowSDK.api_secret` are set correctly"
|
|
49
|
+
) from err
|
|
50
|
+
else:
|
|
51
|
+
raise
|
|
52
|
+
|
|
53
|
+
members += [Member(**member) for member in r.json()["data"]]
|
|
54
|
+
|
|
55
|
+
logger.debug(
|
|
56
|
+
f"Retrieved {len(r.json()['data'])} members of {r.json()['total']} from Glow API on page {r.json()['current_page']}/{r.json()['last_page']}"
|
|
57
|
+
)
|
|
58
|
+
|
|
59
|
+
if r.json()["next_page_url"] is None:
|
|
60
|
+
break
|
|
61
|
+
|
|
62
|
+
params["page"] = params["page"] + 1
|
|
63
|
+
|
|
64
|
+
return members
|
|
65
|
+
|
|
66
|
+
def get_member(
|
|
67
|
+
self,
|
|
68
|
+
member_id: int | None = None,
|
|
69
|
+
email: str | None = None,
|
|
70
|
+
platform_id: int | None = None,
|
|
71
|
+
) -> Member:
|
|
72
|
+
|
|
73
|
+
if not (member_id or email or platform_id):
|
|
74
|
+
raise ValueError("`member_id` or `email` or `platform_id` is required")
|
|
75
|
+
|
|
76
|
+
params = {}
|
|
77
|
+
if member_id:
|
|
78
|
+
params["id"] = member_id
|
|
79
|
+
elif email:
|
|
80
|
+
params["email"] = email
|
|
81
|
+
elif platform_id:
|
|
82
|
+
params["platform_id"] = platform_id
|
|
83
|
+
|
|
84
|
+
try:
|
|
85
|
+
r = requests.get(
|
|
86
|
+
self.api_url + "member",
|
|
87
|
+
headers={
|
|
88
|
+
"api-key": self.api_key,
|
|
89
|
+
"api_secret": self.api_secret,
|
|
90
|
+
},
|
|
91
|
+
params=params,
|
|
92
|
+
timeout=HTTP_TIMEOUT_SECONDS,
|
|
93
|
+
)
|
|
94
|
+
r.raise_for_status()
|
|
95
|
+
except requests.exceptions.ConnectionError as err:
|
|
96
|
+
raise ValueError("Connection error, check `GlowSDK.api_url` is set correctly") from err
|
|
97
|
+
except requests.exceptions.HTTPError as err:
|
|
98
|
+
if err.response.status_code == 403:
|
|
99
|
+
raise ValueError(
|
|
100
|
+
"Authentication error, check `GlowSDK.api_key` and `GlowSDK.api_secret` are set correctly"
|
|
101
|
+
) from err
|
|
102
|
+
else:
|
|
103
|
+
raise
|
|
104
|
+
|
|
105
|
+
return Member(**r.json())
|
|
106
|
+
|
|
107
|
+
def delete_member(self, member: Member | None = None, member_id: int | None = None):
|
|
108
|
+
if not (member_id or member):
|
|
109
|
+
raise ValueError("`member` or `member_id` is required")
|
|
110
|
+
|
|
111
|
+
params = {}
|
|
112
|
+
if member:
|
|
113
|
+
params["id"] = member.id
|
|
114
|
+
elif member_id:
|
|
115
|
+
params["id"] = member_id
|
|
116
|
+
|
|
117
|
+
try:
|
|
118
|
+
r = requests.post(
|
|
119
|
+
self.api_url + "delete-member",
|
|
120
|
+
headers={
|
|
121
|
+
"api-key": self.api_key,
|
|
122
|
+
"api_secret": self.api_secret,
|
|
123
|
+
},
|
|
124
|
+
params=params,
|
|
125
|
+
timeout=HTTP_TIMEOUT_SECONDS,
|
|
126
|
+
)
|
|
127
|
+
r.raise_for_status()
|
|
128
|
+
except requests.exceptions.ConnectionError as err:
|
|
129
|
+
raise ValueError("Connection error, check `GlowSDK.api_url` is set correctly") from err
|
|
130
|
+
except requests.exceptions.HTTPError as err:
|
|
131
|
+
if err.response.status_code == 403:
|
|
132
|
+
raise ValueError(
|
|
133
|
+
"Authentication error, check `GlowSDK.api_key` and `GlowSDK.api_secret` are set correctly"
|
|
134
|
+
) from err
|
|
135
|
+
else:
|
|
136
|
+
raise
|