diff --git a/src/auto_archiver/databases/__init__.py b/src/auto_archiver/databases/__init__.py index 1e676ea..538cd72 100644 --- a/src/auto_archiver/databases/__init__.py +++ b/src/auto_archiver/databases/__init__.py @@ -1,4 +1,5 @@ from .database import Database from .gsheet_db import GsheetsDb from .console_db import ConsoleDb -from .csv_db import CSVDb \ No newline at end of file +from .csv_db import CSVDb +from .api_db import AAApiDb \ No newline at end of file diff --git a/src/auto_archiver/databases/api_db.py b/src/auto_archiver/databases/api_db.py new file mode 100644 index 0000000..a1f256d --- /dev/null +++ b/src/auto_archiver/databases/api_db.py @@ -0,0 +1,41 @@ +import requests, os +from loguru import logger + +from . import Database +from ..core import Metadata + + +class AAApiDb(Database): + """ + Connects to auto-archiver-api instance + """ + name = "auto_archiver_api_db" + + def __init__(self, config: dict) -> None: + # without this STEP.__init__ is not called + super().__init__(config) + self.assert_valid_string("api_endpoint") + self.assert_valid_string("api_secret") + + @staticmethod + def configs() -> dict: + return { + "api_endpoint": {"default": None, "help": "API endpoint where calls are made to"}, + "api_secret": {"default": None, "help": "API authentication secret"}, + "public": {"default": False, "help": "whether the URL should be publicly available via the API"}, + "author_id": {"default": None, "help": "which email to assign as author"}, + "group_id": {"default": None, "help": "which group of users have access to the archive in case public=false as author"}, + "tags": {"default": [], "help": "what tags to add to the archived URL", "cli_set": lambda cli_val, cur_val: set(cli_val.split(","))}, + } + + def done(self, item: Metadata) -> None: + """archival result ready - should be saved to DB""" + logger.info(f"saving archive of {item.get_url()} to the AA API.") + + payload = {'result': item.to_json(), 'public': self.public, 'author_id': self.author_id, 'group_id': self.group_id, 'tags': list(self.tags)} + response = requests.post(os.path.join(self.api_endpoint, "submit-archive"), json=payload, auth=("abc", self.api_secret)) + + if response.status_code == 200: + logger.success(f"AA API: {response.json()}") + else: + logger.error(f"AA API FAIL ({response.status_code}): {response.json()}")