1
0
mirror of synced 2026-01-01 09:02:59 -05:00
Files
airbyte/airbyte-integrations/connectors/source-qualaroo/source_qualaroo/source.py
Cole Snodgrass 2e099acc52 update headers from 2022 -> 2023 (#22594)
* It's 2023!

* 2022 -> 2023

---------

Co-authored-by: evantahler <evan@airbyte.io>
2023-02-08 13:01:16 -08:00

82 lines
2.7 KiB
Python

#
# Copyright (c) 2023 Airbyte, Inc., all rights reserved.
#
from base64 import b64encode
from typing import Any, List, Mapping, Tuple
import pendulum
import requests
from airbyte_cdk.sources import AbstractSource
from airbyte_cdk.sources.streams import Stream
from airbyte_cdk.sources.streams.http.auth import HttpAuthenticator
from .streams import QualarooStream, Responses, Surveys
class QualarooAuthenticator(HttpAuthenticator):
"""
Generate auth header for start making requests from API token and API key.
"""
def __init__(
self,
key: str,
token: str,
auth_header: str = "Authorization",
key_header: str = "oauth_consumer_key",
token_header: str = "oauth_token",
):
self._key = key
self._token = b64encode(b":".join((key.encode("latin1"), token.encode("latin1")))).strip().decode("ascii")
self.auth_header = auth_header
self.key_header = key_header
self.token_header = token_header
def get_auth_header(self) -> Mapping[str, Any]:
return {self.auth_header: f"Basic {self._token}"}
class SourceQualaroo(AbstractSource):
"""
Source Qualaroo fetch date from web-based, Kanban-style, list-making application.
"""
@staticmethod
def _get_authenticator(config: dict) -> QualarooAuthenticator:
key, token = config["key"], config["token"]
return QualarooAuthenticator(token=token, key=key)
def check_connection(self, logger, config) -> Tuple[bool, any]:
"""
Testing connection availability for the connector by granting the credentials.
"""
try:
url = f"{QualarooStream.url_base}nudges"
authenticator = self._get_authenticator(config)
response = requests.get(url, headers=authenticator.get_auth_header())
response.raise_for_status()
available_surveys = {row.get("id") for row in response.json()}
for survey_id in config.get("survey_ids", []):
if survey_id not in available_surveys:
return False, f"survey_id {survey_id} not found"
return True, None
except requests.exceptions.RequestException as e:
return False, e
def streams(self, config: Mapping[str, Any]) -> List[Stream]:
"""
:param config: A Mapping of the user input configuration as defined in the connector spec.
"""
args = {}
# convert start_date to epoch time for qualaroo API
args["start_date"] = pendulum.parse(config["start_date"]).strftime("%s")
args["survey_ids"] = config.get("survey_ids", [])
args["authenticator"] = self._get_authenticator(config)
return [Surveys(**args), Responses(**args)]