From 91b6252b9968cead04e9daba5c8381a9636b0d5a Mon Sep 17 00:00:00 2001 From: hamzaalqurneh Date: Mon, 6 Apr 2026 16:53:40 +0300 Subject: [PATCH] Refactor native adapter interfaces and update service registrations for mappers --- .../Domain/Subscription/Schedule.cs | 10 +++---- .../Services/NativeAdapterDiscoveryService.cs | 29 ++++++++++++++----- SW.Bitween.Api/Services/XchangeService.cs | 6 ++-- SW.Bitween.NativeAdapters/Interfaces.cs | 7 +++-- .../JsonMapper/NativeJSONMapper.cs | 2 +- .../JsonMapper/ScribanJsonHelper.cs | 2 +- .../ServiceCollectionExtensions.cs | 2 +- 7 files changed, 36 insertions(+), 22 deletions(-) diff --git a/SW.Bitween.Api/Domain/Subscription/Schedule.cs b/SW.Bitween.Api/Domain/Subscription/Schedule.cs index 85afe535..fe4909db 100644 --- a/SW.Bitween.Api/Domain/Subscription/Schedule.cs +++ b/SW.Bitween.Api/Domain/Subscription/Schedule.cs @@ -18,20 +18,20 @@ public Schedule(Recurrence recurrence, TimeSpan on, bool backwards = false) switch (Recurrence) { case Recurrence.Hourly: - if (on.TotalHours >= 1) throw new BitweenException(); + if (on.TotalHours >= 1) throw new BitweenException("Invalid hourly schedule"); break; case Recurrence.Daily: - if (on.TotalDays >= 1) throw new BitweenException(); + if (on.TotalDays >= 1) throw new BitweenException("Invalid daily schedule"); break; case Recurrence.Weekly: - if (on.TotalDays >= 7) throw new BitweenException(); + if (on.TotalDays >= 7) throw new BitweenException("Invalid weekly schedule"); break; case Recurrence.Monthly: - if (on.TotalDays >= 28) throw new BitweenException(); - if (on.Days < 1) throw new BitweenException(); + if (on.TotalDays >= 28) throw new BitweenException("Invalid monthly schedule"); + if (on.Days < 1) throw new BitweenException("Invalid monthly schedule"); break; //default: diff --git a/SW.Bitween.Api/Services/NativeAdapterDiscoveryService.cs b/SW.Bitween.Api/Services/NativeAdapterDiscoveryService.cs index a737a011..6aa61e02 100644 --- a/SW.Bitween.Api/Services/NativeAdapterDiscoveryService.cs +++ b/SW.Bitween.Api/Services/NativeAdapterDiscoveryService.cs @@ -9,6 +9,7 @@ namespace SW.Bitween { public class NativeAdapterDiscoveryService( IEnumerable nativeHandlers, + IEnumerable nativeMappers, IEnumerable nativeReceivers, IEnumerable nativeValidators, IEnumerable nativeAdapters) @@ -17,11 +18,11 @@ public class NativeAdapterDiscoveryService( public Dictionary GetExpectedStartupValues(string adapterId) { var result = new Dictionary(); - + var adapter = nativeAdapters.FirstOrDefault(a => a.GetType().Name.Equals(adapterId, StringComparison.OrdinalIgnoreCase)); if (adapter == null) return result; - + var properties = adapter.StartupValuesType.GetProperties(BindingFlags.Public | BindingFlags.Instance); foreach (var prop in properties) @@ -43,7 +44,7 @@ public Dictionary GetExpectedStartupValues(string adapterId) return result; } - + public INativeInfolinkHandler GetNativeHandler(string adapterId, Dictionary settings) { @@ -57,6 +58,18 @@ public INativeInfolinkHandler GetNativeHandler(string adapterId, Dictionary settings) + { + var result = + nativeMappers.FirstOrDefault(a => a.GetType().Name.Equals(adapterId, StringComparison.OrdinalIgnoreCase)); + if (result != null) + { + result.InitializeStartupValues(settings); + } + + return result; + } + public INativeInfolinkReceiver GetNativeReceiver(string adapterId, IDictionary settings) { var result = @@ -80,11 +93,11 @@ public INativeInfolinkValidator GetNativeValidator(string adapterId, IDictionary return result; } - + public List GetNativeAdapters(string? type) { List adapters; - + switch (type?.ToLower()) { case "handlers": @@ -97,15 +110,15 @@ public List GetNativeAdapters(string? type) adapters = nativeValidators.Cast().ToList(); break; case "mappers": - adapters = nativeHandlers.Cast().ToList(); + adapters = nativeMappers.Cast().ToList(); break; - case null: + case null: adapters = nativeAdapters.ToList(); break; default: return new List(); } - + return adapters.Select(a => a.GetType().Name).ToList(); } private string? GetDefaultValue(PropertyInfo property) diff --git a/SW.Bitween.Api/Services/XchangeService.cs b/SW.Bitween.Api/Services/XchangeService.cs index 31c4d2bc..bdfae9b8 100644 --- a/SW.Bitween.Api/Services/XchangeService.cs +++ b/SW.Bitween.Api/Services/XchangeService.cs @@ -138,7 +138,7 @@ private async Task RunMapper(Xchange xchange, XchangeFile xchangeFi // Check if it's a native adapter if (xchange.MapperId.StartsWith(NativeAdapterDiscoveryService.NativePrefix, StringComparison.OrdinalIgnoreCase)) { - var handler = _nativeAdapterDiscovery.GetNativeHandler(xchange.MapperId, mapperProperties); + var handler = _nativeAdapterDiscovery.GetNativeMapper(xchange.MapperId, mapperProperties); xchangeFile = await handler.Handle(xchangeFile); } else @@ -168,7 +168,7 @@ public async Task RunValidator(string validatorId, IDictionary p if (validatorId.StartsWith(NativeAdapterDiscoveryService.NativePrefix, StringComparison.OrdinalIgnoreCase)) { var validator = _nativeAdapterDiscovery.GetNativeValidator(validatorId, properties); - + result = await validator.Validate(xchangeFile); } else @@ -456,7 +456,7 @@ private async Task NotifyResult(Notifier notifier, XchangeResult xchangeResult, // Check if it's a native adapter if (notifier.HandlerId.StartsWith(NativeAdapterDiscoveryService.NativePrefix, StringComparison.OrdinalIgnoreCase)) { - var handler = _nativeAdapterDiscovery.GetNativeHandler(notifier.HandlerId, handlerProperties); + var handler = _nativeAdapterDiscovery.GetNativeHandler(notifier.HandlerId, handlerProperties); await handler.Handle(new XchangeFile(JsonConvert.SerializeObject(notificationData), xchangeResult.Id)); } else diff --git a/SW.Bitween.NativeAdapters/Interfaces.cs b/SW.Bitween.NativeAdapters/Interfaces.cs index d3a8b87d..b03f2083 100644 --- a/SW.Bitween.NativeAdapters/Interfaces.cs +++ b/SW.Bitween.NativeAdapters/Interfaces.cs @@ -9,6 +9,7 @@ public interface INativeAdapter public Type StartupValuesType { get; } } -public interface INativeInfolinkHandler : INativeAdapter,IInfolinkHandler { } -public interface INativeInfolinkValidator: IInfolinkValidator,INativeAdapter{} -public interface INativeInfolinkReceiver: IInfolinkReceiver,INativeAdapter{} +public interface INativeInfolinkHandler : INativeAdapter, IInfolinkHandler { } +public interface INativeInfolinkMapper : INativeAdapter, IInfolinkHandler { } +public interface INativeInfolinkValidator : IInfolinkValidator, INativeAdapter { } +public interface INativeInfolinkReceiver : IInfolinkReceiver, INativeAdapter { } diff --git a/SW.Bitween.NativeAdapters/JsonMapper/NativeJSONMapper.cs b/SW.Bitween.NativeAdapters/JsonMapper/NativeJSONMapper.cs index f87b073d..b03f66bb 100644 --- a/SW.Bitween.NativeAdapters/JsonMapper/NativeJSONMapper.cs +++ b/SW.Bitween.NativeAdapters/JsonMapper/NativeJSONMapper.cs @@ -3,7 +3,7 @@ namespace SW.Bitween.NativeAdapters; -public class NativeJSONMapper : INativeInfolinkHandler +public class NativeJSONMapper : INativeInfolinkMapper { public string Name => "NativeJSONMapper"; public Type StartupValuesType => typeof(JsonMapperInput); diff --git a/SW.Bitween.NativeAdapters/JsonMapper/ScribanJsonHelper.cs b/SW.Bitween.NativeAdapters/JsonMapper/ScribanJsonHelper.cs index 01cdfc98..2fc545f2 100644 --- a/SW.Bitween.NativeAdapters/JsonMapper/ScribanJsonHelper.cs +++ b/SW.Bitween.NativeAdapters/JsonMapper/ScribanJsonHelper.cs @@ -10,7 +10,7 @@ public static class ScribanJsonHelper { /// /// Renders a Scriban template against the provided input JSON and returns the mapped output JSON. - /// + /// ` public static string Render(string scribanTemplate, string inputJson) { // 1. Parse input JSON diff --git a/SW.Bitween.NativeAdapters/ServiceCollectionExtensions.cs b/SW.Bitween.NativeAdapters/ServiceCollectionExtensions.cs index a4250185..bb0e9883 100644 --- a/SW.Bitween.NativeAdapters/ServiceCollectionExtensions.cs +++ b/SW.Bitween.NativeAdapters/ServiceCollectionExtensions.cs @@ -25,7 +25,7 @@ public static void AddNativeAdapters(this IServiceCollection serviceCollection) serviceCollection.AddScoped(); serviceCollection.AddScoped(); - serviceCollection.AddScoped(); + serviceCollection.AddScoped(); serviceCollection.AddScoped(); serviceCollection.AddScoped();