From 97b5ef43192f2a53ffb695ae94c8531532e2a963 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jos=C3=A9=20Ren=C3=A9=20White=20Enciso?= Date: Sun, 22 Feb 2026 15:15:59 -0600 Subject: [PATCH] feat(blueprint-platform): add runtime infrastructure wiring --- src/Core.Blueprint.Common/Class1.cs | 6 --- .../Core.Blueprint.Common.csproj | 4 ++ ...printRuntimeServiceCollectionExtensions.cs | 27 ++++++++++ .../Runtime/BlueprintCorrelationId.cs | 24 +++++++++ .../Runtime/BlueprintSystemClock.cs | 10 ++++ .../Health/BlueprintRuntimeHealthCheck.cs | 28 +++++++++++ .../Runtime/IBlueprintSystemClock.cs | 12 +++++ src/Core.Blueprint.KeyVault/Class1.cs | 5 -- ...rintKeyVaultServiceCollectionExtensions.cs | 38 ++++++++++++++ .../BlueprintKeyVaultRuntimeSettings.cs | 7 +++ src/Core.Blueprint.Logging/Class1.cs | 5 -- ...printLoggingServiceCollectionExtensions.cs | 38 ++++++++++++++ .../BlueprintLoggingRuntimeSettings.cs | 7 +++ src/Core.Blueprint.Mongo/Class1.cs | 5 -- ...ueprintMongoServiceCollectionExtensions.cs | 38 ++++++++++++++ .../Runtime/BlueprintMongoRuntimeSettings.cs | 7 +++ src/Core.Blueprint.Redis/Class1.cs | 5 -- ...ueprintRedisServiceCollectionExtensions.cs | 38 ++++++++++++++ .../Runtime/BlueprintRedisRuntimeSettings.cs | 7 +++ src/Core.Blueprint.SQLServer/Class1.cs | 5 -- ...intSqlServerServiceCollectionExtensions.cs | 38 ++++++++++++++ .../BlueprintSqlServerRuntimeSettings.cs | 7 +++ src/Core.Blueprint.Storage/Class1.cs | 5 -- ...printStorageServiceCollectionExtensions.cs | 38 ++++++++++++++ .../BlueprintStorageRuntimeSettings.cs | 7 +++ .../BlueprintRuntimeTests.cs | 50 +++++++++++++++++++ .../Core.Blueprint.Common.UnitTests.csproj | 3 +- .../UnitTest1.cs | 10 ---- .../Core.Blueprint.KeyVault.UnitTests.csproj | 1 + .../UnitTest1.cs | 14 +++++- .../Core.Blueprint.Logging.UnitTests.csproj | 1 + .../UnitTest1.cs | 14 +++++- .../Core.Blueprint.Mongo.UnitTests.csproj | 1 + .../UnitTest1.cs | 14 +++++- .../Core.Blueprint.Redis.UnitTests.csproj | 1 + .../UnitTest1.cs | 14 +++++- .../Core.Blueprint.SQLServer.UnitTests.csproj | 1 + .../UnitTest1.cs | 14 +++++- .../Core.Blueprint.Storage.UnitTests.csproj | 1 + .../UnitTest1.cs | 14 +++++- 40 files changed, 511 insertions(+), 53 deletions(-) delete mode 100644 src/Core.Blueprint.Common/Class1.cs create mode 100644 src/Core.Blueprint.Common/DependencyInjection/BlueprintRuntimeServiceCollectionExtensions.cs create mode 100644 src/Core.Blueprint.Common/Runtime/BlueprintCorrelationId.cs create mode 100644 src/Core.Blueprint.Common/Runtime/BlueprintSystemClock.cs create mode 100644 src/Core.Blueprint.Common/Runtime/Health/BlueprintRuntimeHealthCheck.cs create mode 100644 src/Core.Blueprint.Common/Runtime/IBlueprintSystemClock.cs delete mode 100644 src/Core.Blueprint.KeyVault/Class1.cs create mode 100644 src/Core.Blueprint.KeyVault/DependencyInjection/BlueprintKeyVaultServiceCollectionExtensions.cs create mode 100644 src/Core.Blueprint.KeyVault/Runtime/BlueprintKeyVaultRuntimeSettings.cs delete mode 100644 src/Core.Blueprint.Logging/Class1.cs create mode 100644 src/Core.Blueprint.Logging/DependencyInjection/BlueprintLoggingServiceCollectionExtensions.cs create mode 100644 src/Core.Blueprint.Logging/Runtime/BlueprintLoggingRuntimeSettings.cs delete mode 100644 src/Core.Blueprint.Mongo/Class1.cs create mode 100644 src/Core.Blueprint.Mongo/DependencyInjection/BlueprintMongoServiceCollectionExtensions.cs create mode 100644 src/Core.Blueprint.Mongo/Runtime/BlueprintMongoRuntimeSettings.cs delete mode 100644 src/Core.Blueprint.Redis/Class1.cs create mode 100644 src/Core.Blueprint.Redis/DependencyInjection/BlueprintRedisServiceCollectionExtensions.cs create mode 100644 src/Core.Blueprint.Redis/Runtime/BlueprintRedisRuntimeSettings.cs delete mode 100644 src/Core.Blueprint.SQLServer/Class1.cs create mode 100644 src/Core.Blueprint.SQLServer/DependencyInjection/BlueprintSqlServerServiceCollectionExtensions.cs create mode 100644 src/Core.Blueprint.SQLServer/Runtime/BlueprintSqlServerRuntimeSettings.cs delete mode 100644 src/Core.Blueprint.Storage/Class1.cs create mode 100644 src/Core.Blueprint.Storage/DependencyInjection/BlueprintStorageServiceCollectionExtensions.cs create mode 100644 src/Core.Blueprint.Storage/Runtime/BlueprintStorageRuntimeSettings.cs create mode 100644 tests/Core.Blueprint.Common.UnitTests/BlueprintRuntimeTests.cs delete mode 100644 tests/Core.Blueprint.Common.UnitTests/UnitTest1.cs diff --git a/src/Core.Blueprint.Common/Class1.cs b/src/Core.Blueprint.Common/Class1.cs deleted file mode 100644 index 737f778..0000000 --- a/src/Core.Blueprint.Common/Class1.cs +++ /dev/null @@ -1,6 +0,0 @@ -namespace Core.Blueprint.Common; - -public class Class1 -{ - -} diff --git a/src/Core.Blueprint.Common/Core.Blueprint.Common.csproj b/src/Core.Blueprint.Common/Core.Blueprint.Common.csproj index 6c3a887..c1b5d29 100644 --- a/src/Core.Blueprint.Common/Core.Blueprint.Common.csproj +++ b/src/Core.Blueprint.Common/Core.Blueprint.Common.csproj @@ -4,4 +4,8 @@ enable enable + + + + diff --git a/src/Core.Blueprint.Common/DependencyInjection/BlueprintRuntimeServiceCollectionExtensions.cs b/src/Core.Blueprint.Common/DependencyInjection/BlueprintRuntimeServiceCollectionExtensions.cs new file mode 100644 index 0000000..9beb1b3 --- /dev/null +++ b/src/Core.Blueprint.Common/DependencyInjection/BlueprintRuntimeServiceCollectionExtensions.cs @@ -0,0 +1,27 @@ +using Core.Blueprint.Common.Runtime; +using Core.Blueprint.Common.Runtime.Health; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.DependencyInjection.Extensions; +using Microsoft.Extensions.Diagnostics.HealthChecks; + +namespace Core.Blueprint.Common.DependencyInjection; + +/// +/// Registers baseline runtime services for blueprint platform consumers. +/// +public static class BlueprintRuntimeServiceCollectionExtensions +{ + /// + /// Adds blueprint runtime core services and health checks. + /// + /// Service collection. + /// Service collection for fluent chaining. + public static IServiceCollection AddBlueprintRuntimeCore(this IServiceCollection services) + { + services.TryAddSingleton(); + services.TryAddEnumerable( + ServiceDescriptor.Singleton()); + + return services; + } +} diff --git a/src/Core.Blueprint.Common/Runtime/BlueprintCorrelationId.cs b/src/Core.Blueprint.Common/Runtime/BlueprintCorrelationId.cs new file mode 100644 index 0000000..56bad28 --- /dev/null +++ b/src/Core.Blueprint.Common/Runtime/BlueprintCorrelationId.cs @@ -0,0 +1,24 @@ +namespace Core.Blueprint.Common.Runtime; + +/// +/// Represents a correlation identifier used for cross-layer request tracing. +/// +/// Correlation identifier value. +public readonly record struct BlueprintCorrelationId(string Value) +{ + /// + /// Creates a correlation identifier from incoming value or runtime clock fallback. + /// + /// Incoming correlation identifier. + /// Runtime system clock for fallback generation. + /// Normalized correlation identifier. + public static BlueprintCorrelationId Create(string? incomingValue, IBlueprintSystemClock clock) + { + if (!string.IsNullOrWhiteSpace(incomingValue)) + { + return new BlueprintCorrelationId(incomingValue.Trim()); + } + + return new BlueprintCorrelationId($"corr-{clock.UtcNow:yyyyMMddHHmmssfff}"); + } +} diff --git a/src/Core.Blueprint.Common/Runtime/BlueprintSystemClock.cs b/src/Core.Blueprint.Common/Runtime/BlueprintSystemClock.cs new file mode 100644 index 0000000..1c88c10 --- /dev/null +++ b/src/Core.Blueprint.Common/Runtime/BlueprintSystemClock.cs @@ -0,0 +1,10 @@ +namespace Core.Blueprint.Common.Runtime; + +/// +/// Default runtime system clock implementation. +/// +public sealed class BlueprintSystemClock : IBlueprintSystemClock +{ + /// + public DateTimeOffset UtcNow => DateTimeOffset.UtcNow; +} diff --git a/src/Core.Blueprint.Common/Runtime/Health/BlueprintRuntimeHealthCheck.cs b/src/Core.Blueprint.Common/Runtime/Health/BlueprintRuntimeHealthCheck.cs new file mode 100644 index 0000000..e4cdb6c --- /dev/null +++ b/src/Core.Blueprint.Common/Runtime/Health/BlueprintRuntimeHealthCheck.cs @@ -0,0 +1,28 @@ +using Microsoft.Extensions.Diagnostics.HealthChecks; + +namespace Core.Blueprint.Common.Runtime.Health; + +/// +/// Health check for baseline blueprint runtime dependencies. +/// +public sealed class BlueprintRuntimeHealthCheck(IBlueprintSystemClock clock) : IHealthCheck +{ + /// + /// Executes runtime health probe. + /// + /// Health check context. + /// Cancellation token. + /// Healthy runtime status result. + public Task CheckHealthAsync( + HealthCheckContext context, + CancellationToken cancellationToken = default) + { + var data = new Dictionary + { + ["checkedAtUtc"] = clock.UtcNow, + ["component"] = context.Registration.Name + }; + + return Task.FromResult(HealthCheckResult.Healthy("Blueprint runtime registered.", data)); + } +} diff --git a/src/Core.Blueprint.Common/Runtime/IBlueprintSystemClock.cs b/src/Core.Blueprint.Common/Runtime/IBlueprintSystemClock.cs new file mode 100644 index 0000000..4b70a5a --- /dev/null +++ b/src/Core.Blueprint.Common/Runtime/IBlueprintSystemClock.cs @@ -0,0 +1,12 @@ +namespace Core.Blueprint.Common.Runtime; + +/// +/// Provides transport-neutral UTC time for runtime components. +/// +public interface IBlueprintSystemClock +{ + /// + /// Gets current UTC timestamp. + /// + DateTimeOffset UtcNow { get; } +} diff --git a/src/Core.Blueprint.KeyVault/Class1.cs b/src/Core.Blueprint.KeyVault/Class1.cs deleted file mode 100644 index f74f0fb..0000000 --- a/src/Core.Blueprint.KeyVault/Class1.cs +++ /dev/null @@ -1,5 +0,0 @@ -namespace Core.Blueprint.KeyVault; - -public class Class1 -{ -} diff --git a/src/Core.Blueprint.KeyVault/DependencyInjection/BlueprintKeyVaultServiceCollectionExtensions.cs b/src/Core.Blueprint.KeyVault/DependencyInjection/BlueprintKeyVaultServiceCollectionExtensions.cs new file mode 100644 index 0000000..b5ea549 --- /dev/null +++ b/src/Core.Blueprint.KeyVault/DependencyInjection/BlueprintKeyVaultServiceCollectionExtensions.cs @@ -0,0 +1,38 @@ +using Core.Blueprint.Common.DependencyInjection; +using Core.Blueprint.KeyVault.Runtime; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.DependencyInjection.Extensions; + +namespace Core.Blueprint.KeyVault.DependencyInjection; + +/// +/// Registers runtime key vault integration defaults for blueprint consumers. +/// +public static class BlueprintKeyVaultServiceCollectionExtensions +{ + /// + /// Adds key vault runtime settings and baseline runtime services. + /// + /// Service collection. + /// Target key vault name. + /// Service collection for fluent chaining. + public static IServiceCollection AddBlueprintKeyVaultModule( + this IServiceCollection services, + string vaultName = "default-vault") + { + services.AddBlueprintRuntimeCore(); + services.TryAddSingleton(new BlueprintKeyVaultRuntimeSettings(ResolveVaultName(vaultName))); + + return services; + } + + private static string ResolveVaultName(string vaultName) + { + if (!string.IsNullOrWhiteSpace(vaultName)) + { + return vaultName; + } + + return "default-vault"; + } +} diff --git a/src/Core.Blueprint.KeyVault/Runtime/BlueprintKeyVaultRuntimeSettings.cs b/src/Core.Blueprint.KeyVault/Runtime/BlueprintKeyVaultRuntimeSettings.cs new file mode 100644 index 0000000..4e7afff --- /dev/null +++ b/src/Core.Blueprint.KeyVault/Runtime/BlueprintKeyVaultRuntimeSettings.cs @@ -0,0 +1,7 @@ +namespace Core.Blueprint.KeyVault.Runtime; + +/// +/// Defines runtime settings for key vault integration helpers. +/// +/// Target key vault name. +public sealed record BlueprintKeyVaultRuntimeSettings(string VaultName); diff --git a/src/Core.Blueprint.Logging/Class1.cs b/src/Core.Blueprint.Logging/Class1.cs deleted file mode 100644 index c75e4bb..0000000 --- a/src/Core.Blueprint.Logging/Class1.cs +++ /dev/null @@ -1,5 +0,0 @@ -namespace Core.Blueprint.Logging; - -public class Class1 -{ -} diff --git a/src/Core.Blueprint.Logging/DependencyInjection/BlueprintLoggingServiceCollectionExtensions.cs b/src/Core.Blueprint.Logging/DependencyInjection/BlueprintLoggingServiceCollectionExtensions.cs new file mode 100644 index 0000000..1544dad --- /dev/null +++ b/src/Core.Blueprint.Logging/DependencyInjection/BlueprintLoggingServiceCollectionExtensions.cs @@ -0,0 +1,38 @@ +using Core.Blueprint.Common.DependencyInjection; +using Core.Blueprint.Logging.Runtime; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.DependencyInjection.Extensions; + +namespace Core.Blueprint.Logging.DependencyInjection; + +/// +/// Registers runtime logging defaults for blueprint consumers. +/// +public static class BlueprintLoggingServiceCollectionExtensions +{ + /// + /// Adds blueprint logging runtime settings and baseline runtime services. + /// + /// Service collection. + /// Logging category prefix. + /// Service collection for fluent chaining. + public static IServiceCollection AddBlueprintLoggingModule( + this IServiceCollection services, + string categoryPrefix = "AgileWebs") + { + services.AddBlueprintRuntimeCore(); + services.TryAddSingleton(new BlueprintLoggingRuntimeSettings(ResolveCategoryPrefix(categoryPrefix))); + + return services; + } + + private static string ResolveCategoryPrefix(string categoryPrefix) + { + if (!string.IsNullOrWhiteSpace(categoryPrefix)) + { + return categoryPrefix; + } + + return "AgileWebs"; + } +} diff --git a/src/Core.Blueprint.Logging/Runtime/BlueprintLoggingRuntimeSettings.cs b/src/Core.Blueprint.Logging/Runtime/BlueprintLoggingRuntimeSettings.cs new file mode 100644 index 0000000..c84707c --- /dev/null +++ b/src/Core.Blueprint.Logging/Runtime/BlueprintLoggingRuntimeSettings.cs @@ -0,0 +1,7 @@ +namespace Core.Blueprint.Logging.Runtime; + +/// +/// Defines runtime settings for blueprint logging defaults. +/// +/// Category prefix used by logging pipelines. +public sealed record BlueprintLoggingRuntimeSettings(string CategoryPrefix); diff --git a/src/Core.Blueprint.Mongo/Class1.cs b/src/Core.Blueprint.Mongo/Class1.cs deleted file mode 100644 index 330b480..0000000 --- a/src/Core.Blueprint.Mongo/Class1.cs +++ /dev/null @@ -1,5 +0,0 @@ -namespace Core.Blueprint.Mongo; - -public class Class1 -{ -} diff --git a/src/Core.Blueprint.Mongo/DependencyInjection/BlueprintMongoServiceCollectionExtensions.cs b/src/Core.Blueprint.Mongo/DependencyInjection/BlueprintMongoServiceCollectionExtensions.cs new file mode 100644 index 0000000..84b16bb --- /dev/null +++ b/src/Core.Blueprint.Mongo/DependencyInjection/BlueprintMongoServiceCollectionExtensions.cs @@ -0,0 +1,38 @@ +using Core.Blueprint.Common.DependencyInjection; +using Core.Blueprint.Mongo.Runtime; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.DependencyInjection.Extensions; + +namespace Core.Blueprint.Mongo.DependencyInjection; + +/// +/// Registers runtime mongo integration defaults for blueprint consumers. +/// +public static class BlueprintMongoServiceCollectionExtensions +{ + /// + /// Adds mongo runtime settings and baseline runtime services. + /// + /// Service collection. + /// Target mongo database name. + /// Service collection for fluent chaining. + public static IServiceCollection AddBlueprintMongoModule( + this IServiceCollection services, + string databaseName = "agilewebs") + { + services.AddBlueprintRuntimeCore(); + services.TryAddSingleton(new BlueprintMongoRuntimeSettings(ResolveDatabaseName(databaseName))); + + return services; + } + + private static string ResolveDatabaseName(string databaseName) + { + if (!string.IsNullOrWhiteSpace(databaseName)) + { + return databaseName; + } + + return "agilewebs"; + } +} diff --git a/src/Core.Blueprint.Mongo/Runtime/BlueprintMongoRuntimeSettings.cs b/src/Core.Blueprint.Mongo/Runtime/BlueprintMongoRuntimeSettings.cs new file mode 100644 index 0000000..b6d3093 --- /dev/null +++ b/src/Core.Blueprint.Mongo/Runtime/BlueprintMongoRuntimeSettings.cs @@ -0,0 +1,7 @@ +namespace Core.Blueprint.Mongo.Runtime; + +/// +/// Defines runtime settings for mongo integration helpers. +/// +/// Target mongo database name. +public sealed record BlueprintMongoRuntimeSettings(string DatabaseName); diff --git a/src/Core.Blueprint.Redis/Class1.cs b/src/Core.Blueprint.Redis/Class1.cs deleted file mode 100644 index 58c8ab0..0000000 --- a/src/Core.Blueprint.Redis/Class1.cs +++ /dev/null @@ -1,5 +0,0 @@ -namespace Core.Blueprint.Redis; - -public class Class1 -{ -} diff --git a/src/Core.Blueprint.Redis/DependencyInjection/BlueprintRedisServiceCollectionExtensions.cs b/src/Core.Blueprint.Redis/DependencyInjection/BlueprintRedisServiceCollectionExtensions.cs new file mode 100644 index 0000000..9cf9eee --- /dev/null +++ b/src/Core.Blueprint.Redis/DependencyInjection/BlueprintRedisServiceCollectionExtensions.cs @@ -0,0 +1,38 @@ +using Core.Blueprint.Common.DependencyInjection; +using Core.Blueprint.Redis.Runtime; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.DependencyInjection.Extensions; + +namespace Core.Blueprint.Redis.DependencyInjection; + +/// +/// Registers runtime redis integration defaults for blueprint consumers. +/// +public static class BlueprintRedisServiceCollectionExtensions +{ + /// + /// Adds redis runtime settings and baseline runtime services. + /// + /// Service collection. + /// Redis key prefix. + /// Service collection for fluent chaining. + public static IServiceCollection AddBlueprintRedisModule( + this IServiceCollection services, + string keyPrefix = "agilewebs:") + { + services.AddBlueprintRuntimeCore(); + services.TryAddSingleton(new BlueprintRedisRuntimeSettings(ResolveKeyPrefix(keyPrefix))); + + return services; + } + + private static string ResolveKeyPrefix(string keyPrefix) + { + if (!string.IsNullOrWhiteSpace(keyPrefix)) + { + return keyPrefix; + } + + return "agilewebs:"; + } +} diff --git a/src/Core.Blueprint.Redis/Runtime/BlueprintRedisRuntimeSettings.cs b/src/Core.Blueprint.Redis/Runtime/BlueprintRedisRuntimeSettings.cs new file mode 100644 index 0000000..d0d7510 --- /dev/null +++ b/src/Core.Blueprint.Redis/Runtime/BlueprintRedisRuntimeSettings.cs @@ -0,0 +1,7 @@ +namespace Core.Blueprint.Redis.Runtime; + +/// +/// Defines runtime settings for redis integration helpers. +/// +/// Redis key prefix used by platform components. +public sealed record BlueprintRedisRuntimeSettings(string KeyPrefix); diff --git a/src/Core.Blueprint.SQLServer/Class1.cs b/src/Core.Blueprint.SQLServer/Class1.cs deleted file mode 100644 index da888e9..0000000 --- a/src/Core.Blueprint.SQLServer/Class1.cs +++ /dev/null @@ -1,5 +0,0 @@ -namespace Core.Blueprint.SQLServer; - -public class Class1 -{ -} diff --git a/src/Core.Blueprint.SQLServer/DependencyInjection/BlueprintSqlServerServiceCollectionExtensions.cs b/src/Core.Blueprint.SQLServer/DependencyInjection/BlueprintSqlServerServiceCollectionExtensions.cs new file mode 100644 index 0000000..d4d1493 --- /dev/null +++ b/src/Core.Blueprint.SQLServer/DependencyInjection/BlueprintSqlServerServiceCollectionExtensions.cs @@ -0,0 +1,38 @@ +using Core.Blueprint.Common.DependencyInjection; +using Core.Blueprint.SQLServer.Runtime; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.DependencyInjection.Extensions; + +namespace Core.Blueprint.SQLServer.DependencyInjection; + +/// +/// Registers runtime sql server integration defaults for blueprint consumers. +/// +public static class BlueprintSqlServerServiceCollectionExtensions +{ + /// + /// Adds sql server runtime settings and baseline runtime services. + /// + /// Service collection. + /// Logical connection name. + /// Service collection for fluent chaining. + public static IServiceCollection AddBlueprintSqlServerModule( + this IServiceCollection services, + string connectionName = "DefaultConnection") + { + services.AddBlueprintRuntimeCore(); + services.TryAddSingleton(new BlueprintSqlServerRuntimeSettings(ResolveConnectionName(connectionName))); + + return services; + } + + private static string ResolveConnectionName(string connectionName) + { + if (!string.IsNullOrWhiteSpace(connectionName)) + { + return connectionName; + } + + return "DefaultConnection"; + } +} diff --git a/src/Core.Blueprint.SQLServer/Runtime/BlueprintSqlServerRuntimeSettings.cs b/src/Core.Blueprint.SQLServer/Runtime/BlueprintSqlServerRuntimeSettings.cs new file mode 100644 index 0000000..27b64e1 --- /dev/null +++ b/src/Core.Blueprint.SQLServer/Runtime/BlueprintSqlServerRuntimeSettings.cs @@ -0,0 +1,7 @@ +namespace Core.Blueprint.SQLServer.Runtime; + +/// +/// Defines runtime settings for sql server integration helpers. +/// +/// Logical connection name used by consumers. +public sealed record BlueprintSqlServerRuntimeSettings(string ConnectionName); diff --git a/src/Core.Blueprint.Storage/Class1.cs b/src/Core.Blueprint.Storage/Class1.cs deleted file mode 100644 index f9464ed..0000000 --- a/src/Core.Blueprint.Storage/Class1.cs +++ /dev/null @@ -1,5 +0,0 @@ -namespace Core.Blueprint.Storage; - -public class Class1 -{ -} diff --git a/src/Core.Blueprint.Storage/DependencyInjection/BlueprintStorageServiceCollectionExtensions.cs b/src/Core.Blueprint.Storage/DependencyInjection/BlueprintStorageServiceCollectionExtensions.cs new file mode 100644 index 0000000..82889fa --- /dev/null +++ b/src/Core.Blueprint.Storage/DependencyInjection/BlueprintStorageServiceCollectionExtensions.cs @@ -0,0 +1,38 @@ +using Core.Blueprint.Common.DependencyInjection; +using Core.Blueprint.Storage.Runtime; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.DependencyInjection.Extensions; + +namespace Core.Blueprint.Storage.DependencyInjection; + +/// +/// Registers runtime storage integration defaults for blueprint consumers. +/// +public static class BlueprintStorageServiceCollectionExtensions +{ + /// + /// Adds storage runtime settings and baseline runtime services. + /// + /// Service collection. + /// Logical storage container name. + /// Service collection for fluent chaining. + public static IServiceCollection AddBlueprintStorageModule( + this IServiceCollection services, + string containerName = "default") + { + services.AddBlueprintRuntimeCore(); + services.TryAddSingleton(new BlueprintStorageRuntimeSettings(ResolveContainerName(containerName))); + + return services; + } + + private static string ResolveContainerName(string containerName) + { + if (!string.IsNullOrWhiteSpace(containerName)) + { + return containerName; + } + + return "default"; + } +} diff --git a/src/Core.Blueprint.Storage/Runtime/BlueprintStorageRuntimeSettings.cs b/src/Core.Blueprint.Storage/Runtime/BlueprintStorageRuntimeSettings.cs new file mode 100644 index 0000000..a40a597 --- /dev/null +++ b/src/Core.Blueprint.Storage/Runtime/BlueprintStorageRuntimeSettings.cs @@ -0,0 +1,7 @@ +namespace Core.Blueprint.Storage.Runtime; + +/// +/// Defines runtime settings for storage integration helpers. +/// +/// Logical storage container name. +public sealed record BlueprintStorageRuntimeSettings(string ContainerName); diff --git a/tests/Core.Blueprint.Common.UnitTests/BlueprintRuntimeTests.cs b/tests/Core.Blueprint.Common.UnitTests/BlueprintRuntimeTests.cs new file mode 100644 index 0000000..02d087b --- /dev/null +++ b/tests/Core.Blueprint.Common.UnitTests/BlueprintRuntimeTests.cs @@ -0,0 +1,50 @@ +using Core.Blueprint.Common.Runtime; +using Core.Blueprint.Common.Runtime.Health; +using Microsoft.Extensions.Diagnostics.HealthChecks; + +namespace Core.Blueprint.Common.UnitTests; + +public class BlueprintRuntimeTests +{ + [Fact] + public void Create_WhenIncomingValueProvided_ReturnsTrimmedCorrelationId() + { + var correlationId = BlueprintCorrelationId.Create(" corr-123 ", new FakeClock()); + + Assert.Equal("corr-123", correlationId.Value); + } + + [Fact] + public void Create_WhenIncomingValueMissing_UsesClockFallback() + { + var correlationId = BlueprintCorrelationId.Create(string.Empty, new FakeClock()); + + Assert.Equal("corr-20260222120000111", correlationId.Value); + } + + [Fact] + public async Task CheckHealthAsync_WhenInvoked_ReturnsHealthyStatus() + { + var clock = new FakeClock(); + var healthCheck = new BlueprintRuntimeHealthCheck(clock); + var context = new HealthCheckContext + { + Registration = new HealthCheckRegistration( + "blueprint.runtime", + healthCheck, + failureStatus: null, + tags: []) + }; + + var result = await healthCheck.CheckHealthAsync(context); + + Assert.Equal(HealthStatus.Healthy, result.Status); + Assert.Equal(clock.UtcNow, result.Data["checkedAtUtc"]); + Assert.Equal("blueprint.runtime", result.Data["component"]); + } + + private sealed class FakeClock : IBlueprintSystemClock + { + public DateTimeOffset UtcNow => new(2026, 2, 22, 12, 0, 0, 111, TimeSpan.Zero); + } +} diff --git a/tests/Core.Blueprint.Common.UnitTests/Core.Blueprint.Common.UnitTests.csproj b/tests/Core.Blueprint.Common.UnitTests/Core.Blueprint.Common.UnitTests.csproj index efa4543..9d3e942 100644 --- a/tests/Core.Blueprint.Common.UnitTests/Core.Blueprint.Common.UnitTests.csproj +++ b/tests/Core.Blueprint.Common.UnitTests/Core.Blueprint.Common.UnitTests.csproj @@ -9,6 +9,7 @@ + @@ -22,4 +23,4 @@ - \ No newline at end of file + diff --git a/tests/Core.Blueprint.Common.UnitTests/UnitTest1.cs b/tests/Core.Blueprint.Common.UnitTests/UnitTest1.cs deleted file mode 100644 index 4d100b5..0000000 --- a/tests/Core.Blueprint.Common.UnitTests/UnitTest1.cs +++ /dev/null @@ -1,10 +0,0 @@ -namespace Core.Blueprint.Common.UnitTests; - -public class UnitTest1 -{ - [Fact] - public void Test1() - { - - } -} diff --git a/tests/Core.Blueprint.KeyVault.UnitTests/Core.Blueprint.KeyVault.UnitTests.csproj b/tests/Core.Blueprint.KeyVault.UnitTests/Core.Blueprint.KeyVault.UnitTests.csproj index 730d0b1..40c35d9 100644 --- a/tests/Core.Blueprint.KeyVault.UnitTests/Core.Blueprint.KeyVault.UnitTests.csproj +++ b/tests/Core.Blueprint.KeyVault.UnitTests/Core.Blueprint.KeyVault.UnitTests.csproj @@ -7,6 +7,7 @@ + diff --git a/tests/Core.Blueprint.KeyVault.UnitTests/UnitTest1.cs b/tests/Core.Blueprint.KeyVault.UnitTests/UnitTest1.cs index b4b7da7..11d2e17 100644 --- a/tests/Core.Blueprint.KeyVault.UnitTests/UnitTest1.cs +++ b/tests/Core.Blueprint.KeyVault.UnitTests/UnitTest1.cs @@ -1,9 +1,21 @@ +using Core.Blueprint.KeyVault.DependencyInjection; +using Core.Blueprint.KeyVault.Runtime; +using Microsoft.Extensions.DependencyInjection; + namespace Core.Blueprint.KeyVault.UnitTests; public class UnitTest1 { [Fact] - public void Test1() + public void AddBlueprintKeyVaultModule_WhenCalled_RegistersRuntimeSettings() { + var services = new ServiceCollection(); + + services.AddBlueprintKeyVaultModule("agile-vault"); + + using var provider = services.BuildServiceProvider(); + var settings = provider.GetRequiredService(); + + Assert.Equal("agile-vault", settings.VaultName); } } diff --git a/tests/Core.Blueprint.Logging.UnitTests/Core.Blueprint.Logging.UnitTests.csproj b/tests/Core.Blueprint.Logging.UnitTests/Core.Blueprint.Logging.UnitTests.csproj index eb6ec8d..7250800 100644 --- a/tests/Core.Blueprint.Logging.UnitTests/Core.Blueprint.Logging.UnitTests.csproj +++ b/tests/Core.Blueprint.Logging.UnitTests/Core.Blueprint.Logging.UnitTests.csproj @@ -7,6 +7,7 @@ + diff --git a/tests/Core.Blueprint.Logging.UnitTests/UnitTest1.cs b/tests/Core.Blueprint.Logging.UnitTests/UnitTest1.cs index fa1a986..e0f03e7 100644 --- a/tests/Core.Blueprint.Logging.UnitTests/UnitTest1.cs +++ b/tests/Core.Blueprint.Logging.UnitTests/UnitTest1.cs @@ -1,9 +1,21 @@ +using Core.Blueprint.Logging.DependencyInjection; +using Core.Blueprint.Logging.Runtime; +using Microsoft.Extensions.DependencyInjection; + namespace Core.Blueprint.Logging.UnitTests; public class UnitTest1 { [Fact] - public void Test1() + public void AddBlueprintLoggingModule_WhenCalled_RegistersRuntimeSettings() { + var services = new ServiceCollection(); + + services.AddBlueprintLoggingModule("Core"); + + using var provider = services.BuildServiceProvider(); + var settings = provider.GetRequiredService(); + + Assert.Equal("Core", settings.CategoryPrefix); } } diff --git a/tests/Core.Blueprint.Mongo.UnitTests/Core.Blueprint.Mongo.UnitTests.csproj b/tests/Core.Blueprint.Mongo.UnitTests/Core.Blueprint.Mongo.UnitTests.csproj index 4c898b9..1048616 100644 --- a/tests/Core.Blueprint.Mongo.UnitTests/Core.Blueprint.Mongo.UnitTests.csproj +++ b/tests/Core.Blueprint.Mongo.UnitTests/Core.Blueprint.Mongo.UnitTests.csproj @@ -7,6 +7,7 @@ + diff --git a/tests/Core.Blueprint.Mongo.UnitTests/UnitTest1.cs b/tests/Core.Blueprint.Mongo.UnitTests/UnitTest1.cs index 96fcb03..799236c 100644 --- a/tests/Core.Blueprint.Mongo.UnitTests/UnitTest1.cs +++ b/tests/Core.Blueprint.Mongo.UnitTests/UnitTest1.cs @@ -1,9 +1,21 @@ +using Core.Blueprint.Mongo.DependencyInjection; +using Core.Blueprint.Mongo.Runtime; +using Microsoft.Extensions.DependencyInjection; + namespace Core.Blueprint.Mongo.UnitTests; public class UnitTest1 { [Fact] - public void Test1() + public void AddBlueprintMongoModule_WhenCalled_RegistersRuntimeSettings() { + var services = new ServiceCollection(); + + services.AddBlueprintMongoModule("catalog-db"); + + using var provider = services.BuildServiceProvider(); + var settings = provider.GetRequiredService(); + + Assert.Equal("catalog-db", settings.DatabaseName); } } diff --git a/tests/Core.Blueprint.Redis.UnitTests/Core.Blueprint.Redis.UnitTests.csproj b/tests/Core.Blueprint.Redis.UnitTests/Core.Blueprint.Redis.UnitTests.csproj index be997e8..d370ba3 100644 --- a/tests/Core.Blueprint.Redis.UnitTests/Core.Blueprint.Redis.UnitTests.csproj +++ b/tests/Core.Blueprint.Redis.UnitTests/Core.Blueprint.Redis.UnitTests.csproj @@ -7,6 +7,7 @@ + diff --git a/tests/Core.Blueprint.Redis.UnitTests/UnitTest1.cs b/tests/Core.Blueprint.Redis.UnitTests/UnitTest1.cs index dd3c748..6917d4f 100644 --- a/tests/Core.Blueprint.Redis.UnitTests/UnitTest1.cs +++ b/tests/Core.Blueprint.Redis.UnitTests/UnitTest1.cs @@ -1,9 +1,21 @@ +using Core.Blueprint.Redis.DependencyInjection; +using Core.Blueprint.Redis.Runtime; +using Microsoft.Extensions.DependencyInjection; + namespace Core.Blueprint.Redis.UnitTests; public class UnitTest1 { [Fact] - public void Test1() + public void AddBlueprintRedisModule_WhenCalled_RegistersRuntimeSettings() { + var services = new ServiceCollection(); + + services.AddBlueprintRedisModule("bb:"); + + using var provider = services.BuildServiceProvider(); + var settings = provider.GetRequiredService(); + + Assert.Equal("bb:", settings.KeyPrefix); } } diff --git a/tests/Core.Blueprint.SQLServer.UnitTests/Core.Blueprint.SQLServer.UnitTests.csproj b/tests/Core.Blueprint.SQLServer.UnitTests/Core.Blueprint.SQLServer.UnitTests.csproj index b21d6a1..22c4aaf 100644 --- a/tests/Core.Blueprint.SQLServer.UnitTests/Core.Blueprint.SQLServer.UnitTests.csproj +++ b/tests/Core.Blueprint.SQLServer.UnitTests/Core.Blueprint.SQLServer.UnitTests.csproj @@ -7,6 +7,7 @@ + diff --git a/tests/Core.Blueprint.SQLServer.UnitTests/UnitTest1.cs b/tests/Core.Blueprint.SQLServer.UnitTests/UnitTest1.cs index cbd7df8..68065d9 100644 --- a/tests/Core.Blueprint.SQLServer.UnitTests/UnitTest1.cs +++ b/tests/Core.Blueprint.SQLServer.UnitTests/UnitTest1.cs @@ -1,9 +1,21 @@ +using Core.Blueprint.SQLServer.DependencyInjection; +using Core.Blueprint.SQLServer.Runtime; +using Microsoft.Extensions.DependencyInjection; + namespace Core.Blueprint.SQLServer.UnitTests; public class UnitTest1 { [Fact] - public void Test1() + public void AddBlueprintSqlServerModule_WhenCalled_RegistersRuntimeSettings() { + var services = new ServiceCollection(); + + services.AddBlueprintSqlServerModule("Primary"); + + using var provider = services.BuildServiceProvider(); + var settings = provider.GetRequiredService(); + + Assert.Equal("Primary", settings.ConnectionName); } } diff --git a/tests/Core.Blueprint.Storage.UnitTests/Core.Blueprint.Storage.UnitTests.csproj b/tests/Core.Blueprint.Storage.UnitTests/Core.Blueprint.Storage.UnitTests.csproj index bbf83fb..09b2529 100644 --- a/tests/Core.Blueprint.Storage.UnitTests/Core.Blueprint.Storage.UnitTests.csproj +++ b/tests/Core.Blueprint.Storage.UnitTests/Core.Blueprint.Storage.UnitTests.csproj @@ -7,6 +7,7 @@ + diff --git a/tests/Core.Blueprint.Storage.UnitTests/UnitTest1.cs b/tests/Core.Blueprint.Storage.UnitTests/UnitTest1.cs index 914aa10..762c334 100644 --- a/tests/Core.Blueprint.Storage.UnitTests/UnitTest1.cs +++ b/tests/Core.Blueprint.Storage.UnitTests/UnitTest1.cs @@ -1,9 +1,21 @@ +using Core.Blueprint.Storage.DependencyInjection; +using Core.Blueprint.Storage.Runtime; +using Microsoft.Extensions.DependencyInjection; + namespace Core.Blueprint.Storage.UnitTests; public class UnitTest1 { [Fact] - public void Test1() + public void AddBlueprintStorageModule_WhenCalled_RegistersRuntimeSettings() { + var services = new ServiceCollection(); + + services.AddBlueprintStorageModule("media"); + + using var provider = services.BuildServiceProvider(); + var settings = provider.GetRequiredService(); + + Assert.Equal("media", settings.ContainerName); } }