1
0
mirror of synced 2026-01-01 18:02:53 -05:00
Files
airbyte/airbyte-integrations/connectors/source-drift/source_drift/client/api.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

155 lines
5.0 KiB
Python

#
# Copyright (c) 2023 Airbyte, Inc., all rights reserved.
#
import json
from enum import IntEnum
from functools import partial
from typing import Iterator, List
import requests
from .common import _parsed_response, cursor_paginator, next_url_paginator
class APIClient:
USER_AGENT = "Airbyte contact@airbyte.io"
BASE_URL = "https://driftapi.com"
def __init__(self, access_token: str):
self._token = access_token
self._headers = {
"Authorization": f"Bearer {self._token}",
"User-Agent": self.USER_AGENT,
"Content-Type": "application/json",
"Accept": "application/json",
}
self.accounts = Account(client=self)
self.contacts = Contact(client=self)
self.conversations = Conversation(client=self)
self.messages = Message(client=self)
self.users = User(client=self)
@_parsed_response
def post(self, url, data, **kwargs):
return requests.post(self.full_url(url), data=json.dumps(data), headers=self._headers, **kwargs)
@_parsed_response
def patch(self, url, data, **kwargs):
"""Used in fixtures.py only"""
return requests.patch(self.full_url(url), data=json.dumps(data), headers=self._headers, **kwargs)
@_parsed_response
def get(self, url, **kwargs):
return requests.get(self.full_url(url), headers=self._headers, **kwargs)
def full_url(self, url):
return f"{self.BASE_URL}/{url}"
def check_token(self, token: str):
return self.post("app/token_info", data={"accessToken": token})
class User:
def __init__(self, client: APIClient):
self.client = client
def get(self, pk) -> dict:
return self.client.get(f"users/{pk}")["data"]
def list(self) -> Iterator[dict]:
"""Doesn't support pagination and return all users at once"""
yield from self.client.get("users/list")["data"]
def update(self, pk, **attributes) -> dict:
params = {"userId": pk}
return self.client.patch("users/update", data=attributes, params=params)
class Conversation:
pagination = partial(cursor_paginator, per_page=50)
class Status(IntEnum):
OPEN = 1
CLOSED = 2
PENDING = 3
def __init__(self, client: APIClient):
self.client = client
def get(self, pk: int) -> dict:
return self.client.get(f"conversations/{pk}")
def list(self, statuses: List[Status] = None) -> Iterator[dict]:
"""Conversations returned will be ordered by their updatedAt time with the most recently updated at the top of the list."""
statuses = list(map(int, statuses or []))
params = {"statusId": statuses}
request = partial(self.client.get, url="conversations/list")
return self.pagination(request, params=params)
def create(self, **attributes) -> dict:
return self.client.post("conversations/new", data=attributes)
def update(self, pk: int, **attributes) -> dict:
params = {"userId": pk}
return self.client.patch("conversations/update", data=attributes, params=params)
class Message:
pagination = partial(cursor_paginator, per_page=50)
def __init__(self, client: APIClient):
self.client = client
def list(self, conversation_id: int) -> Iterator[dict]:
"""You have to provide conversation ID to get list of messages"""
request = partial(self.client.get, url=f"conversations/{conversation_id}/messages")
for data in self.pagination(request):
yield from data.get("messages", [])
def create(self, conversation_id: int, **attributes) -> dict:
return self.client.post(f"conversations/{conversation_id}/messages", data=attributes).get("data")
class Account:
pagination = partial(next_url_paginator, per_page=100)
def __init__(self, client: APIClient):
self.client = client
def get(self, pk: int) -> dict:
return self.client.get(f"accounts/{pk}")
def list(self) -> Iterator[dict]:
request = partial(self.client.get, url="accounts")
for data in self.pagination(request):
yield from data.get("accounts", [])
def create(self, **attributes) -> dict:
return self.client.post("accounts/create", data=attributes).get("data")
def update(self, pk: int, **attributes) -> dict:
params = {"userId": pk}
return self.client.patch("accounts/update", data=attributes, params=params)
class Contact:
def __init__(self, client: APIClient):
self.client = client
def get(self, pk: int) -> dict:
return self.client.get(f"contacts/{pk}")["data"]
def list(self, email: str) -> Iterator[dict]:
"""List contacts only possible with exact email filter"""
yield from self.client.get("contacts", params={"email": email})["data"]
def create(self, **attributes) -> dict:
return self.client.post("contacts", data=attributes).get("data")
def update(self, pk: int, **attributes) -> dict:
params = {"userId": pk}
return self.client.patch("contacts/update", data=attributes, params=params)