diff --git a/DirectConnector/AzureBlobFunctions.cs b/DirectConnector/AzureBlobFunctions.cs index 4dc8c38..2d711f3 100644 --- a/DirectConnector/AzureBlobFunctions.cs +++ b/DirectConnector/AzureBlobFunctions.cs @@ -3,8 +3,8 @@ //------------------------------------------------------------ using System.Net; -using Microsoft.Azure.Connectors.DirectClient.Azureblob; -using Microsoft.Azure.Connectors.Sdk; +using Azure.Connectors.Sdk; +using Azure.Connectors.Sdk.Azureblob; using Microsoft.Azure.Functions.Worker; using Microsoft.Azure.Functions.Worker.Http; using Microsoft.Extensions.Logging; @@ -71,17 +71,17 @@ await response .ConfigureAwait(continueOnCapturedContext: false); return response; } - catch (AzureblobConnectorException ex) + catch (ConnectorException ex) { - this._logger.LogError(ex, "Azure Blob connector error: '{StatusCode}'.", ex.StatusCode); + this._logger.LogError(ex, "Azure Blob connector error: '{StatusCode}'.", ex.Status); var errorResponse = request.CreateResponse(HttpStatusCode.BadGateway); await errorResponse - .WriteAsJsonAsync(new { success = false, error = ex.Message, statusCode = ex.StatusCode, details = ex.ResponseBody }) + .WriteAsJsonAsync(new { success = false, error = ex.Message, statusCode = ex.Status, details = ex.ResponseBody }) .ConfigureAwait(continueOnCapturedContext: false); return errorResponse; } - catch (Exception ex) when (!ex.IsFatal()) + catch (Exception ex) when (ex is not OperationCanceledException) { this._logger.LogError(ex, "Error in GetBlobMetadata."); @@ -140,17 +140,17 @@ await response.Body return response; } - catch (AzureblobConnectorException ex) + catch (ConnectorException ex) { - this._logger.LogError(ex, "Azure Blob connector error: '{StatusCode}'.", ex.StatusCode); + this._logger.LogError(ex, "Azure Blob connector error: '{StatusCode}'.", ex.Status); var errorResponse = request.CreateResponse(HttpStatusCode.BadGateway); await errorResponse - .WriteAsJsonAsync(new { success = false, error = ex.Message, statusCode = ex.StatusCode, details = ex.ResponseBody }) + .WriteAsJsonAsync(new { success = false, error = ex.Message, statusCode = ex.Status, details = ex.ResponseBody }) .ConfigureAwait(continueOnCapturedContext: false); return errorResponse; } - catch (Exception ex) when (!ex.IsFatal()) + catch (Exception ex) when (ex is not OperationCanceledException) { this._logger.LogError(ex, "Error in DownloadBlob."); @@ -210,17 +210,17 @@ await response .ConfigureAwait(continueOnCapturedContext: false); return response; } - catch (AzureblobConnectorException ex) + catch (ConnectorException ex) { - this._logger.LogError(ex, "Azure Blob connector error: '{StatusCode}'.", ex.StatusCode); + this._logger.LogError(ex, "Azure Blob connector error: '{StatusCode}'.", ex.Status); var errorResponse = request.CreateResponse(HttpStatusCode.BadGateway); await errorResponse - .WriteAsJsonAsync(new { success = false, error = ex.Message, statusCode = ex.StatusCode, details = ex.ResponseBody }) + .WriteAsJsonAsync(new { success = false, error = ex.Message, statusCode = ex.Status, details = ex.ResponseBody }) .ConfigureAwait(continueOnCapturedContext: false); return errorResponse; } - catch (Exception ex) when (!ex.IsFatal()) + catch (Exception ex) when (ex is not OperationCanceledException) { this._logger.LogError(ex, "Error in UploadBlob."); @@ -271,17 +271,17 @@ await response .ConfigureAwait(continueOnCapturedContext: false); return response; } - catch (AzureblobConnectorException ex) + catch (ConnectorException ex) { - this._logger.LogError(ex, "Azure Blob connector error: '{StatusCode}'.", ex.StatusCode); + this._logger.LogError(ex, "Azure Blob connector error: '{StatusCode}'.", ex.Status); var errorResponse = request.CreateResponse(HttpStatusCode.BadGateway); await errorResponse - .WriteAsJsonAsync(new { success = false, error = ex.Message, statusCode = ex.StatusCode, details = ex.ResponseBody }) + .WriteAsJsonAsync(new { success = false, error = ex.Message, statusCode = ex.Status, details = ex.ResponseBody }) .ConfigureAwait(continueOnCapturedContext: false); return errorResponse; } - catch (Exception ex) when (!ex.IsFatal()) + catch (Exception ex) when (ex is not OperationCanceledException) { this._logger.LogError(ex, "Error in DeleteBlob."); diff --git a/DirectConnector/AzureLogAnalyticsFunctions.cs b/DirectConnector/AzureLogAnalyticsFunctions.cs deleted file mode 100644 index 04f3492..0000000 --- a/DirectConnector/AzureLogAnalyticsFunctions.cs +++ /dev/null @@ -1,158 +0,0 @@ -//------------------------------------------------------------ -// Copyright (c) Microsoft Corporation. All rights reserved. -//------------------------------------------------------------ - -using System.Net; -using Microsoft.Azure.Connectors.DirectClient.Azureloganalytics; -using Microsoft.Azure.Connectors.Sdk; -using Microsoft.Azure.Functions.Worker; -using Microsoft.Azure.Functions.Worker.Http; -using Microsoft.Extensions.Logging; - -namespace DirectConnector; - -/// -/// Azure Functions demonstrating Azure Log Analytics operations using the generated -/// from the DirectClient SDK. -/// -public class AzureLogAnalyticsFunctions -{ - private readonly ILogger _logger; - private readonly AzureloganalyticsClient _logAnalyticsClient; - - public AzureLogAnalyticsFunctions( - ILogger logger, - AzureloganalyticsClient logAnalyticsClient) - { - this._logger = logger; - this._logAnalyticsClient = logAnalyticsClient; - } - - /// - /// Lists Azure subscriptions available to the authenticated connection. - /// Demonstrates paginated enumeration via await foreach over ConnectorPageable. - /// - [Function("ListLogAnalyticsSubscriptions")] - public async Task ListSubscriptionsAsync( - [HttpTrigger(AuthorizationLevel.Function, "get", Route = "loganalytics/subscriptions")] HttpRequestData request, - CancellationToken cancellationToken) - { - this._logger.LogInformation("ListLogAnalyticsSubscriptions: Using generated AzureloganalyticsClient from SDK."); - - try - { - var subscriptions = new List(); - await foreach (var subscription in this._logAnalyticsClient - .ListSubscriptionsAsync() - .WithCancellation(cancellationToken) - .ConfigureAwait(continueOnCapturedContext: false)) - { - subscriptions.Add(subscription); - } - - var response = request.CreateResponse(HttpStatusCode.OK); - await response - .WriteAsJsonAsync(new { success = true, count = subscriptions.Count, subscriptions }, cancellationToken) - .ConfigureAwait(continueOnCapturedContext: false); - - return response; - } - catch (AzureloganalyticsConnectorException ex) - { - this._logger.LogError(ex, "ListLogAnalyticsSubscriptions failed with status '{StatusCode}'.", ex.StatusCode); - - var errorResponse = request.CreateResponse(HttpStatusCode.BadGateway); - await errorResponse - .WriteAsJsonAsync(new { success = false, error = ex.Message, statusCode = ex.StatusCode, details = ex.ResponseBody }, cancellationToken) - .ConfigureAwait(continueOnCapturedContext: false); - - return errorResponse; - } - catch (Exception ex) when (!ex.IsFatal()) - { - this._logger.LogError(ex, "Error in ListLogAnalyticsSubscriptions."); - - var errorResponse = request.CreateResponse(HttpStatusCode.InternalServerError); - await errorResponse - .WriteAsJsonAsync(new - { - success = false, - error = ex.Message - }) - .ConfigureAwait(continueOnCapturedContext: false); - - return errorResponse; - } - } - - /// - /// Lists Log Analytics workspaces in a subscription and resource group. - /// Demonstrates paginated enumeration with query parameters passed to the connector. - /// - [Function("ListLogAnalyticsWorkspaces")] - public async Task ListWorkspacesAsync( - [HttpTrigger(AuthorizationLevel.Function, "get", Route = "loganalytics/workspaces")] HttpRequestData request, - CancellationToken cancellationToken) - { - this._logger.LogInformation("ListLogAnalyticsWorkspaces: Using generated AzureloganalyticsClient from SDK."); - - var subscription = request.Query["subscription"]; - var resourceGroup = request.Query["resourceGroup"]; - - if (string.IsNullOrWhiteSpace(subscription) || string.IsNullOrWhiteSpace(resourceGroup)) - { - var badRequest = request.CreateResponse(HttpStatusCode.BadRequest); - await badRequest - .WriteAsJsonAsync(new { success = false, error = "Query parameters 'subscription' and 'resourceGroup' are required." }, cancellationToken) - .ConfigureAwait(continueOnCapturedContext: false); - - return badRequest; - } - - try - { - // Note: SDK returns ResourceGroup type for workspace entries per the connector API schema - var workspaces = new List(); - await foreach (var workspace in this._logAnalyticsClient - .ListWorkspaceNamesAsync(subscription: subscription, resourceGroup: resourceGroup) - .WithCancellation(cancellationToken) - .ConfigureAwait(continueOnCapturedContext: false)) - { - workspaces.Add(workspace); - } - - var response = request.CreateResponse(HttpStatusCode.OK); - await response - .WriteAsJsonAsync(new { success = true, count = workspaces.Count, workspaces }, cancellationToken) - .ConfigureAwait(continueOnCapturedContext: false); - - return response; - } - catch (AzureloganalyticsConnectorException ex) - { - this._logger.LogError(ex, "ListLogAnalyticsWorkspaces failed with status '{StatusCode}'.", ex.StatusCode); - - var errorResponse = request.CreateResponse(HttpStatusCode.BadGateway); - await errorResponse - .WriteAsJsonAsync(new { success = false, error = ex.Message, statusCode = ex.StatusCode, details = ex.ResponseBody }, cancellationToken) - .ConfigureAwait(continueOnCapturedContext: false); - - return errorResponse; - } - catch (Exception ex) when (!ex.IsFatal()) - { - this._logger.LogError(ex, "Error in ListLogAnalyticsWorkspaces."); - - var errorResponse = request.CreateResponse(HttpStatusCode.InternalServerError); - await errorResponse - .WriteAsJsonAsync(new - { - success = false, - error = ex.Message - }) - .ConfigureAwait(continueOnCapturedContext: false); - - return errorResponse; - } - } -} diff --git a/DirectConnector/Configuration/ConnectorOptions.cs b/DirectConnector/Configuration/ConnectorOptions.cs deleted file mode 100644 index 4e57886..0000000 --- a/DirectConnector/Configuration/ConnectorOptions.cs +++ /dev/null @@ -1,269 +0,0 @@ -//------------------------------------------------------------ -// Copyright (c) Microsoft Corporation. All rights reserved. -//------------------------------------------------------------ - -using System.ComponentModel.DataAnnotations; -using Microsoft.Extensions.Options; - -namespace DirectConnector.Configuration; - -/// -/// Configuration options for all managed connectors. -/// -public class ConnectorOptions -{ - /// - /// Configuration section name in appsettings/local.settings. - /// - public const string SectionName = "Connectors"; - - /// - /// Office365 connector options. - /// - [ValidateObjectMembers] - public Office365Options Office365 { get; set; } = new Office365Options(); - - /// - /// SharePoint Online connector options. - /// - [ValidateObjectMembers] - public SharePointOptions SharePoint { get; set; } = new SharePointOptions(); - - /// - /// Microsoft Teams connector options. - /// - [ValidateObjectMembers] - public TeamsOptions Teams { get; set; } = new TeamsOptions(); - - /// - /// OneDrive for Business connector options. - /// - [ValidateObjectMembers] - public OneDriveOptions OneDrive { get; set; } = new OneDriveOptions(); - - /// - /// MS Graph Groups and Users connector options. - /// - [ValidateObjectMembers] - public MsGraphOptions MsGraph { get; set; } = new MsGraphOptions(); - - /// - /// Azure Blob Storage connector options. - /// - [ValidateObjectMembers] - public AzureBlobOptions AzureBlob { get; set; } = new AzureBlobOptions(); - - /// - /// SMTP connector options. - /// - [ValidateObjectMembers] - public SmtpOptions Smtp { get; set; } = new SmtpOptions(); - - /// - /// IBM MQ connector options. - /// - [ValidateObjectMembers] - public MqOptions Mq { get; set; } = new MqOptions(); - - /// - /// Office 365 Users connector options. - /// - [ValidateObjectMembers] - public Office365UsersOptions Office365Users { get; set; } = new Office365UsersOptions(); - - /// - /// Azure Log Analytics connector options. - /// - [ValidateObjectMembers] - public AzureLogAnalyticsOptions AzureLogAnalytics { get; set; } = new AzureLogAnalyticsOptions(); -} - -/// -/// Configuration options for the Microsoft Teams connector. -/// -public class TeamsOptions -{ - /// - /// The API connection runtime URL for Microsoft Teams. - /// - [Required(ErrorMessage = "Teams ConnectionRuntimeUrl is required.")] - public string ConnectionRuntimeUrl { get; set; } = string.Empty; - - /// - /// Managed identity client ID for user-assigned identity. - /// Set to empty string for system-assigned managed identity. - /// Leave unset (null) to use the DefaultAzureCredential chain (CLI, env vars, etc.). - /// - public string? ManagedIdentityClientId { get; set; } -} - -/// -/// Configuration options for the Office365 connector. -/// -public class Office365Options -{ - /// - /// The API connection runtime URL for Office365. - /// - [Required(ErrorMessage = "Office365 ConnectionRuntimeUrl is required.")] - public string ConnectionRuntimeUrl { get; set; } = string.Empty; - - /// - /// Managed identity client ID for user-assigned identity. - /// Set to empty string for system-assigned managed identity. - /// Leave unset (null) to use the DefaultAzureCredential chain (CLI, env vars, etc.). - /// - public string? ManagedIdentityClientId { get; set; } -} - -/// -/// Configuration options for the SharePoint Online connector. -/// -public class SharePointOptions -{ - /// - /// The API connection runtime URL for SharePoint Online. - /// - [Required(ErrorMessage = "SharePoint ConnectionRuntimeUrl is required.")] - public string ConnectionRuntimeUrl { get; set; } = string.Empty; - - /// - /// Managed identity client ID for user-assigned identity. - /// Set to empty string for system-assigned managed identity. - /// Leave unset (null) to use the DefaultAzureCredential chain (CLI, env vars, etc.). - /// - public string? ManagedIdentityClientId { get; set; } -} - -/// -/// Configuration options for the OneDrive for Business connector. -/// -public class OneDriveOptions -{ - /// - /// The API connection runtime URL for OneDrive for Business. - /// - [Required(ErrorMessage = "OneDrive ConnectionRuntimeUrl is required.")] - public string ConnectionRuntimeUrl { get; set; } = string.Empty; - - /// - /// Managed identity client ID for user-assigned identity. - /// Set to empty string for system-assigned managed identity. - /// Leave unset (null) to use the DefaultAzureCredential chain (CLI, env vars, etc.). - /// - public string? ManagedIdentityClientId { get; set; } -} - -/// -/// Configuration options for the MS Graph Groups and Users connector. -/// -public class MsGraphOptions -{ - /// - /// The API connection runtime URL for MS Graph Groups and Users. - /// - [Required(ErrorMessage = "Connectors:MsGraph:ConnectionRuntimeUrl is required.")] - public string ConnectionRuntimeUrl { get; set; } = string.Empty; - - /// - /// Managed identity client ID for user-assigned identity. - /// Set to empty string for system-assigned managed identity. - /// Leave unset (null) to use the DefaultAzureCredential chain (CLI, env vars, etc.). - /// - public string? ManagedIdentityClientId { get; set; } -} - -/// -/// Configuration options for the Azure Blob Storage connector. -/// -public class AzureBlobOptions -{ - /// - /// The API connection runtime URL for Azure Blob Storage. - /// - [Required(ErrorMessage = "Connectors:AzureBlob:ConnectionRuntimeUrl is required.")] - public string ConnectionRuntimeUrl { get; set; } = string.Empty; - - /// - /// Managed identity client ID for user-assigned identity. - /// Set to empty string for system-assigned managed identity. - /// Leave unset (null) to use the DefaultAzureCredential chain (CLI, env vars, etc.). - /// - public string? ManagedIdentityClientId { get; set; } -} - -/// -/// Configuration options for the SMTP connector. -/// -public class SmtpOptions -{ - /// - /// The API connection runtime URL for SMTP. - /// - [Required(ErrorMessage = "Connectors:Smtp:ConnectionRuntimeUrl is required.")] - public string ConnectionRuntimeUrl { get; set; } = string.Empty; - - /// - /// Managed identity client ID for user-assigned identity. - /// Set to empty string for system-assigned managed identity. - /// Leave unset (null) to use the DefaultAzureCredential chain (CLI, env vars, etc.). - /// - public string? ManagedIdentityClientId { get; set; } -} - -/// -/// Configuration options for the IBM MQ connector. -/// -public class MqOptions -{ - /// - /// The API connection runtime URL for IBM MQ. - /// - [Required(ErrorMessage = "Connectors:Mq:ConnectionRuntimeUrl is required.")] - public string ConnectionRuntimeUrl { get; set; } = string.Empty; - - /// - /// Managed identity client ID for user-assigned identity. - /// Set to empty string for system-assigned managed identity. - /// Leave unset (null) to use the DefaultAzureCredential chain (CLI, env vars, etc.). - /// - public string? ManagedIdentityClientId { get; set; } -} - -/// -/// Configuration options for the Office 365 Users connector. -/// -public class Office365UsersOptions -{ - /// - /// The API connection runtime URL for Office 365 Users. - /// - [Required(ErrorMessage = "Connectors:Office365Users:ConnectionRuntimeUrl is required.")] - public string ConnectionRuntimeUrl { get; set; } = string.Empty; - - /// - /// Managed identity client ID for user-assigned identity. - /// Set to empty string for system-assigned managed identity. - /// Leave unset (null) to use the DefaultAzureCredential chain (CLI, env vars, etc.). - /// - public string? ManagedIdentityClientId { get; set; } -} - -/// -/// Configuration options for the Azure Log Analytics connector. -/// -public class AzureLogAnalyticsOptions -{ - /// - /// The API connection runtime URL for Azure Log Analytics. - /// - [Required(ErrorMessage = "Connectors:AzureLogAnalytics:ConnectionRuntimeUrl is required.")] - public string ConnectionRuntimeUrl { get; set; } = string.Empty; - - /// - /// Managed identity client ID for user-assigned identity. - /// Set to empty string for system-assigned managed identity. - /// Leave unset (null) to use the DefaultAzureCredential chain (CLI, env vars, etc.). - /// - public string? ManagedIdentityClientId { get; set; } -} diff --git a/DirectConnector/ConnectorFunctions.cs b/DirectConnector/ConnectorFunctions.cs index 81b52a1..ef84e22 100644 --- a/DirectConnector/ConnectorFunctions.cs +++ b/DirectConnector/ConnectorFunctions.cs @@ -5,14 +5,14 @@ using System.Net; using System.Text; using System.Text.Json; -using Microsoft.Azure.Connectors.DirectClient.Office365; -using Microsoft.Azure.Connectors.DirectClient.Sharepointonline; -using Microsoft.Azure.Connectors.DirectClient.Teams; -using Microsoft.Azure.Connectors.Sdk; +using Azure.Connectors.Sdk; +using Azure.Connectors.Sdk.Office365; +using Azure.Connectors.Sdk.Sharepointonline; +using Azure.Connectors.Sdk.Teams; using Microsoft.Azure.Functions.Worker; using Microsoft.Azure.Functions.Worker.Http; using Microsoft.Extensions.Logging; -using SharePointBlobMetadata = Microsoft.Azure.Connectors.DirectClient.Sharepointonline.BlobMetadata; +using SharePointBlobMetadata = Azure.Connectors.Sdk.Sharepointonline.BlobMetadata; namespace DirectConnector; @@ -148,9 +148,9 @@ await response return response; } - catch (Office365ConnectorException ex) + catch (ConnectorException ex) { - this._logger.LogError(ex, "Connector error: '{StatusCode}'.", ex.StatusCode); + this._logger.LogError(ex, "Connector error: '{StatusCode}'.", ex.Status); var errorResponse = request.CreateResponse(HttpStatusCode.BadGateway); await errorResponse @@ -158,14 +158,14 @@ await errorResponse { success = false, error = ex.Message, - statusCode = ex.StatusCode, + statusCode = ex.Status, details = ex.ResponseBody }) .ConfigureAwait(continueOnCapturedContext: false); return errorResponse; } - catch (Exception ex) when (!ex.IsFatal()) + catch (Exception ex) when (ex is not OperationCanceledException) { this._logger.LogError(ex, "Error in SendEmail."); @@ -212,9 +212,9 @@ await response return response; } - catch (Office365ConnectorException ex) + catch (ConnectorException ex) { - this._logger.LogError(ex, "Connector error: '{StatusCode}'.", ex.StatusCode); + this._logger.LogError(ex, "Connector error: '{StatusCode}'.", ex.Status); var errorResponse = request.CreateResponse(HttpStatusCode.BadGateway); await errorResponse @@ -222,13 +222,13 @@ await errorResponse { success = false, error = ex.Message, - statusCode = ex.StatusCode + statusCode = ex.Status }) .ConfigureAwait(continueOnCapturedContext: false); return errorResponse; } - catch (Exception ex) when (!ex.IsFatal()) + catch (Exception ex) when (ex is not OperationCanceledException) { this._logger.LogError(ex, "Error in GetCategories."); @@ -290,9 +290,9 @@ await response return response; } - catch (SharepointonlineConnectorException ex) + catch (ConnectorException ex) { - this._logger.LogError(ex, "SharePoint connector error: '{StatusCode}'.", ex.StatusCode); + this._logger.LogError(ex, "SharePoint connector error: '{StatusCode}'.", ex.Status); var errorResponse = request.CreateResponse(HttpStatusCode.BadGateway); await errorResponse @@ -300,14 +300,14 @@ await errorResponse { success = false, error = ex.Message, - statusCode = ex.StatusCode, + statusCode = ex.Status, details = ex.ResponseBody }) .ConfigureAwait(continueOnCapturedContext: false); return errorResponse; } - catch (Exception ex) when (!ex.IsFatal()) + catch (Exception ex) when (ex is not OperationCanceledException) { this._logger.LogError(ex, "Error in GetSharePointLists."); @@ -386,9 +386,9 @@ await response return response; } - catch (SharepointonlineConnectorException ex) + catch (ConnectorException ex) { - this._logger.LogError(ex, "SharePoint connector error: '{StatusCode}'.", ex.StatusCode); + this._logger.LogError(ex, "SharePoint connector error: '{StatusCode}'.", ex.Status); var errorResponse = request.CreateResponse(HttpStatusCode.BadGateway); await errorResponse @@ -396,14 +396,14 @@ await errorResponse { success = false, error = ex.Message, - statusCode = ex.StatusCode, + statusCode = ex.Status, details = ex.ResponseBody }) .ConfigureAwait(continueOnCapturedContext: false); return errorResponse; } - catch (Exception ex) when (!ex.IsFatal()) + catch (Exception ex) when (ex is not OperationCanceledException) { this._logger.LogError(ex, "Error in ListFolder."); @@ -471,9 +471,9 @@ await response.Body return response; } - catch (SharepointonlineConnectorException ex) + catch (ConnectorException ex) { - this._logger.LogError(ex, "SharePoint connector error: '{StatusCode}'.", ex.StatusCode); + this._logger.LogError(ex, "SharePoint connector error: '{StatusCode}'.", ex.Status); var errorResponse = request.CreateResponse(HttpStatusCode.BadGateway); await errorResponse @@ -481,14 +481,14 @@ await errorResponse { success = false, error = ex.Message, - statusCode = ex.StatusCode, + statusCode = ex.Status, details = ex.ResponseBody }) .ConfigureAwait(continueOnCapturedContext: false); return errorResponse; } - catch (Exception ex) when (!ex.IsFatal()) + catch (Exception ex) when (ex is not OperationCanceledException) { this._logger.LogError(ex, "Error in DownloadFile."); @@ -593,9 +593,9 @@ await response return response; } - catch (SharepointonlineConnectorException ex) + catch (ConnectorException ex) { - this._logger.LogError(ex, "SharePoint connector error: '{StatusCode}'.", ex.StatusCode); + this._logger.LogError(ex, "SharePoint connector error: '{StatusCode}'.", ex.Status); var errorResponse = request.CreateResponse(HttpStatusCode.BadGateway); await errorResponse @@ -603,14 +603,14 @@ await errorResponse { success = false, error = ex.Message, - statusCode = ex.StatusCode, + statusCode = ex.Status, details = ex.ResponseBody }) .ConfigureAwait(continueOnCapturedContext: false); return errorResponse; } - catch (Exception ex) when (!ex.IsFatal()) + catch (Exception ex) when (ex is not OperationCanceledException) { this._logger.LogError(ex, "Error in UploadFile."); @@ -670,9 +670,9 @@ await response.Body return response; } - catch (Office365ConnectorException ex) + catch (ConnectorException ex) { - this._logger.LogError(ex, "Connector error: '{StatusCode}'.", ex.StatusCode); + this._logger.LogError(ex, "Connector error: '{StatusCode}'.", ex.Status); var errorResponse = request.CreateResponse(HttpStatusCode.BadGateway); await errorResponse @@ -680,13 +680,13 @@ await errorResponse { success = false, error = ex.Message, - statusCode = ex.StatusCode + statusCode = ex.Status }) .ConfigureAwait(continueOnCapturedContext: false); return errorResponse; } - catch (Exception ex) when (!ex.IsFatal()) + catch (Exception ex) when (ex is not OperationCanceledException) { this._logger.LogError(ex, "Error in ExportEmail."); @@ -846,7 +846,7 @@ await errorResponse return errorResponse; } - catch (Exception ex) when (!ex.IsFatal()) + catch (Exception ex) when (ex is not OperationCanceledException) { this._logger.LogError(ex, "Error in TriggerCallback."); @@ -928,9 +928,9 @@ await response return response; } - catch (TeamsConnectorException ex) + catch (ConnectorException ex) { - this._logger.LogError(ex, "Teams connector error: '{StatusCode}'.", ex.StatusCode); + this._logger.LogError(ex, "Teams connector error: '{StatusCode}'.", ex.Status); var errorResponse = request.CreateResponse(HttpStatusCode.BadGateway); await errorResponse @@ -938,14 +938,14 @@ await errorResponse { success = false, error = ex.Message, - statusCode = ex.StatusCode, + statusCode = ex.Status, details = ex.ResponseBody }) .ConfigureAwait(continueOnCapturedContext: false); return errorResponse; } - catch (Exception ex) when (!ex.IsFatal()) + catch (Exception ex) when (ex is not OperationCanceledException) { this._logger.LogError(ex, "Error in GetAllTeams."); @@ -1005,9 +1005,9 @@ await response return response; } - catch (TeamsConnectorException ex) + catch (ConnectorException ex) { - this._logger.LogError(ex, "Teams connector error: '{StatusCode}'.", ex.StatusCode); + this._logger.LogError(ex, "Teams connector error: '{StatusCode}'.", ex.Status); var errorResponse = request.CreateResponse(HttpStatusCode.BadGateway); await errorResponse @@ -1015,14 +1015,14 @@ await errorResponse { success = false, error = ex.Message, - statusCode = ex.StatusCode, + statusCode = ex.Status, details = ex.ResponseBody }) .ConfigureAwait(continueOnCapturedContext: false); return errorResponse; } - catch (Exception ex) when (!ex.IsFatal()) + catch (Exception ex) when (ex is not OperationCanceledException) { this._logger.LogError(ex, "Error in GetTeamChannels."); @@ -1098,9 +1098,9 @@ await response return response; } - catch (TeamsConnectorException ex) + catch (ConnectorException ex) { - this._logger.LogError(ex, "Teams connector error: '{StatusCode}'.", ex.StatusCode); + this._logger.LogError(ex, "Teams connector error: '{StatusCode}'.", ex.Status); var errorResponse = request.CreateResponse(HttpStatusCode.BadGateway); await errorResponse @@ -1108,14 +1108,14 @@ await errorResponse { success = false, error = ex.Message, - statusCode = ex.StatusCode, + statusCode = ex.Status, details = ex.ResponseBody }) .ConfigureAwait(continueOnCapturedContext: false); return errorResponse; } - catch (Exception ex) when (!ex.IsFatal()) + catch (Exception ex) when (ex is not OperationCanceledException) { this._logger.LogError(ex, "Error in GetChannelMessages."); @@ -1178,7 +1178,7 @@ await badRequest // The actual message body properties are determined at runtime by the connector's schema // discovery endpoint. With [JsonExtensionData] on AdditionalProperties, arbitrary properties // are now serialized correctly. Populate the dictionary with the expected message fields. - var messageRequest = new Microsoft.Azure.Connectors.DirectClient.Teams.DynamicPostMessageRequest(); + var messageRequest = new Azure.Connectors.Sdk.Teams.DynamicPostMessageRequest(); messageRequest.AdditionalProperties["recipient"] = JsonSerializer.SerializeToElement( new { @@ -1210,9 +1210,9 @@ await response return response; } - catch (TeamsConnectorException ex) + catch (ConnectorException ex) { - this._logger.LogError(ex, "Teams connector error: '{StatusCode}'.", ex.StatusCode); + this._logger.LogError(ex, "Teams connector error: '{StatusCode}'.", ex.Status); var errorResponse = request.CreateResponse(HttpStatusCode.BadGateway); await errorResponse @@ -1220,14 +1220,14 @@ await errorResponse { success = false, error = ex.Message, - statusCode = ex.StatusCode, + statusCode = ex.Status, details = ex.ResponseBody }) .ConfigureAwait(continueOnCapturedContext: false); return errorResponse; } - catch (Exception ex) when (!ex.IsFatal()) + catch (Exception ex) when (ex is not OperationCanceledException) { this._logger.LogError(ex, "Error in PostTeamsMessage."); @@ -1323,9 +1323,9 @@ await response return response; } - catch (Office365ConnectorException ex) + catch (ConnectorException ex) { - this._logger.LogError(ex, "Connector error: '{StatusCode}'.", ex.StatusCode); + this._logger.LogError(ex, "Connector error: '{StatusCode}'.", ex.Status); var errorResponse = request.CreateResponse(HttpStatusCode.BadGateway); await errorResponse @@ -1333,14 +1333,14 @@ await errorResponse { success = false, error = ex.Message, - statusCode = ex.StatusCode, + statusCode = ex.Status, details = ex.ResponseBody }) .ConfigureAwait(continueOnCapturedContext: false); return errorResponse; } - catch (Exception ex) when (!ex.IsFatal()) + catch (Exception ex) when (ex is not OperationCanceledException) { this._logger.LogError(ex, "Error in CreateCalendarEvent."); diff --git a/DirectConnector/ConnectorTriggerMetadataAttribute.cs b/DirectConnector/ConnectorTriggerMetadataAttribute.cs index fd4ac8e..988ba0c 100644 --- a/DirectConnector/ConnectorTriggerMetadataAttribute.cs +++ b/DirectConnector/ConnectorTriggerMetadataAttribute.cs @@ -28,13 +28,13 @@ namespace DirectConnector; public sealed class ConnectorTriggerMetadataAttribute : Attribute { /// - /// The connector API name. Use constants from . + /// The connector API name. Use constants from . /// public string ConnectorName { get; set; } = ""; /// /// The trigger operation name. Use constants from the connector's *TriggerOperations class - /// (e.g., ). + /// (e.g., ). /// public string OperationName { get; set; } = ""; diff --git a/DirectConnector/DirectConnector.csproj b/DirectConnector/DirectConnector.csproj index 25131d0..90a936b 100644 --- a/DirectConnector/DirectConnector.csproj +++ b/DirectConnector/DirectConnector.csproj @@ -10,11 +10,13 @@ - - - + + + diff --git a/DirectConnector/MqFunctions.cs b/DirectConnector/MqFunctions.cs index f5a1918..019d31c 100644 --- a/DirectConnector/MqFunctions.cs +++ b/DirectConnector/MqFunctions.cs @@ -4,8 +4,8 @@ using System.Net; using System.Text.Json; -using Microsoft.Azure.Connectors.DirectClient.Mq; -using Microsoft.Azure.Connectors.Sdk; +using Azure.Connectors.Sdk; +using Azure.Connectors.Sdk.Mq; using Microsoft.Azure.Functions.Worker; using Microsoft.Azure.Functions.Worker.Http; using Microsoft.Extensions.Logging; @@ -85,13 +85,13 @@ await response return response; } - catch (MqConnectorException ex) + catch (ConnectorException ex) { - this._logger.LogError(ex, "MQ send failed with status '{StatusCode}'.", ex.StatusCode); + this._logger.LogError(ex, "MQ send failed with status '{StatusCode}'.", ex.Status); var errorResponse = request.CreateResponse(HttpStatusCode.BadGateway); await errorResponse - .WriteAsJsonAsync(new { success = false, error = ex.Message, statusCode = ex.StatusCode, details = ex.ResponseBody }, cancellationToken) + .WriteAsJsonAsync(new { success = false, error = ex.Message, statusCode = ex.Status, details = ex.ResponseBody }, cancellationToken) .ConfigureAwait(continueOnCapturedContext: false); return errorResponse; @@ -107,7 +107,7 @@ await badRequest return badRequest; } - catch (Exception ex) when (!ex.IsFatal()) + catch (Exception ex) when (ex is not OperationCanceledException) { this._logger.LogError(ex, "Error in MqSendMessage."); @@ -156,13 +156,13 @@ await response return response; } - catch (MqConnectorException ex) + catch (ConnectorException ex) { - this._logger.LogError(ex, "MQ browse failed with status '{StatusCode}'.", ex.StatusCode); + this._logger.LogError(ex, "MQ browse failed with status '{StatusCode}'.", ex.Status); var errorResponse = request.CreateResponse(HttpStatusCode.BadGateway); await errorResponse - .WriteAsJsonAsync(new { success = false, error = ex.Message, statusCode = ex.StatusCode, details = ex.ResponseBody }, cancellationToken) + .WriteAsJsonAsync(new { success = false, error = ex.Message, statusCode = ex.Status, details = ex.ResponseBody }, cancellationToken) .ConfigureAwait(continueOnCapturedContext: false); return errorResponse; @@ -178,7 +178,7 @@ await badRequest return badRequest; } - catch (Exception ex) when (!ex.IsFatal()) + catch (Exception ex) when (ex is not OperationCanceledException) { this._logger.LogError(ex, "Error in MqBrowseMessage."); @@ -231,13 +231,13 @@ await response return response; } - catch (MqConnectorException ex) + catch (ConnectorException ex) { - this._logger.LogError(ex, "MQ browse batch failed with status '{StatusCode}'.", ex.StatusCode); + this._logger.LogError(ex, "MQ browse batch failed with status '{StatusCode}'.", ex.Status); var errorResponse = request.CreateResponse(HttpStatusCode.BadGateway); await errorResponse - .WriteAsJsonAsync(new { success = false, error = ex.Message, statusCode = ex.StatusCode, details = ex.ResponseBody }, cancellationToken) + .WriteAsJsonAsync(new { success = false, error = ex.Message, statusCode = ex.Status, details = ex.ResponseBody }, cancellationToken) .ConfigureAwait(continueOnCapturedContext: false); return errorResponse; @@ -253,7 +253,7 @@ await badRequest return badRequest; } - catch (Exception ex) when (!ex.IsFatal()) + catch (Exception ex) when (ex is not OperationCanceledException) { this._logger.LogError(ex, "Error in MqBrowseMessages."); @@ -302,13 +302,13 @@ await response return response; } - catch (MqConnectorException ex) + catch (ConnectorException ex) { - this._logger.LogError(ex, "MQ receive failed with status '{StatusCode}'.", ex.StatusCode); + this._logger.LogError(ex, "MQ receive failed with status '{StatusCode}'.", ex.Status); var errorResponse = request.CreateResponse(HttpStatusCode.BadGateway); await errorResponse - .WriteAsJsonAsync(new { success = false, error = ex.Message, statusCode = ex.StatusCode, details = ex.ResponseBody }, cancellationToken) + .WriteAsJsonAsync(new { success = false, error = ex.Message, statusCode = ex.Status, details = ex.ResponseBody }, cancellationToken) .ConfigureAwait(continueOnCapturedContext: false); return errorResponse; @@ -324,7 +324,7 @@ await badRequest return badRequest; } - catch (Exception ex) when (!ex.IsFatal()) + catch (Exception ex) when (ex is not OperationCanceledException) { this._logger.LogError(ex, "Error in MqReceiveMessage."); @@ -378,13 +378,13 @@ await response return response; } - catch (MqConnectorException ex) + catch (ConnectorException ex) { - this._logger.LogError(ex, "MQ delete failed with status '{StatusCode}'.", ex.StatusCode); + this._logger.LogError(ex, "MQ delete failed with status '{StatusCode}'.", ex.Status); var errorResponse = request.CreateResponse(HttpStatusCode.BadGateway); await errorResponse - .WriteAsJsonAsync(new { success = false, error = ex.Message, statusCode = ex.StatusCode, details = ex.ResponseBody }, cancellationToken) + .WriteAsJsonAsync(new { success = false, error = ex.Message, statusCode = ex.Status, details = ex.ResponseBody }, cancellationToken) .ConfigureAwait(continueOnCapturedContext: false); return errorResponse; @@ -400,7 +400,7 @@ await badRequest return badRequest; } - catch (Exception ex) when (!ex.IsFatal()) + catch (Exception ex) when (ex is not OperationCanceledException) { this._logger.LogError(ex, "Error in MqDeleteMessage."); diff --git a/DirectConnector/MsGraphFunctions.cs b/DirectConnector/MsGraphFunctions.cs index 7be6cbb..7cac586 100644 --- a/DirectConnector/MsGraphFunctions.cs +++ b/DirectConnector/MsGraphFunctions.cs @@ -3,8 +3,8 @@ //------------------------------------------------------------ using System.Net; -using Microsoft.Azure.Connectors.DirectClient.Msgraphgroupsanduser; -using Microsoft.Azure.Connectors.Sdk; +using Azure.Connectors.Sdk; +using Azure.Connectors.Sdk.Msgraphgroupsanduser; using Microsoft.Azure.Functions.Worker; using Microsoft.Azure.Functions.Worker.Http; using Microsoft.Extensions.Logging; @@ -66,9 +66,9 @@ await response return response; } - catch (MsgraphgroupsanduserConnectorException ex) + catch (ConnectorException ex) { - this._logger.LogError(ex, "MS Graph connector error: '{StatusCode}'.", ex.StatusCode); + this._logger.LogError(ex, "MS Graph connector error: '{StatusCode}'.", ex.Status); var errorResponse = request.CreateResponse(HttpStatusCode.BadGateway); await errorResponse @@ -76,14 +76,14 @@ await errorResponse { success = false, error = ex.Message, - statusCode = ex.StatusCode, + statusCode = ex.Status, details = ex.ResponseBody }) .ConfigureAwait(continueOnCapturedContext: false); return errorResponse; } - catch (Exception ex) when (!ex.IsFatal()) + catch (Exception ex) when (ex is not OperationCanceledException) { this._logger.LogError(ex, "Error in ListGraphUsers."); @@ -130,9 +130,9 @@ await response return response; } - catch (MsgraphgroupsanduserConnectorException ex) + catch (ConnectorException ex) { - this._logger.LogError(ex, "MS Graph connector error: '{StatusCode}'.", ex.StatusCode); + this._logger.LogError(ex, "MS Graph connector error: '{StatusCode}'.", ex.Status); var errorResponse = request.CreateResponse(HttpStatusCode.BadGateway); await errorResponse @@ -140,14 +140,14 @@ await errorResponse { success = false, error = ex.Message, - statusCode = ex.StatusCode, + statusCode = ex.Status, details = ex.ResponseBody }) .ConfigureAwait(continueOnCapturedContext: false); return errorResponse; } - catch (Exception ex) when (!ex.IsFatal()) + catch (Exception ex) when (ex is not OperationCanceledException) { this._logger.LogError(ex, "Error in ListGraphGroups."); @@ -206,9 +206,9 @@ await response return response; } - catch (MsgraphgroupsanduserConnectorException ex) + catch (ConnectorException ex) { - this._logger.LogError(ex, "MS Graph connector error: '{StatusCode}'.", ex.StatusCode); + this._logger.LogError(ex, "MS Graph connector error: '{StatusCode}'.", ex.Status); var errorResponse = request.CreateResponse(HttpStatusCode.BadGateway); await errorResponse @@ -216,14 +216,14 @@ await errorResponse { success = false, error = ex.Message, - statusCode = ex.StatusCode, + statusCode = ex.Status, details = ex.ResponseBody }) .ConfigureAwait(continueOnCapturedContext: false); return errorResponse; } - catch (Exception ex) when (!ex.IsFatal()) + catch (Exception ex) when (ex is not OperationCanceledException) { this._logger.LogError(ex, "Error in GetGraphGroupProperties."); diff --git a/DirectConnector/Office365UsersFunctions.cs b/DirectConnector/Office365UsersFunctions.cs index d6d4d41..b35faf7 100644 --- a/DirectConnector/Office365UsersFunctions.cs +++ b/DirectConnector/Office365UsersFunctions.cs @@ -3,8 +3,8 @@ //------------------------------------------------------------ using System.Net; -using Microsoft.Azure.Connectors.DirectClient.Office365users; -using Microsoft.Azure.Connectors.Sdk; +using Azure.Connectors.Sdk; +using Azure.Connectors.Sdk.Office365users; using Microsoft.Azure.Functions.Worker; using Microsoft.Azure.Functions.Worker.Http; using Microsoft.Extensions.Logging; @@ -48,18 +48,18 @@ await response return response; } - catch (Office365usersConnectorException ex) + catch (ConnectorException ex) { - this._logger.LogError(ex, "GetMyProfile failed with status '{StatusCode}'.", ex.StatusCode); + this._logger.LogError(ex, "GetMyProfile failed with status '{StatusCode}'.", ex.Status); var errorResponse = request.CreateResponse(HttpStatusCode.BadGateway); await errorResponse - .WriteAsJsonAsync(new { success = false, error = ex.Message, statusCode = ex.StatusCode, details = ex.ResponseBody }, cancellationToken) + .WriteAsJsonAsync(new { success = false, error = ex.Message, statusCode = ex.Status, details = ex.ResponseBody }, cancellationToken) .ConfigureAwait(continueOnCapturedContext: false); return errorResponse; } - catch (Exception ex) when (!ex.IsFatal()) + catch (Exception ex) when (ex is not OperationCanceledException) { this._logger.LogError(ex, "Error in GetMyProfile."); @@ -97,18 +97,18 @@ await response return response; } - catch (Office365usersConnectorException ex) + catch (ConnectorException ex) { - this._logger.LogError(ex, "GetUserProfile failed with status '{StatusCode}'.", ex.StatusCode); + this._logger.LogError(ex, "GetUserProfile failed with status '{StatusCode}'.", ex.Status); var errorResponse = request.CreateResponse(HttpStatusCode.BadGateway); await errorResponse - .WriteAsJsonAsync(new { success = false, error = ex.Message, statusCode = ex.StatusCode, details = ex.ResponseBody }, cancellationToken) + .WriteAsJsonAsync(new { success = false, error = ex.Message, statusCode = ex.Status, details = ex.ResponseBody }, cancellationToken) .ConfigureAwait(continueOnCapturedContext: false); return errorResponse; } - catch (Exception ex) when (!ex.IsFatal()) + catch (Exception ex) when (ex is not OperationCanceledException) { this._logger.LogError(ex, "Error in GetUserProfile."); @@ -146,18 +146,18 @@ await response return response; } - catch (Office365usersConnectorException ex) + catch (ConnectorException ex) { - this._logger.LogError(ex, "GetManager failed with status '{StatusCode}'.", ex.StatusCode); + this._logger.LogError(ex, "GetManager failed with status '{StatusCode}'.", ex.Status); var errorResponse = request.CreateResponse(HttpStatusCode.BadGateway); await errorResponse - .WriteAsJsonAsync(new { success = false, error = ex.Message, statusCode = ex.StatusCode, details = ex.ResponseBody }, cancellationToken) + .WriteAsJsonAsync(new { success = false, error = ex.Message, statusCode = ex.Status, details = ex.ResponseBody }, cancellationToken) .ConfigureAwait(continueOnCapturedContext: false); return errorResponse; } - catch (Exception ex) when (!ex.IsFatal()) + catch (Exception ex) when (ex is not OperationCanceledException) { this._logger.LogError(ex, "Error in GetManager."); @@ -195,18 +195,18 @@ await response return response; } - catch (Office365usersConnectorException ex) + catch (ConnectorException ex) { - this._logger.LogError(ex, "GetDirectReports failed with status '{StatusCode}'.", ex.StatusCode); + this._logger.LogError(ex, "GetDirectReports failed with status '{StatusCode}'.", ex.Status); var errorResponse = request.CreateResponse(HttpStatusCode.BadGateway); await errorResponse - .WriteAsJsonAsync(new { success = false, error = ex.Message, statusCode = ex.StatusCode, details = ex.ResponseBody }, cancellationToken) + .WriteAsJsonAsync(new { success = false, error = ex.Message, statusCode = ex.Status, details = ex.ResponseBody }, cancellationToken) .ConfigureAwait(continueOnCapturedContext: false); return errorResponse; } - catch (Exception ex) when (!ex.IsFatal()) + catch (Exception ex) when (ex is not OperationCanceledException) { this._logger.LogError(ex, "Error in GetDirectReports."); @@ -260,18 +260,18 @@ await response return response; } - catch (Office365usersConnectorException ex) + catch (ConnectorException ex) { - this._logger.LogError(ex, "SearchUsers failed with status '{StatusCode}'.", ex.StatusCode); + this._logger.LogError(ex, "SearchUsers failed with status '{StatusCode}'.", ex.Status); var errorResponse = request.CreateResponse(HttpStatusCode.BadGateway); await errorResponse - .WriteAsJsonAsync(new { success = false, error = ex.Message, statusCode = ex.StatusCode, details = ex.ResponseBody }, cancellationToken) + .WriteAsJsonAsync(new { success = false, error = ex.Message, statusCode = ex.Status, details = ex.ResponseBody }, cancellationToken) .ConfigureAwait(continueOnCapturedContext: false); return errorResponse; } - catch (Exception ex) when (!ex.IsFatal()) + catch (Exception ex) when (ex is not OperationCanceledException) { this._logger.LogError(ex, "Error in SearchUsers."); diff --git a/DirectConnector/OneDriveFunctions.cs b/DirectConnector/OneDriveFunctions.cs index f46dbdc..36e9c51 100644 --- a/DirectConnector/OneDriveFunctions.cs +++ b/DirectConnector/OneDriveFunctions.cs @@ -5,12 +5,12 @@ using System.Net; using System.Text; using System.Text.Json; -using Microsoft.Azure.Connectors.DirectClient.Onedriveforbusiness; -using Microsoft.Azure.Connectors.Sdk; +using Azure.Connectors.Sdk; +using Azure.Connectors.Sdk.Onedriveforbusiness; using Microsoft.Azure.Functions.Worker; using Microsoft.Azure.Functions.Worker.Http; using Microsoft.Extensions.Logging; -using OneDriveBlobMetadata = Microsoft.Azure.Connectors.DirectClient.Onedriveforbusiness.BlobMetadata; +using OneDriveBlobMetadata = Azure.Connectors.Sdk.Onedriveforbusiness.BlobMetadata; namespace DirectConnector; @@ -103,9 +103,9 @@ await response return response; } - catch (OnedriveforbusinessConnectorException ex) + catch (ConnectorException ex) { - this._logger.LogError(ex, "OneDrive connector error: '{StatusCode}'.", ex.StatusCode); + this._logger.LogError(ex, "OneDrive connector error: '{StatusCode}'.", ex.Status); var errorResponse = request.CreateResponse(HttpStatusCode.BadGateway); await errorResponse @@ -113,14 +113,14 @@ await errorResponse { success = false, error = ex.Message, - statusCode = ex.StatusCode, + statusCode = ex.Status, details = ex.ResponseBody }) .ConfigureAwait(continueOnCapturedContext: false); return errorResponse; } - catch (Exception ex) when (!ex.IsFatal()) + catch (Exception ex) when (ex is not OperationCanceledException) { this._logger.LogError(ex, "Error in ListOneDriveRoot."); @@ -194,9 +194,9 @@ await response return response; } - catch (OnedriveforbusinessConnectorException ex) + catch (ConnectorException ex) { - this._logger.LogError(ex, "OneDrive connector error: '{StatusCode}'.", ex.StatusCode); + this._logger.LogError(ex, "OneDrive connector error: '{StatusCode}'.", ex.Status); var errorResponse = request.CreateResponse(HttpStatusCode.BadGateway); await errorResponse @@ -204,14 +204,14 @@ await errorResponse { success = false, error = ex.Message, - statusCode = ex.StatusCode, + statusCode = ex.Status, details = ex.ResponseBody }) .ConfigureAwait(continueOnCapturedContext: false); return errorResponse; } - catch (Exception ex) when (!ex.IsFatal()) + catch (Exception ex) when (ex is not OperationCanceledException) { this._logger.LogError(ex, "Error in ListOneDriveFolder."); @@ -272,9 +272,9 @@ await response.Body return response; } - catch (OnedriveforbusinessConnectorException ex) + catch (ConnectorException ex) { - this._logger.LogError(ex, "OneDrive connector error: '{StatusCode}'.", ex.StatusCode); + this._logger.LogError(ex, "OneDrive connector error: '{StatusCode}'.", ex.Status); var errorResponse = request.CreateResponse(HttpStatusCode.BadGateway); await errorResponse @@ -282,14 +282,14 @@ await errorResponse { success = false, error = ex.Message, - statusCode = ex.StatusCode, + statusCode = ex.Status, details = ex.ResponseBody }) .ConfigureAwait(continueOnCapturedContext: false); return errorResponse; } - catch (Exception ex) when (!ex.IsFatal()) + catch (Exception ex) when (ex is not OperationCanceledException) { this._logger.LogError(ex, "Error in DownloadOneDriveFile."); @@ -391,9 +391,9 @@ await response return response; } - catch (OnedriveforbusinessConnectorException ex) + catch (ConnectorException ex) { - this._logger.LogError(ex, "OneDrive connector error: '{StatusCode}'.", ex.StatusCode); + this._logger.LogError(ex, "OneDrive connector error: '{StatusCode}'.", ex.Status); var errorResponse = request.CreateResponse(HttpStatusCode.BadGateway); await errorResponse @@ -401,14 +401,14 @@ await errorResponse { success = false, error = ex.Message, - statusCode = ex.StatusCode, + statusCode = ex.Status, details = ex.ResponseBody }) .ConfigureAwait(continueOnCapturedContext: false); return errorResponse; } - catch (Exception ex) when (!ex.IsFatal()) + catch (Exception ex) when (ex is not OperationCanceledException) { this._logger.LogError(ex, "Error in UploadOneDriveFile."); @@ -477,9 +477,9 @@ await response return response; } - catch (OnedriveforbusinessConnectorException ex) + catch (ConnectorException ex) { - this._logger.LogError(ex, "OneDrive connector error: '{StatusCode}'.", ex.StatusCode); + this._logger.LogError(ex, "OneDrive connector error: '{StatusCode}'.", ex.Status); var errorResponse = request.CreateResponse(HttpStatusCode.BadGateway); await errorResponse @@ -487,14 +487,14 @@ await errorResponse { success = false, error = ex.Message, - statusCode = ex.StatusCode, + statusCode = ex.Status, details = ex.ResponseBody }) .ConfigureAwait(continueOnCapturedContext: false); return errorResponse; } - catch (Exception ex) when (!ex.IsFatal()) + catch (Exception ex) when (ex is not OperationCanceledException) { this._logger.LogError(ex, "Error in SearchOneDriveFiles."); @@ -577,9 +577,9 @@ await response return response; } - catch (OnedriveforbusinessConnectorException ex) + catch (ConnectorException ex) { - this._logger.LogError(ex, "OneDrive connector error: '{StatusCode}'.", ex.StatusCode); + this._logger.LogError(ex, "OneDrive connector error: '{StatusCode}'.", ex.Status); var errorResponse = request.CreateResponse(HttpStatusCode.BadGateway); await errorResponse @@ -587,14 +587,14 @@ await errorResponse { success = false, error = ex.Message, - statusCode = ex.StatusCode, + statusCode = ex.Status, details = ex.ResponseBody }) .ConfigureAwait(continueOnCapturedContext: false); return errorResponse; } - catch (Exception ex) when (!ex.IsFatal()) + catch (Exception ex) when (ex is not OperationCanceledException) { this._logger.LogError(ex, "Error in CreateOneDriveShareLink."); @@ -817,7 +817,7 @@ await errorResponse return errorResponse; } - catch (Exception ex) when (!ex.IsFatal()) + catch (Exception ex) when (ex is not OperationCanceledException) { this._logger.LogError(ex, "Error in OneDriveTriggerCallback."); diff --git a/DirectConnector/Program.cs b/DirectConnector/Program.cs index e88984c..f6cdbde 100644 --- a/DirectConnector/Program.cs +++ b/DirectConnector/Program.cs @@ -2,160 +2,30 @@ // Copyright (c) Microsoft Corporation. All rights reserved. //------------------------------------------------------------ -using DirectConnector.Configuration; -using Microsoft.Azure.Connectors.DirectClient.Azureblob; -using Microsoft.Azure.Connectors.DirectClient.Azureloganalytics; -using Microsoft.Azure.Connectors.DirectClient.Mq; -using Microsoft.Azure.Connectors.DirectClient.Msgraphgroupsanduser; -using Microsoft.Azure.Connectors.DirectClient.Office365; -using Microsoft.Azure.Connectors.DirectClient.Office365users; -using Microsoft.Azure.Connectors.DirectClient.Onedriveforbusiness; -using Microsoft.Azure.Connectors.DirectClient.Sharepointonline; -using Microsoft.Azure.Connectors.DirectClient.Smtp; -using Microsoft.Azure.Connectors.DirectClient.Teams; +using Azure.Connectors.Sdk; using Microsoft.Azure.Functions.Worker; -using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Hosting; -using Microsoft.Extensions.Options; var host = new HostBuilder() .ConfigureFunctionsWorkerDefaults() .ConfigureServices((hostContext, services) => { - var configuration = hostContext.Configuration; - - // NOTE: Bind connector options from configuration. - // This uses the Options pattern for hierarchical, validated configuration. - // See: https://learn.microsoft.com/dotnet/core/extensions/options - services.AddOptions() - .Bind(configuration.GetSection(ConnectorOptions.SectionName)) - .ValidateDataAnnotations() - .ValidateOnStart(); - - services.AddHttpClient(); + var connectors = hostContext.Configuration.GetSection("Connectors"); // NOTE: Register generated connector clients as singletons. - // The factory overload lets DI own the instance lifetime and call Dispose, - // which exercises the ownership-based disposal pattern: the client will - // dispose its internally-created HttpClient and DefaultAzureCredential. - // NOTE: Validation of ConnectionRuntimeUrl is handled by - // [Required] attribute + ValidateOnStart() at host initialization. - services.AddSingleton(serviceProvider => - { - var options = serviceProvider.GetRequiredService>().Value; - - // NOTE: When ManagedIdentityClientId is null, use the default constructor so - // the client relies on DefaultAzureCredential. When ManagedIdentityClientId is non-null - // (empty string = system-assigned MSI, non-empty = user-assigned MSI), use the MSI constructor. - return options.Office365.ManagedIdentityClientId != null - ? new Office365Client( - options.Office365.ConnectionRuntimeUrl, - options.Office365.ManagedIdentityClientId) - : new Office365Client(options.Office365.ConnectionRuntimeUrl); - }); - - services.AddSingleton(serviceProvider => - { - var options = serviceProvider.GetRequiredService>().Value; - - // NOTE: When ManagedIdentityClientId is null, use the default constructor so - // the client relies on DefaultAzureCredential. When ManagedIdentityClientId is non-null - // (empty string = system-assigned MSI, non-empty = user-assigned MSI), use the MSI constructor. - return options.SharePoint.ManagedIdentityClientId != null - ? new SharepointonlineClient( - options.SharePoint.ConnectionRuntimeUrl, - options.SharePoint.ManagedIdentityClientId) - : new SharepointonlineClient(options.SharePoint.ConnectionRuntimeUrl); - }); - - services.AddSingleton(serviceProvider => - { - var options = serviceProvider.GetRequiredService>().Value; - - return options.Teams.ManagedIdentityClientId != null - ? new TeamsClient( - options.Teams.ConnectionRuntimeUrl, - options.Teams.ManagedIdentityClientId) - : new TeamsClient(options.Teams.ConnectionRuntimeUrl); - }); - - services.AddSingleton(serviceProvider => - { - var options = serviceProvider.GetRequiredService>().Value; - - return options.OneDrive.ManagedIdentityClientId != null - ? new OnedriveforbusinessClient( - options.OneDrive.ConnectionRuntimeUrl, - options.OneDrive.ManagedIdentityClientId) - : new OnedriveforbusinessClient(options.OneDrive.ConnectionRuntimeUrl); - }); - - services.AddSingleton(serviceProvider => - { - var options = serviceProvider.GetRequiredService>().Value; - - return options.MsGraph.ManagedIdentityClientId != null - ? new MsgraphgroupsanduserClient( - options.MsGraph.ConnectionRuntimeUrl, - options.MsGraph.ManagedIdentityClientId) - : new MsgraphgroupsanduserClient(options.MsGraph.ConnectionRuntimeUrl); - }); - - services.AddSingleton(serviceProvider => - { - var options = serviceProvider.GetRequiredService>().Value; - - return options.AzureBlob.ManagedIdentityClientId != null - ? new AzureblobClient( - options.AzureBlob.ConnectionRuntimeUrl, - options.AzureBlob.ManagedIdentityClientId) - : new AzureblobClient(options.AzureBlob.ConnectionRuntimeUrl); - }); - - services.AddSingleton(serviceProvider => - { - var options = serviceProvider.GetRequiredService>().Value; - - return options.Smtp.ManagedIdentityClientId != null - ? new SmtpClient( - options.Smtp.ConnectionRuntimeUrl, - options.Smtp.ManagedIdentityClientId) - : new SmtpClient(options.Smtp.ConnectionRuntimeUrl); - }); - - services.AddSingleton(serviceProvider => - { - var options = serviceProvider.GetRequiredService>().Value; - - return options.Mq.ManagedIdentityClientId != null - ? new MqClient( - options.Mq.ConnectionRuntimeUrl, - options.Mq.ManagedIdentityClientId) - : new MqClient(options.Mq.ConnectionRuntimeUrl); - }); - - services.AddSingleton(serviceProvider => - { - var options = serviceProvider.GetRequiredService>().Value; - - return options.Office365Users.ManagedIdentityClientId != null - ? new Office365usersClient( - options.Office365Users.ConnectionRuntimeUrl, - options.Office365Users.ManagedIdentityClientId) - : new Office365usersClient(options.Office365Users.ConnectionRuntimeUrl); - }); - - services.AddSingleton(serviceProvider => - { - var options = serviceProvider.GetRequiredService>().Value; - - return options.AzureLogAnalytics.ManagedIdentityClientId != null - ? new AzureloganalyticsClient( - options.AzureLogAnalytics.ConnectionRuntimeUrl, - options.AzureLogAnalytics.ManagedIdentityClientId) - : new AzureloganalyticsClient(options.AzureLogAnalytics.ConnectionRuntimeUrl); - }); + // Each extension method reads ConnectionRuntimeUrl (required) and + // ManagedIdentityClientId (optional) from the configuration section. + services + .AddOffice365Client(connectors.GetSection("Office365")) + .AddSharepointonlineClient(connectors.GetSection("SharePoint")) + .AddTeamsClient(connectors.GetSection("Teams")) + .AddOnedriveforbusinessClient(connectors.GetSection("OneDrive")) + .AddMsgraphgroupsanduserClient(connectors.GetSection("MsGraph")) + .AddAzureblobClient(connectors.GetSection("AzureBlob")) + .AddSmtpClient(connectors.GetSection("Smtp")) + .AddMqClient(connectors.GetSection("Mq")) + .AddOffice365usersClient(connectors.GetSection("Office365Users")); }) .Build(); diff --git a/DirectConnector/SmtpFunctions.cs b/DirectConnector/SmtpFunctions.cs index d84a1ce..a896a06 100644 --- a/DirectConnector/SmtpFunctions.cs +++ b/DirectConnector/SmtpFunctions.cs @@ -4,8 +4,8 @@ using System.Net; using System.Text.Json; -using Microsoft.Azure.Connectors.DirectClient.Smtp; -using Microsoft.Azure.Connectors.Sdk; +using Azure.Connectors.Sdk; +using Azure.Connectors.Sdk.Smtp; using Microsoft.Azure.Functions.Worker; using Microsoft.Azure.Functions.Worker.Http; using Microsoft.Extensions.Logging; @@ -91,9 +91,9 @@ await response return response; } - catch (SmtpConnectorException ex) + catch (ConnectorException ex) { - this._logger.LogError(ex, "SMTP connector error: '{StatusCode}'.", ex.StatusCode); + this._logger.LogError(ex, "SMTP connector error: '{StatusCode}'.", ex.Status); var errorResponse = request.CreateResponse(HttpStatusCode.BadGateway); await errorResponse @@ -101,7 +101,7 @@ await errorResponse { success = false, error = ex.Message, - statusCode = ex.StatusCode, + statusCode = ex.Status, details = ex.ResponseBody }, cancellationToken) .ConfigureAwait(continueOnCapturedContext: false); @@ -119,7 +119,7 @@ await badRequest return badRequest; } - catch (Exception ex) when (!ex.IsFatal()) + catch (Exception ex) when (ex is not OperationCanceledException) { this._logger.LogError(ex, "Error in SmtpSendEmail.");