"""API Client for ows-assets.""" import json from typing import Any import requests ASSETS_STRING = "assets" V2_ASSET_STRING = "v2/asset" VALIDATOR_STRING = "v2/validators/product" V2_PRODUCT_STRING = "v2/product" class APIClient: """API Client for ows-assets.""" def __init__(self, base_url: str, session: str | None = None) -> None: """Initialize APIClient class.""" self.base_url = base_url self.session = session def upload_token(self, asset_type: str) -> requests.Response: """Execute a GET against upload-token.""" endpoint = "{}/{}/upload-token?asset_type={}".format( self.base_url, ASSETS_STRING, asset_type ) return requests.get(endpoint, headers={"session": self.session}) def post_upload_token(self, asset_type: str) -> requests.Response: """Execute a POST against upload-token.""" endpoint = "{}/{}/upload-token".format(self.base_url, ASSETS_STRING) payload = json.dumps({"asset_type": asset_type}) return requests.post(endpoint, data=payload, headers={"session": self.session}) def get_asset(self, query: dict[str, Any]) -> requests.Response: """Execute a GET against v2/asset.""" endpoint = "{}/{}/{}".format(self.base_url, ASSETS_STRING, V2_ASSET_STRING) return requests.get(endpoint, params=query, headers={"session": self.session}) def get_asset_status(self, filename: str) -> requests.Response: """Execute a GET against v2/asset/status.""" endpoint = "{}/{}/{}/status/{}".format( self.base_url, ASSETS_STRING, V2_ASSET_STRING, filename ) return requests.get(endpoint, headers={"session": self.session}) def get_assets_by_product(self, product_id: int) -> requests.Response: """Execute a GET against v2/asset/product by product_id.""" endpoint = "{}/{}/{}/product/{}".format( self.base_url, ASSETS_STRING, V2_ASSET_STRING, product_id ) return requests.get(endpoint, headers={"session": self.session}) def delete_track_asset(self, tuid: int) -> requests.Response: """Execute a DELETE against v2/track by tuid.""" endpoint = "{}/{}/v2/track/{}".format(self.base_url, ASSETS_STRING, tuid) return requests.delete(endpoint, headers={"session": self.session}) def delete_image_asset(self, product_id: int) -> requests.Response: """Execute a DELETE against v2/image by product_id.""" endpoint = "{}/{}/v2/image/{}".format(self.base_url, ASSETS_STRING, product_id) return requests.delete(endpoint, headers={"session": self.session}) def delete_all_assets(self, product_id: int) -> requests.Response: """Execute a DELETE against v2/product by product_id.""" endpoint = "{}/{}/v2/product/{}".format( self.base_url, ASSETS_STRING, product_id ) return requests.delete(endpoint, headers={"session": self.session}) # TODO: remove once full migration to v2 is done and v1 is not needed anymore def get_stream_url(self, track_id: int) -> requests.Response: """Execute a GET against /stream/track by track_id.""" endpoint = "{}/{}/stream/track/{}/hls".format( self.base_url, ASSETS_STRING, track_id ) return requests.get(endpoint, headers={"session": self.session}) def get_image_location(self, cover_type: str, product_id: int) -> requests.Response: """Execute a GET against /location endpoint by product_id.""" endpoint = "{}/{}/image/product/{}/{}/location".format( self.base_url, ASSETS_STRING, cover_type, product_id ) return requests.get(endpoint, headers={"session": self.session}) def validate_artwork(self, product_id: int) -> requests.Response: """Execute a GET against validator/artwork.""" endpoint = "{}/{}/{}/{}/artwork".format( self.base_url, ASSETS_STRING, VALIDATOR_STRING, product_id ) return requests.get(endpoint, headers={"session": self.session}) def discard_correction(self, product_id: int) -> requests.Response: """Execute a DELETE against v2/product by product_id.""" endpoint = f"{self.base_url}/{ASSETS_STRING}/{V2_PRODUCT_STRING}/{product_id}/corrections" return requests.delete(endpoint, headers={"session": self.session})