openrelik-api-client 0.2.1__tar.gz → 0.2.2__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.
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: openrelik-api-client
3
- Version: 0.2.1
3
+ Version: 0.2.2
4
4
  Summary: API client that automatically handles token refresh
5
5
  Author: Johan Berggren
6
6
  Author-email: jberggren@gmail.com
@@ -12,6 +12,7 @@
12
12
  # See the License for the specific language governing permissions and
13
13
  # limitations under the License.
14
14
 
15
+ import tempfile
15
16
  from requests_toolbelt import MultipartEncoder
16
17
  from requests.exceptions import RequestException
17
18
  import requests
@@ -42,34 +43,58 @@ class APIClient:
42
43
  api_server_url,
43
44
  api_key=None,
44
45
  api_version="v1",
46
+ session=None
45
47
  ):
46
48
  self.base_url = f"{api_server_url}/api/{api_version}"
47
- self.session = TokenRefreshSession(api_server_url, api_key)
49
+ if session:
50
+ self.session = session
51
+ else:
52
+ self.session = TokenRefreshSession(api_server_url, api_key)
48
53
 
49
54
  def get(self, endpoint, **kwargs):
50
55
  """Sends a GET request to the specified API endpoint."""
51
56
  url = f"{self.base_url}{endpoint}"
52
- return self.session.get(url, **kwargs)
57
+ return self.session.request("GET", url, **kwargs)
53
58
 
54
59
  def post(self, endpoint, data=None, json=None, **kwargs):
55
60
  """Sends a POST request to the specified API endpoint."""
56
61
  url = f"{self.base_url}{endpoint}"
57
- return self.session.post(url, data=data, json=json, **kwargs)
62
+ return self.session.request("POST", url, data=data, json=json, **kwargs)
58
63
 
59
64
  def put(self, endpoint, data=None, **kwargs):
60
65
  """Sends a PUT request to the specified API endpoint."""
61
66
  url = f"{self.base_url}{endpoint}"
62
- return self.session.put(url, data=data, **kwargs)
67
+ return self.session.request("PUT", url, data=data, **kwargs)
63
68
 
64
69
  def patch(self, endpoint, data=None, json=None, **kwargs):
65
70
  """Sends a PATCH request to the specified API endpoint."""
66
71
  url = f"{self.base_url}{endpoint}"
67
- return self.session.patch(url, data=data, json=json, **kwargs)
72
+ return self.session.request("PATCH", url, data=data, json=json, **kwargs)
68
73
 
69
74
  def delete(self, endpoint, **kwargs):
70
75
  """Sends a DELETE request to the specified API endpoint."""
71
76
  url = f"{self.base_url}{endpoint}"
72
- return self.session.delete(url, **kwargs)
77
+ return self.session.request("DELETE", url, **kwargs)
78
+
79
+ def download_file(self, file_id: int, filename: str) -> str | None:
80
+ """Downloads a file from OpenRelik.
81
+
82
+ Args:
83
+ file_id: The ID of the file to download.
84
+ filename: The name of the file to download.
85
+
86
+ Returns:
87
+ str: The path to the downloaded file.
88
+ """
89
+ endpoint = f"{self.base_url}/files/{file_id}/download"
90
+ response = self.get(endpoint)
91
+ filename_prefix, extension = os.path.splitext(filename)
92
+ file = tempfile.NamedTemporaryFile(
93
+ mode="wb", prefix=f"{filename_prefix}", suffix=extension, delete=False
94
+ )
95
+ file.write(response.content)
96
+ file.close()
97
+ return file.name
73
98
 
74
99
  def upload_file(
75
100
  self, file_path: str, folder_id: int) -> int | None:
@@ -98,7 +123,7 @@ class APIClient:
98
123
  raise FileNotFoundError(f"File {file_path} not found.")
99
124
 
100
125
  if folder_id:
101
- response = self.session.get(f"{self.base_url}/folders/{folder_id}")
126
+ response = self.get(f"{self.base_url}/folders/{folder_id}")
102
127
  if response.status_code == 404:
103
128
  return file_id
104
129
 
@@ -119,7 +144,7 @@ class APIClient:
119
144
  "application/octet-stream")}
120
145
  )
121
146
  headers = {"Content-Type": encoder.content_type}
122
- response = self.session.post(
147
+ response = self.post(
123
148
  f"{self.base_url}{endpoint}",
124
149
  headers=headers,
125
150
  data=encoder.to_string(),
@@ -12,6 +12,8 @@
12
12
  # See the License for the specific language governing permissions and
13
13
  # limitations under the License.
14
14
 
15
+ from typing import Any
16
+
15
17
  from openrelik_api_client.api_client import APIClient
16
18
 
17
19
 
@@ -36,7 +38,7 @@ class FoldersAPI:
36
38
  folder_id = None
37
39
  endpoint = f"{self.api_client.base_url}/folders/"
38
40
  params = {"display_name": display_name}
39
- response = self.api_client.session.post(endpoint, json=params)
41
+ response = self.api_client.post(endpoint, json=params)
40
42
  response.raise_for_status()
41
43
  if response.status_code == 201:
42
44
  folder_id = response.json().get('id')
@@ -59,7 +61,7 @@ class FoldersAPI:
59
61
  folder_id = None
60
62
  endpoint = f"{self.api_client.base_url}/folders/{folder_id}/folders"
61
63
  data = {"display_name": display_name}
62
- response = self.api_client.session.post(endpoint, json=data)
64
+ response = self.api_client.post(endpoint, json=data)
63
65
  response.raise_for_status()
64
66
  if response.status_code == 201:
65
67
  folder_id = response.json().get("id")
@@ -78,6 +80,29 @@ class FoldersAPI:
78
80
  HTTPError: If the API request failed.
79
81
  """
80
82
  endpoint = f"{self.api_client.base_url}/folders/{folder_id}"
81
- response = self.api_client.session.get(endpoint)
83
+ response = self.api_client.get(endpoint)
82
84
  response.raise_for_status()
83
85
  return response.status_code == 200
86
+
87
+ def update_folder(
88
+ self, folder_id: int, folder_data: dict[str, Any]
89
+ ):
90
+ """Updates an existing folder.
91
+
92
+ Args:
93
+ folder_id: The ID of the folder to update.
94
+ folder_data: The updated folder data.
95
+
96
+ Returns:
97
+ The updated folder data, or None.
98
+
99
+ Raises:
100
+ HTTPError: If the API request failed.
101
+ """
102
+ endpoint = f"{self.api_client.base_url}/folders/{folder_id}"
103
+ response = self.api_client.patch(
104
+ endpoint,
105
+ json=folder_data
106
+ )
107
+ response.raise_for_status()
108
+ return response.json()
@@ -42,7 +42,7 @@ class WorkflowsAPI:
42
42
  endpoint = f"{self.folders_url}/{folder_id}/workflows/"
43
43
  data = {"folder_id": folder_id,
44
44
  "file_ids": file_ids, "template_id": template_id}
45
- response = self.api_client.session.post(endpoint, json=data)
45
+ response = self.api_client.post(endpoint, json=data)
46
46
  response.raise_for_status()
47
47
  if response.status_code == 200:
48
48
  workflow_id = response.json().get("id")
@@ -62,7 +62,7 @@ class WorkflowsAPI:
62
62
  HTTPError: If the API request failed.
63
63
  """
64
64
  endpoint = f"{self.folders_url}/{folder_id}/workflows/{workflow_id}"
65
- response = self.api_client.session.get(endpoint)
65
+ response = self.api_client.get(endpoint)
66
66
  response.raise_for_status()
67
67
  if response.status_code == 200:
68
68
  return response.json()
@@ -83,7 +83,7 @@ class WorkflowsAPI:
83
83
  """
84
84
  workflow = None
85
85
  endpoint = f"{self.folders_url}/{folder_id}/workflows/{workflow_id}"
86
- response = self.api_client.session.patch(endpoint, json=workflow_data)
86
+ response = self.api_client.patch(endpoint, json=workflow_data)
87
87
  response.raise_for_status()
88
88
  if response.status_code == 200:
89
89
  workflow = response.json()
@@ -103,7 +103,7 @@ class WorkflowsAPI:
103
103
  HTTPError: If the API request failed.
104
104
  """
105
105
  endpoint = f"{self.folders_url}/{folder_id}/workflows/{workflow_id}"
106
- response = self.api_client.session.delete(endpoint)
106
+ response = self.api_client.delete(endpoint)
107
107
  response.raise_for_status()
108
108
  return response.status_code == 204
109
109
 
@@ -127,7 +127,7 @@ class WorkflowsAPI:
127
127
  workflow = self.get_workflow(folder_id, workflow_id)
128
128
  spec = json.loads(workflow.get('spec_json'))
129
129
  data = {'workflow_spec': spec}
130
- response = self.api_client.session.post(endpoint, json=data)
130
+ response = self.api_client.post(endpoint, json=data)
131
131
  response.raise_for_status()
132
132
  if response.status_code == 200:
133
133
  workflow = response.json()
@@ -1,6 +1,6 @@
1
1
  [tool.poetry]
2
2
  name = "openrelik-api-client"
3
- version = "0.2.1"
3
+ version = "0.2.2"
4
4
  description = "API client that automatically handles token refresh"
5
5
  authors = ["Johan Berggren <jberggren@gmail.com>"]
6
6
  readme = "README.md"
@@ -1,11 +0,0 @@
1
- from folders import FoldersAPI
2
-
3
-
4
- def main():
5
- c = FoldersAPI("http://172.19.0.6:8710", api_key="eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJmZThmMjkyYWViZDM0MjA3YjkyODYxOGQ5MmRmZThkMSIsImlhdCI6MTczNDQ0NzcyOSwibmJmIjoxNzM0NDQ3NzI5LCJleHAiOjE3MzUwNTI1MjksImlzcyI6Imh0dHA6Ly9sb2NhbGhvc3Q6ODcxMCIsImF1ZCI6ImFwaS1jbGllbnQiLCJqdGkiOiI2ZWZhNzBiYWU0ZDE0MjJlOGM4ODY5OGY1NDhmOTBjYiIsInRva2VuX3R5cGUiOiJyZWZyZXNoIn0.MJA48D570agD49oE4HXfTWCQRpyh5JCy7YCIsHN5YJs")
6
- # r = c.create_root_folder("myfolder")
7
- # r = c.create_subfolder(33, 'myfolder_sub')
8
- print(c.folder_exists(1))
9
-
10
-
11
- main()