diff --git a/sedna_sdk/endpoints/users.py b/sedna_sdk/endpoints/users.py index 8932f34..e100f84 100644 --- a/sedna_sdk/endpoints/users.py +++ b/sedna_sdk/endpoints/users.py @@ -2,5 +2,92 @@ class UsersAPI: def __init__(self, client): self.client = client - def list(self): - return self.client._request("GET", "/user") \ No newline at end of file + def list(self, page_limit=None, page_offset=None, sso_email=None, **kwargs): + """ + List users with optional filtering and pagination. + + Args: + page_limit (int, optional): Number of results per page (defaults to 100) + page_offset (int, optional): Number of results to skip (defaults to 0) + sso_email (str, optional): Filter by SSO email address + **kwargs: Additional filter parameters + + Returns: + List of user dictionaries + """ + params = {} + + # Pagination parameters + if page_limit is not None: + params['page[limit]'] = page_limit + if page_offset is not None: + params['page[offset]'] = page_offset + + # Filter parameters + if sso_email is not None: + params['filter[user.ssoEmail]'] = str(sso_email) + + # Handle any additional filter parameters passed via kwargs + for key, value in kwargs.items(): + if value is not None: + params[key] = str(value) + + return self.client._request("GET", "/user", params=params) + + def subscribe_to_job_reference(self, user_id: str, job_reference_id: str) -> dict: + """ + Subscribe a user to a job reference. + + Args: + user_id: The user's ID + job_reference_id: The job reference ID + + Returns: + Created subscription details + """ + data = { + "data": [ + { + "id": job_reference_id, + "type": "job-reference" + } + ] + } + endpoint = f"/user/{user_id}/relationships/job-reference" + return self.client._request("POST", endpoint, json=data) + + def unsubscribe_from_job_reference(self, user_id: str, job_reference_id: str) -> bool: + """ + Unsubscribe a user from a job reference. + + Args: + user_id: The user's ID + job_reference_id: The job reference ID + + Returns: + True if successful + """ + data = { + "data": [ + { + "id": job_reference_id, + "type": "job-reference" + } + ] + } + endpoint = f"/user/{user_id}/relationships/job-reference" + self.client._request("DELETE", endpoint, json=data) + return True + + def list_job_reference_subscriptions(self, user_id: str) -> list: + """ + List all job reference subscriptions for a user. + + Args: + user_id: The user's ID + + Returns: + List of job reference relationships + """ + endpoint = f"/user/{user_id}/relationships/job-reference" + return self.client._request("GET", endpoint) diff --git a/sedna_sdk/sedna_client.py b/sedna_sdk/sedna_client.py index 1ef75f2..d3500de 100644 --- a/sedna_sdk/sedna_client.py +++ b/sedna_sdk/sedna_client.py @@ -14,7 +14,10 @@ def __init__(self, status_code, message): class SednaClient: def __init__(self, subdomain, client_id, client_secret): - self.base_url = f"https://{subdomain}.sednanetwork.com/platform/2019-01-01" + if subdomain.startswith('http://') or subdomain.startswith('https://'): + self.base_url = subdomain.rstrip('/') + else: + self.base_url = f"https://{subdomain}.sednanetwork.com/platform/2019-01-01" credentials = f"{client_id}:{client_secret}" encoded = base64.b64encode(credentials.encode()).decode() self.headers = { @@ -29,6 +32,9 @@ def __init__(self, subdomain, client_id, client_secret): self.comments = CommentsAPI(self) self.job_references = JobReferencesAPI(self) + def set_base_url(self, base_url): + self.base_url = base_url.rstrip('/') + def _request(self, method, endpoint, **kwargs): url = f"{self.base_url}{endpoint}" response = requests.request(method, url, headers=self.headers, **kwargs) @@ -37,4 +43,4 @@ def _request(self, method, endpoint, **kwargs): if response.content: return response.json() - return None \ No newline at end of file + return None