using Microsoft.Extensions.Logging; using Dapr.Client; using MaksIT.Results; using MaksIT.Core.Extensions; namespace MaksIT.Dapr.Services; /// /// Dapr output bindings with outcomes. /// public interface IDaprBindingService { /// /// Invokes a binding operation. /// Task InvokeAsync( string bindingName, string operation, TRequest data, IReadOnlyDictionary? metadata = null, CancellationToken cancellationToken = default); /// /// Invokes a binding operation and deserializes the response. /// Task> InvokeAsync( string bindingName, string operation, TRequest data, IReadOnlyDictionary? metadata = null, CancellationToken cancellationToken = default); } /// /// Default . /// public class DaprBindingService( ILogger logger, DaprClient client ) : IDaprBindingService { private const string ErrorMessage = "MaksIT.Dapr - Binding error"; /// public async Task InvokeAsync( string bindingName, string operation, TRequest data, IReadOnlyDictionary? metadata = null, CancellationToken cancellationToken = default) { if (string.IsNullOrWhiteSpace(bindingName) || string.IsNullOrWhiteSpace(operation)) return Result.BadRequest("bindingName and operation are required."); try { await client.InvokeBindingAsync(bindingName, operation, data, metadata, cancellationToken); return Result.Ok(); } catch (OperationCanceledException) { throw; } catch (Exception ex) { logger.LogError(ex, ErrorMessage); return Result.InternalServerError([ErrorMessage, .. ex.ExtractMessages()]); } } /// public async Task> InvokeAsync( string bindingName, string operation, TRequest data, IReadOnlyDictionary? metadata = null, CancellationToken cancellationToken = default) { if (string.IsNullOrWhiteSpace(bindingName) || string.IsNullOrWhiteSpace(operation)) return Result.BadRequest(default, "bindingName and operation are required."); try { var response = await client.InvokeBindingAsync(bindingName, operation, data, metadata, cancellationToken); return Result.Ok(response); } catch (OperationCanceledException) { throw; } catch (Exception ex) { logger.LogError(ex, ErrorMessage); return Result.InternalServerError(default, [ErrorMessage, .. ex.ExtractMessages()]); } } }