81 lines
2.5 KiB
Python
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
|