|
| 1 | +import os |
| 2 | +from abc import ABC, abstractmethod |
| 3 | + |
| 4 | +import requests |
| 5 | +from dotenv import load_dotenv |
| 6 | + |
| 7 | + |
| 8 | +class SFAClientBase(ABC): |
| 9 | + def __init__(self, ds_url: str, ds_stage: str): |
| 10 | + load_dotenv() |
| 11 | + self._trust_env = os.getenv('TRUST_ENV', 'FALSE').upper().strip() == 'TRUE' |
| 12 | + self._base_url = f'{ds_url}/{ds_stage}' |
| 13 | + |
| 14 | + @abstractmethod |
| 15 | + def create_session(self): |
| 16 | + s = requests.session() |
| 17 | + s.trust_env = self._trust_env |
| 18 | + # s.cookies.set('mod_auth_openidc_session', 'xxx-xxx-xxx') |
| 19 | + # s.auth = HTTPBasicAuth('user', 'pass') |
| 20 | + # s.headers.update({"Authorization": f"Bearer {token}"}) |
| 21 | + return s |
| 22 | + |
| 23 | + def _handle_response(self, response): |
| 24 | + """ |
| 25 | + Raises HTTPError with detailed response text if available. |
| 26 | + """ |
| 27 | + try: |
| 28 | + response.raise_for_status() |
| 29 | + except requests.HTTPError as e: |
| 30 | + # Attach response text to the exception for easier debugging |
| 31 | + error_text = response.text.strip() |
| 32 | + raise requests.HTTPError( |
| 33 | + f"{e}\nResponse content: {error_text}" |
| 34 | + ) from None |
| 35 | + try: |
| 36 | + return response.json() |
| 37 | + except: |
| 38 | + raise requests.HTTPError(f'invalid JSON response: {response.text}') |
| 39 | + |
| 40 | + def get_collections(self, **params): |
| 41 | + url = f"{self._base_url}/collections" |
| 42 | + response = self.create_session().get(url, params=params) |
| 43 | + return self._handle_response(response) |
| 44 | + |
| 45 | + def get_collection(self, collection_id, **params) -> dict: # Return a COllection STAC JSON |
| 46 | + url = f"{self._base_url}/collections/{collection_id}" |
| 47 | + response = self.create_session().get(url, params=params) |
| 48 | + return self._handle_response(response) |
| 49 | + |
| 50 | + def create_collection(self, collection): |
| 51 | + url = f"{self._base_url}/collections" |
| 52 | + response = self.create_session().post(url, json=collection) |
| 53 | + # NOTE: result if not found: {"code":"NotFoundError","description":"Collection Invalid-Collection not found"} |
| 54 | + return self._handle_response(response) |
| 55 | + |
| 56 | + def get_items(self, collection_id, **params): |
| 57 | + url = f"{self._base_url}/collections/{collection_id}/items" |
| 58 | + response = self.create_session().get(url, params=params) |
| 59 | + return self._handle_response(response) |
| 60 | + |
| 61 | + def create_item(self, collection_id, item): |
| 62 | + url = f"{self._base_url}/collections/{collection_id}/items" |
| 63 | + my_session = self.create_session() |
| 64 | + my_session.headers.update({'Content-Type': 'application/json'}) |
| 65 | + response = self.create_session().post(url, json=item) |
| 66 | + return self._handle_response(response) |
| 67 | + |
| 68 | + def update_item(self, collection_id, item_id, item, update_whole=True): |
| 69 | + url = f"{self._base_url}/collections/{collection_id}/items/{item_id}" |
| 70 | + my_session = self.create_session() |
| 71 | + my_session.headers.update({'Content-Type': 'application/json'}) |
| 72 | + response = self.create_session().put(url, json=item) if update_whole else self.create_session().patch(url, json=item) |
| 73 | + return self._handle_response(response) |
0 commit comments