1
0
mirror of synced 2025-12-30 21:02:43 -05:00
Files
airbyte/airbyte-integrations/connectors/source-microsoft-dataverse/source_microsoft_dataverse/dataverse.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

81 lines
2.5 KiB
Python

#
# Copyright (c) 2023 Airbyte, Inc., all rights reserved.
#
from enum import Enum
from typing import Any, Mapping, MutableMapping, Optional
import requests
from airbyte_cdk.sources.streams.http.requests_native_auth.oauth import Oauth2Authenticator
class MicrosoftOauth2Authenticator(Oauth2Authenticator):
def build_refresh_request_body(self) -> Mapping[str, Any]:
"""
Returns the request body to set on the refresh request
"""
payload: MutableMapping[str, Any] = {
"grant_type": "client_credentials",
"client_id": self.get_client_id(),
"client_secret": self.get_client_secret(),
"scope": self.get_scopes(),
}
return payload
class AirbyteType(Enum):
String = {"type": ["null", "string"]}
Boolean = {"type": ["null", "boolean"]}
Timestamp = {"type": ["null", "string"], "format": "date-time", "airbyte_type": "timestamp_with_timezone"}
Integer = {"type": ["null", "integer"]}
Number = {"type": ["null", "number"]}
class DataverseType(Enum):
String = AirbyteType.String
Uniqueidentifier = AirbyteType.String
DateTime = AirbyteType.Timestamp
Integer = AirbyteType.Integer
BigInt = AirbyteType.Integer
Money = AirbyteType.Number
Boolean = AirbyteType.Boolean
Double = AirbyteType.Number
Decimal = AirbyteType.Number
Status = AirbyteType.Integer
State = AirbyteType.Integer
Picklist = AirbyteType.Integer
Lookup = AirbyteType.String
Virtual = None
def get_auth(config: Mapping[str, Any]) -> MicrosoftOauth2Authenticator:
return MicrosoftOauth2Authenticator(
token_refresh_endpoint=f'https://login.microsoftonline.com/{config["tenant_id"]}/oauth2/v2.0/token',
client_id=config["client_id"],
client_secret=config["client_secret_value"],
scopes=[f'{config["url"]}/.default'],
refresh_token="",
)
def do_request(config: Mapping[str, Any], path: str):
auth = get_auth(config)
headers = auth.get_auth_header()
# Call a protected API with the access token.
return requests.get(
config["url"] + "/api/data/v9.2/" + path,
headers=headers,
)
def convert_dataverse_type(dataverse_type: str) -> Optional[dict]:
if dataverse_type in DataverseType.__members__:
enum_type = DataverseType[dataverse_type]
if enum_type:
return enum_type.value if enum_type.value is None else enum_type.value.value
return AirbyteType.String.value