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.
@@ -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