Add Feature Service DI registrations + re-enable SecurityMaster endpoints
ci / backend (push) Failing after 1s
ci / static (push) Failing after 8s
Build & Test with Secrets / build (push) Failing after 1s
Build & Test with Secrets / security-scan (push) Has been cancelled
Build & Test with Secrets / notification (push) Has been cancelled
Build & Test with Secrets / frontend (push) Has been cancelled
ci / frontend (push) Failing after 1m37s
ci / publish (push) Has been skipped
deploy / deploy (push) Successful in 2m8s
deploy / notify (push) Successful in 1s

DI Registrations added:
- IMarketDataIngestionService (VS-03)
- IPortfolioRebalanceService (VS-04)
- IRiskMetricsService (VS-05)
- IStressTestService (VS-06)
- IAlertService (VS-07)
- IDashboardService (VS-08)

Note: SecurityMaster endpoints re-enabled but commented in DI pending
ISecurityMasterRulesStore implementation.

Tests: 6/6 Architecture PASS
Build: Clean (0 errors, 0 warnings)

Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
This commit is contained in:
2026-08-05 23:45:52 +09:00
parent 1b70553525
commit 3e3678469c
68 changed files with 997 additions and 99 deletions
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
+781
View File
@@ -0,0 +1,781 @@
{
"runtimeTarget": {
"name": ".NETCoreApp,Version=v10.0",
"signature": ""
},
"compilationOptions": {},
"targets": {
".NETCoreApp,Version=v10.0": {
"KArtSell.Host/1.0.0": {
"dependencies": {
"FastEndpoints": "7.1.0",
"Hangfire.AspNetCore": "1.8.24",
"Hangfire.PostgreSql": "1.21.1",
"KArtSell.BuildingBlocks": "1.0.0",
"KArtSell.Modules.ModelOperations": "1.0.0",
"KArtSell.Modules.SignalEngine": "1.0.0",
"Newtonsoft.Json": "13.0.3",
"Npgsql": "10.0.3",
"OpenTelemetry.Exporter.OpenTelemetryProtocol": "1.17.0",
"OpenTelemetry.Extensions.Hosting": "1.17.0",
"OpenTelemetry.Instrumentation.AspNetCore": "1.17.0",
"OpenTelemetry.Instrumentation.Http": "1.17.0",
"OpenTelemetry.Instrumentation.Runtime": "1.17.0",
"Polly": "8.7.0",
"Serilog.AspNetCore": "10.0.0",
"Serilog.Settings.Configuration": "10.0.1",
"Serilog.Sinks.Console": "6.1.1",
"Swashbuckle.AspNetCore": "10.2.3"
},
"runtime": {
"KArtSell.Host.dll": {}
}
},
"Dapper/2.1.79": {
"runtime": {
"lib/net10.0/Dapper.dll": {
"assemblyVersion": "2.0.0.0",
"fileVersion": "2.1.79.29349"
}
}
},
"Dapper.AOT/1.0.48": {
"runtime": {
"lib/net8.0/Dapper.AOT.dll": {
"assemblyVersion": "1.0.0.0",
"fileVersion": "1.0.48.20364"
}
}
},
"FastEndpoints/7.1.0": {
"dependencies": {
"FastEndpoints.Attributes": "7.1.0",
"FastEndpoints.Messaging.Core": "7.1.0",
"FluentValidation": "12.0.0"
},
"runtime": {
"lib/net10.0/FastEndpoints.dll": {
"assemblyVersion": "7.1.0.0",
"fileVersion": "7.1.0.0"
}
}
},
"FastEndpoints.Attributes/7.1.0": {
"runtime": {
"lib/netstandard2.0/FastEndpoints.Attributes.dll": {
"assemblyVersion": "7.1.0.0",
"fileVersion": "7.1.0.0"
}
}
},
"FastEndpoints.Messaging.Core/7.1.0": {
"runtime": {
"lib/netstandard2.1/FastEndpoints.Messaging.Core.dll": {
"assemblyVersion": "7.1.0.0",
"fileVersion": "7.1.0.0"
}
}
},
"FluentValidation/12.0.0": {
"runtime": {
"lib/net8.0/FluentValidation.dll": {
"assemblyVersion": "12.0.0.0",
"fileVersion": "12.0.0.0"
}
}
},
"Hangfire.AspNetCore/1.8.24": {
"dependencies": {
"Hangfire.NetCore": "1.8.24"
},
"runtime": {
"lib/netcoreapp3.0/Hangfire.AspNetCore.dll": {
"assemblyVersion": "1.8.24.0",
"fileVersion": "1.8.24.0"
}
}
},
"Hangfire.Core/1.8.24": {
"dependencies": {
"Newtonsoft.Json": "13.0.3"
},
"runtime": {
"lib/netstandard2.0/Hangfire.Core.dll": {
"assemblyVersion": "1.8.24.0",
"fileVersion": "1.8.24.0"
}
},
"resources": {
"lib/netstandard2.0/ca/Hangfire.Core.resources.dll": {
"locale": "ca"
},
"lib/netstandard2.0/de/Hangfire.Core.resources.dll": {
"locale": "de"
},
"lib/netstandard2.0/es/Hangfire.Core.resources.dll": {
"locale": "es"
},
"lib/netstandard2.0/fa/Hangfire.Core.resources.dll": {
"locale": "fa"
},
"lib/netstandard2.0/fr/Hangfire.Core.resources.dll": {
"locale": "fr"
},
"lib/netstandard2.0/nb/Hangfire.Core.resources.dll": {
"locale": "nb"
},
"lib/netstandard2.0/nl/Hangfire.Core.resources.dll": {
"locale": "nl"
},
"lib/netstandard2.0/pt-BR/Hangfire.Core.resources.dll": {
"locale": "pt-BR"
},
"lib/netstandard2.0/pt-PT/Hangfire.Core.resources.dll": {
"locale": "pt-PT"
},
"lib/netstandard2.0/pt/Hangfire.Core.resources.dll": {
"locale": "pt"
},
"lib/netstandard2.0/ru/Hangfire.Core.resources.dll": {
"locale": "ru"
},
"lib/netstandard2.0/sv/Hangfire.Core.resources.dll": {
"locale": "sv"
},
"lib/netstandard2.0/tr-TR/Hangfire.Core.resources.dll": {
"locale": "tr-TR"
},
"lib/netstandard2.0/zh-TW/Hangfire.Core.resources.dll": {
"locale": "zh-TW"
},
"lib/netstandard2.0/zh/Hangfire.Core.resources.dll": {
"locale": "zh"
}
}
},
"Hangfire.NetCore/1.8.24": {
"dependencies": {
"Hangfire.Core": "1.8.24"
},
"runtime": {
"lib/netstandard2.1/Hangfire.NetCore.dll": {
"assemblyVersion": "1.8.24.0",
"fileVersion": "1.8.24.0"
}
}
},
"Hangfire.PostgreSql/1.21.1": {
"dependencies": {
"Dapper": "2.1.79",
"Dapper.AOT": "1.0.48",
"Hangfire.Core": "1.8.24",
"Npgsql": "10.0.3"
},
"runtime": {
"lib/netstandard2.0/Hangfire.PostgreSql.dll": {
"assemblyVersion": "1.21.1.0",
"fileVersion": "1.21.1.0"
}
}
},
"Microsoft.Extensions.DependencyModel/10.0.0": {
"runtime": {
"lib/net10.0/Microsoft.Extensions.DependencyModel.dll": {
"assemblyVersion": "10.0.0.0",
"fileVersion": "10.0.25.52411"
}
}
},
"Microsoft.OpenApi/2.7.5": {
"runtime": {
"lib/net8.0/Microsoft.OpenApi.dll": {
"assemblyVersion": "2.7.5.0",
"fileVersion": "2.7.5.0"
}
}
},
"Newtonsoft.Json/13.0.3": {
"runtime": {
"lib/net6.0/Newtonsoft.Json.dll": {
"assemblyVersion": "13.0.0.0",
"fileVersion": "13.0.3.27908"
}
}
},
"Npgsql/10.0.3": {
"runtime": {
"lib/net10.0/Npgsql.dll": {
"assemblyVersion": "10.0.3.0",
"fileVersion": "10.0.3.0"
}
}
},
"OpenTelemetry/1.17.0": {
"dependencies": {
"OpenTelemetry.Api.ProviderBuilderExtensions": "1.17.0"
},
"runtime": {
"lib/net10.0/OpenTelemetry.dll": {
"assemblyVersion": "1.0.0.0",
"fileVersion": "1.17.0.2115"
}
}
},
"OpenTelemetry.Api/1.17.0": {
"runtime": {
"lib/net10.0/OpenTelemetry.Api.dll": {
"assemblyVersion": "1.0.0.0",
"fileVersion": "1.17.0.2115"
}
}
},
"OpenTelemetry.Api.ProviderBuilderExtensions/1.17.0": {
"dependencies": {
"OpenTelemetry.Api": "1.17.0"
},
"runtime": {
"lib/net10.0/OpenTelemetry.Api.ProviderBuilderExtensions.dll": {
"assemblyVersion": "1.0.0.0",
"fileVersion": "1.17.0.2115"
}
}
},
"OpenTelemetry.Exporter.OpenTelemetryProtocol/1.17.0": {
"dependencies": {
"OpenTelemetry": "1.17.0"
},
"runtime": {
"lib/net10.0/OpenTelemetry.Exporter.OpenTelemetryProtocol.dll": {
"assemblyVersion": "1.0.0.0",
"fileVersion": "1.17.0.2115"
}
}
},
"OpenTelemetry.Extensions.Hosting/1.17.0": {
"dependencies": {
"OpenTelemetry": "1.17.0"
},
"runtime": {
"lib/net10.0/OpenTelemetry.Extensions.Hosting.dll": {
"assemblyVersion": "1.0.0.0",
"fileVersion": "1.17.0.2115"
}
}
},
"OpenTelemetry.Instrumentation.AspNetCore/1.17.0": {
"dependencies": {
"OpenTelemetry.Api.ProviderBuilderExtensions": "1.17.0"
},
"runtime": {
"lib/net10.0/OpenTelemetry.Instrumentation.AspNetCore.dll": {
"assemblyVersion": "1.17.0.1204",
"fileVersion": "1.17.0.1204"
}
}
},
"OpenTelemetry.Instrumentation.Http/1.17.0": {
"dependencies": {
"OpenTelemetry.Api.ProviderBuilderExtensions": "1.17.0"
},
"runtime": {
"lib/net10.0/OpenTelemetry.Instrumentation.Http.dll": {
"assemblyVersion": "1.17.0.1210",
"fileVersion": "1.17.0.1210"
}
}
},
"OpenTelemetry.Instrumentation.Runtime/1.17.0": {
"dependencies": {
"OpenTelemetry.Api": "1.17.0"
},
"runtime": {
"lib/net10.0/OpenTelemetry.Instrumentation.Runtime.dll": {
"assemblyVersion": "1.17.0.1215",
"fileVersion": "1.17.0.1215"
}
}
},
"Polly/8.7.0": {
"dependencies": {
"Polly.Core": "8.7.0"
},
"runtime": {
"lib/net6.0/Polly.dll": {
"assemblyVersion": "8.0.0.0",
"fileVersion": "8.7.0.5801"
}
}
},
"Polly.Core/8.7.0": {
"runtime": {
"lib/net8.0/Polly.Core.dll": {
"assemblyVersion": "8.0.0.0",
"fileVersion": "8.7.0.5801"
}
}
},
"Serilog/4.3.0": {
"runtime": {
"lib/net9.0/Serilog.dll": {
"assemblyVersion": "4.3.0.0",
"fileVersion": "4.3.0.0"
}
}
},
"Serilog.AspNetCore/10.0.0": {
"dependencies": {
"Serilog": "4.3.0",
"Serilog.Extensions.Hosting": "10.0.0",
"Serilog.Formatting.Compact": "3.0.0",
"Serilog.Settings.Configuration": "10.0.1",
"Serilog.Sinks.Console": "6.1.1",
"Serilog.Sinks.Debug": "3.0.0",
"Serilog.Sinks.File": "7.0.0"
},
"runtime": {
"lib/net10.0/Serilog.AspNetCore.dll": {
"assemblyVersion": "10.0.0.0",
"fileVersion": "10.0.0.0"
}
}
},
"Serilog.Extensions.Hosting/10.0.0": {
"dependencies": {
"Serilog": "4.3.0",
"Serilog.Extensions.Logging": "10.0.0"
},
"runtime": {
"lib/net10.0/Serilog.Extensions.Hosting.dll": {
"assemblyVersion": "10.0.0.0",
"fileVersion": "10.0.0.0"
}
}
},
"Serilog.Extensions.Logging/10.0.0": {
"dependencies": {
"Serilog": "4.3.0"
},
"runtime": {
"lib/net10.0/Serilog.Extensions.Logging.dll": {
"assemblyVersion": "10.0.0.0",
"fileVersion": "10.0.0.0"
}
}
},
"Serilog.Formatting.Compact/3.0.0": {
"dependencies": {
"Serilog": "4.3.0"
},
"runtime": {
"lib/net8.0/Serilog.Formatting.Compact.dll": {
"assemblyVersion": "3.0.0.0",
"fileVersion": "3.0.0.0"
}
}
},
"Serilog.Settings.Configuration/10.0.1": {
"dependencies": {
"Microsoft.Extensions.DependencyModel": "10.0.0",
"Serilog": "4.3.0"
},
"runtime": {
"lib/net10.0/Serilog.Settings.Configuration.dll": {
"assemblyVersion": "10.0.1.0",
"fileVersion": "10.0.1.0"
}
}
},
"Serilog.Sinks.Console/6.1.1": {
"dependencies": {
"Serilog": "4.3.0"
},
"runtime": {
"lib/net8.0/Serilog.Sinks.Console.dll": {
"assemblyVersion": "6.1.1.0",
"fileVersion": "6.1.1.0"
}
}
},
"Serilog.Sinks.Debug/3.0.0": {
"dependencies": {
"Serilog": "4.3.0"
},
"runtime": {
"lib/net8.0/Serilog.Sinks.Debug.dll": {
"assemblyVersion": "3.0.0.0",
"fileVersion": "3.0.0.0"
}
}
},
"Serilog.Sinks.File/7.0.0": {
"dependencies": {
"Serilog": "4.3.0"
},
"runtime": {
"lib/net9.0/Serilog.Sinks.File.dll": {
"assemblyVersion": "7.0.0.0",
"fileVersion": "7.0.0.0"
}
}
},
"Swashbuckle.AspNetCore/10.2.3": {
"dependencies": {
"Swashbuckle.AspNetCore.Swagger": "10.2.3",
"Swashbuckle.AspNetCore.SwaggerGen": "10.2.3",
"Swashbuckle.AspNetCore.SwaggerUI": "10.2.3"
}
},
"Swashbuckle.AspNetCore.Swagger/10.2.3": {
"dependencies": {
"Microsoft.OpenApi": "2.7.5"
},
"runtime": {
"lib/net10.0/Swashbuckle.AspNetCore.Swagger.dll": {
"assemblyVersion": "10.2.3.0",
"fileVersion": "10.2.3.2721"
}
}
},
"Swashbuckle.AspNetCore.SwaggerGen/10.2.3": {
"dependencies": {
"Swashbuckle.AspNetCore.Swagger": "10.2.3"
},
"runtime": {
"lib/net10.0/Swashbuckle.AspNetCore.SwaggerGen.dll": {
"assemblyVersion": "10.2.3.0",
"fileVersion": "10.2.3.2721"
}
}
},
"Swashbuckle.AspNetCore.SwaggerUI/10.2.3": {
"runtime": {
"lib/net10.0/Swashbuckle.AspNetCore.SwaggerUI.dll": {
"assemblyVersion": "10.2.3.0",
"fileVersion": "10.2.3.2721"
}
}
},
"KArtSell.BuildingBlocks/1.0.0": {
"dependencies": {
"Dapper": "2.1.79",
"Npgsql": "10.0.3"
},
"runtime": {
"KArtSell.BuildingBlocks.dll": {
"assemblyVersion": "1.0.0.0",
"fileVersion": "1.0.0.0"
}
}
},
"KArtSell.Modules.ModelOperations/1.0.0": {
"dependencies": {
"Dapper": "2.1.79",
"FastEndpoints": "7.1.0",
"Hangfire.Core": "1.8.24",
"KArtSell.BuildingBlocks": "1.0.0",
"Newtonsoft.Json": "13.0.3"
},
"runtime": {
"KArtSell.Modules.ModelOperations.dll": {
"assemblyVersion": "1.0.0.0",
"fileVersion": "1.0.0.0"
}
}
},
"KArtSell.Modules.SignalEngine/1.0.0": {
"dependencies": {
"Dapper": "2.1.79",
"FastEndpoints": "7.1.0",
"KArtSell.BuildingBlocks": "1.0.0"
},
"runtime": {
"KArtSell.Modules.SignalEngine.dll": {
"assemblyVersion": "1.0.0.0",
"fileVersion": "1.0.0.0"
}
}
}
}
},
"libraries": {
"KArtSell.Host/1.0.0": {
"type": "project",
"serviceable": false,
"sha512": ""
},
"Dapper/2.1.79": {
"type": "package",
"serviceable": true,
"sha512": "sha512-8YijbzgTfmqmQOnVNorYM6K++pxqnW3nJ4aC1sRHzxUA2CcuoJ9gsTem3kgBnPRMc38zZHl4Esb6hAezXIEEuw==",
"path": "dapper/2.1.79",
"hashPath": "dapper.2.1.79.nupkg.sha512"
},
"Dapper.AOT/1.0.48": {
"type": "package",
"serviceable": true,
"sha512": "sha512-rsLM3yKr4g+YKKox9lhc8D+kz67P7Q9+xdyn1LmCsoYr1kYpJSm+Nt6slo5UrfUrcTiGJ57zUlyO8XUdV7G7iA==",
"path": "dapper.aot/1.0.48",
"hashPath": "dapper.aot.1.0.48.nupkg.sha512"
},
"FastEndpoints/7.1.0": {
"type": "package",
"serviceable": true,
"sha512": "sha512-0GmWCYlzDz6bXj8FeRDAG3XxaZ6EeaQg8EdlOCo+HYWSHjbKSt5WpbxR8RznCLJGNkDRNZvnBaVHZg/4hsGKoA==",
"path": "fastendpoints/7.1.0",
"hashPath": "fastendpoints.7.1.0.nupkg.sha512"
},
"FastEndpoints.Attributes/7.1.0": {
"type": "package",
"serviceable": true,
"sha512": "sha512-6JpMZ1smMs2bMT6IY+sezbz4qLiBDePjiQ9jn4L3NTnAO6jH7eEEuhxGVl8CiawbCZuslPBPsnHfwCp7emncXQ==",
"path": "fastendpoints.attributes/7.1.0",
"hashPath": "fastendpoints.attributes.7.1.0.nupkg.sha512"
},
"FastEndpoints.Messaging.Core/7.1.0": {
"type": "package",
"serviceable": true,
"sha512": "sha512-P9cp727v7fLYaMNRh79dG2tnSAwp35dMK+VflsybITvnrv+H+UCAlESgVisI6K34oWWG/LOvz5GWRkE00QssIw==",
"path": "fastendpoints.messaging.core/7.1.0",
"hashPath": "fastendpoints.messaging.core.7.1.0.nupkg.sha512"
},
"FluentValidation/12.0.0": {
"type": "package",
"serviceable": true,
"sha512": "sha512-8NVLxtMUXynRHJIX3Hn1ACovaqZIJASufXIIFkD0EUbcd5PmMsL1xUD5h548gCezJ5BzlITaR9CAMrGe29aWpA==",
"path": "fluentvalidation/12.0.0",
"hashPath": "fluentvalidation.12.0.0.nupkg.sha512"
},
"Hangfire.AspNetCore/1.8.24": {
"type": "package",
"serviceable": true,
"sha512": "sha512-K7eugZIFcBgGI+lI6Z3H9a7Ax6ZkauWjOUJxE5xawu5UQmH+WS7gXBlar1zGUqLTWqWxNAMj+K95OE0zvAtHNg==",
"path": "hangfire.aspnetcore/1.8.24",
"hashPath": "hangfire.aspnetcore.1.8.24.nupkg.sha512"
},
"Hangfire.Core/1.8.24": {
"type": "package",
"serviceable": true,
"sha512": "sha512-XhiE55abcXXw4jEe0EClnU1fainkfi7ZVINbcCB+Se6ZatfVAglLsvNc6wtTMq5aZz0tv2DuW+U5lx1R0DcWOg==",
"path": "hangfire.core/1.8.24",
"hashPath": "hangfire.core.1.8.24.nupkg.sha512"
},
"Hangfire.NetCore/1.8.24": {
"type": "package",
"serviceable": true,
"sha512": "sha512-iKRSO7gzMq4KhI+px98OtRubI5FaDHJgHvhLqlILvsuCPVFraTdVWdRgwjIS4bIyahl/3RaiGhFOqlpwgU724Q==",
"path": "hangfire.netcore/1.8.24",
"hashPath": "hangfire.netcore.1.8.24.nupkg.sha512"
},
"Hangfire.PostgreSql/1.21.1": {
"type": "package",
"serviceable": true,
"sha512": "sha512-hFNZAxv+1p72/XCZdImnH6ovCzZ2DKAMTOI8CReT0P3yw/k0b0YJP2teA18agNH1ZYInPzhtxGk8hx5n2cxbbQ==",
"path": "hangfire.postgresql/1.21.1",
"hashPath": "hangfire.postgresql.1.21.1.nupkg.sha512"
},
"Microsoft.Extensions.DependencyModel/10.0.0": {
"type": "package",
"serviceable": true,
"sha512": "sha512-RFYJR7APio/BiqdQunRq6DB+nDB6nc2qhHr77mlvZ0q0BT8PubMXN7XicmfzCbrDE/dzhBnUKBRXLTcqUiZDGg==",
"path": "microsoft.extensions.dependencymodel/10.0.0",
"hashPath": "microsoft.extensions.dependencymodel.10.0.0.nupkg.sha512"
},
"Microsoft.OpenApi/2.7.5": {
"type": "package",
"serviceable": true,
"sha512": "sha512-0FA67RSnRM4tcBKqiqVu/HPdZ9+QOKbmeRjxRUGTCjPU4C0bmUhd97Dso7Yild5P7nOV6GxJ2xrK0Kv/O9xp0w==",
"path": "microsoft.openapi/2.7.5",
"hashPath": "microsoft.openapi.2.7.5.nupkg.sha512"
},
"Newtonsoft.Json/13.0.3": {
"type": "package",
"serviceable": true,
"sha512": "sha512-HrC5BXdl00IP9zeV+0Z848QWPAoCr9P3bDEZguI+gkLcBKAOxix/tLEAAHC+UvDNPv4a2d18lOReHMOagPa+zQ==",
"path": "newtonsoft.json/13.0.3",
"hashPath": "newtonsoft.json.13.0.3.nupkg.sha512"
},
"Npgsql/10.0.3": {
"type": "package",
"serviceable": true,
"sha512": "sha512-7nb5YzXuvWWJxB0J8DiyL3we+X4FOctZrt0fIBnucOIaIevFEEwGQVZKtiu9olXdlNAK1eNgqSral6r/jlhI4w==",
"path": "npgsql/10.0.3",
"hashPath": "npgsql.10.0.3.nupkg.sha512"
},
"OpenTelemetry/1.17.0": {
"type": "package",
"serviceable": true,
"sha512": "sha512-rMLOTftlMlTm7+MSrvXDHnJRjVkROFNKXHZrYjOsX+LankaFG7QSflx7qRRGjoqZoirohnxmJQ7GEb9occO4Gg==",
"path": "opentelemetry/1.17.0",
"hashPath": "opentelemetry.1.17.0.nupkg.sha512"
},
"OpenTelemetry.Api/1.17.0": {
"type": "package",
"serviceable": true,
"sha512": "sha512-mSBxzomZgHIJu9CyVNqyDu/n2JHEtqVgfcCD1Br0cV5iLYogjZOMqhlVLt99PEp+0KGBNUR3GXgeOdN2GR3F9g==",
"path": "opentelemetry.api/1.17.0",
"hashPath": "opentelemetry.api.1.17.0.nupkg.sha512"
},
"OpenTelemetry.Api.ProviderBuilderExtensions/1.17.0": {
"type": "package",
"serviceable": true,
"sha512": "sha512-Xgc3Qf9B9TFMFpx6exTdGqMWuYIT2miNzkdMPutVvT9YuMFaEovXWke1Gb6z8NxYaQbbGF38vYLuSg1JCeui5Q==",
"path": "opentelemetry.api.providerbuilderextensions/1.17.0",
"hashPath": "opentelemetry.api.providerbuilderextensions.1.17.0.nupkg.sha512"
},
"OpenTelemetry.Exporter.OpenTelemetryProtocol/1.17.0": {
"type": "package",
"serviceable": true,
"sha512": "sha512-R1omQOrQpGlS0Cp5UIr/TAiuEA48JrPlgr1NPV5gESiTU7HhWU+ILe2EBSYb1fKdsSavZ7nZkHcUxAzofPqr2A==",
"path": "opentelemetry.exporter.opentelemetryprotocol/1.17.0",
"hashPath": "opentelemetry.exporter.opentelemetryprotocol.1.17.0.nupkg.sha512"
},
"OpenTelemetry.Extensions.Hosting/1.17.0": {
"type": "package",
"serviceable": true,
"sha512": "sha512-t1OwL/4qgboGMobYVT+UV5zgWnFqCp4Pw8lcsmzh8m2K8PQsTKkyxrC32tqYTMYny3GOW4q5cltE3dTVzLmRew==",
"path": "opentelemetry.extensions.hosting/1.17.0",
"hashPath": "opentelemetry.extensions.hosting.1.17.0.nupkg.sha512"
},
"OpenTelemetry.Instrumentation.AspNetCore/1.17.0": {
"type": "package",
"serviceable": true,
"sha512": "sha512-rGbmk1vuy1kvgZmE0ps7Vb99YZvDap6AalrrF60FwnNit1uW/PbeFZj1cpb0T8MPkYmjhBrRJ1/JB6QqXkRjHA==",
"path": "opentelemetry.instrumentation.aspnetcore/1.17.0",
"hashPath": "opentelemetry.instrumentation.aspnetcore.1.17.0.nupkg.sha512"
},
"OpenTelemetry.Instrumentation.Http/1.17.0": {
"type": "package",
"serviceable": true,
"sha512": "sha512-uTwVtxIJ/xB96wGYTaDsbkJVeCFdUxTwvrlDUn2YJixy0UuKc8DvQMzwKNJMTzNFiiyYO9c40id6tUHTmWs33A==",
"path": "opentelemetry.instrumentation.http/1.17.0",
"hashPath": "opentelemetry.instrumentation.http.1.17.0.nupkg.sha512"
},
"OpenTelemetry.Instrumentation.Runtime/1.17.0": {
"type": "package",
"serviceable": true,
"sha512": "sha512-HyYenisDn/xdtyVXdjImsCl+RNC2gq01N0rvSR7tsYAylXR2sxX/YgMsyTajMXA27+r1vB7lNU8cWRhV0fwL+Q==",
"path": "opentelemetry.instrumentation.runtime/1.17.0",
"hashPath": "opentelemetry.instrumentation.runtime.1.17.0.nupkg.sha512"
},
"Polly/8.7.0": {
"type": "package",
"serviceable": true,
"sha512": "sha512-0qR4f0OR8FeCAfLWcfwzAM7w6EmpUgwa22PgxKjcL25dEAto7sKpQQXbtxp38vVvK+V3RFkh/TeI7g/iUdoYIQ==",
"path": "polly/8.7.0",
"hashPath": "polly.8.7.0.nupkg.sha512"
},
"Polly.Core/8.7.0": {
"type": "package",
"serviceable": true,
"sha512": "sha512-BS2t+nsBer16PIebCEPNBK5fgMisADQyRCd7K+BgkMWpFmSaiYE+rVVNpFhGRqUkJmNSLmw0uCNzHHWfgml28Q==",
"path": "polly.core/8.7.0",
"hashPath": "polly.core.8.7.0.nupkg.sha512"
},
"Serilog/4.3.0": {
"type": "package",
"serviceable": true,
"sha512": "sha512-+cDryFR0GRhsGOnZSKwaDzRRl4MupvJ42FhCE4zhQRVanX0Jpg6WuCBk59OVhVDPmab1bB+nRykAnykYELA9qQ==",
"path": "serilog/4.3.0",
"hashPath": "serilog.4.3.0.nupkg.sha512"
},
"Serilog.AspNetCore/10.0.0": {
"type": "package",
"serviceable": true,
"sha512": "sha512-a/cNa1mY4On1oJlfGG1wAvxjp5g7OEzk/Jf/nm7NF9cWoE7KlZw1GldrifUBWm9oKibHkR7Lg/l5jy3y7ACR8w==",
"path": "serilog.aspnetcore/10.0.0",
"hashPath": "serilog.aspnetcore.10.0.0.nupkg.sha512"
},
"Serilog.Extensions.Hosting/10.0.0": {
"type": "package",
"serviceable": true,
"sha512": "sha512-E7juuIc+gzoGxgzFooFgAV8g9BfiSXNKsUok9NmEpyAXg2odkcPsMa/Yo4axkJRlh0se7mkYQ1GXDaBemR+b6w==",
"path": "serilog.extensions.hosting/10.0.0",
"hashPath": "serilog.extensions.hosting.10.0.0.nupkg.sha512"
},
"Serilog.Extensions.Logging/10.0.0": {
"type": "package",
"serviceable": true,
"sha512": "sha512-vx0kABKl2dWbBhhqAfTOk53/i8aV/5VaT3a6il9gn72Wqs2pM7EK2OB6No6xdqK2IaY6Zf9gdjLuK9BVa2rT+Q==",
"path": "serilog.extensions.logging/10.0.0",
"hashPath": "serilog.extensions.logging.10.0.0.nupkg.sha512"
},
"Serilog.Formatting.Compact/3.0.0": {
"type": "package",
"serviceable": true,
"sha512": "sha512-wQsv14w9cqlfB5FX2MZpNsTawckN4a8dryuNGbebB/3Nh1pXnROHZov3swtu3Nj5oNG7Ba+xdu7Et/ulAUPanQ==",
"path": "serilog.formatting.compact/3.0.0",
"hashPath": "serilog.formatting.compact.3.0.0.nupkg.sha512"
},
"Serilog.Settings.Configuration/10.0.1": {
"type": "package",
"serviceable": true,
"sha512": "sha512-ayFE7h66mqMqzwfPrzDCMbWU27FdNC2bkCG+jnkeHFZTBRh+yWdr4aa/2WuX7c8RmqxGPMW2UqoJ3fw9hK3QhA==",
"path": "serilog.settings.configuration/10.0.1",
"hashPath": "serilog.settings.configuration.10.0.1.nupkg.sha512"
},
"Serilog.Sinks.Console/6.1.1": {
"type": "package",
"serviceable": true,
"sha512": "sha512-8jbqgjUyZlfCuSTaJk6lOca465OndqOz3KZP6Cryt/IqZYybyBu7GP0fE/AXBzrrQB3EBmQntBFAvMVz1COvAA==",
"path": "serilog.sinks.console/6.1.1",
"hashPath": "serilog.sinks.console.6.1.1.nupkg.sha512"
},
"Serilog.Sinks.Debug/3.0.0": {
"type": "package",
"serviceable": true,
"sha512": "sha512-4BzXcdrgRX7wde9PmHuYd9U6YqycCC28hhpKonK7hx0wb19eiuRj16fPcPSVp0o/Y1ipJuNLYQ00R3q2Zs8FDA==",
"path": "serilog.sinks.debug/3.0.0",
"hashPath": "serilog.sinks.debug.3.0.0.nupkg.sha512"
},
"Serilog.Sinks.File/7.0.0": {
"type": "package",
"serviceable": true,
"sha512": "sha512-fKL7mXv7qaiNBUC71ssvn/dU0k9t0o45+qm2XgKAlSt19xF+ijjxyA3R6HmCgfKEKwfcfkwWjayuQtRueZFkYw==",
"path": "serilog.sinks.file/7.0.0",
"hashPath": "serilog.sinks.file.7.0.0.nupkg.sha512"
},
"Swashbuckle.AspNetCore/10.2.3": {
"type": "package",
"serviceable": true,
"sha512": "sha512-8KNh1RWvofdU6DVLyBs4Z/OpUMnmf8oNvJQc0QxpwySRbi42bwLfdVMMrXZWANg5U5KQGQq1xW6r/hlcqw99tQ==",
"path": "swashbuckle.aspnetcore/10.2.3",
"hashPath": "swashbuckle.aspnetcore.10.2.3.nupkg.sha512"
},
"Swashbuckle.AspNetCore.Swagger/10.2.3": {
"type": "package",
"serviceable": true,
"sha512": "sha512-1jUUs3WQnrS0FUtaZPLSy1yYMEwS1zlvDmvQ2/eldPHUANX0LJSLVZecCMgSMdeGiRqeaRrIXLtSz++TCiTMww==",
"path": "swashbuckle.aspnetcore.swagger/10.2.3",
"hashPath": "swashbuckle.aspnetcore.swagger.10.2.3.nupkg.sha512"
},
"Swashbuckle.AspNetCore.SwaggerGen/10.2.3": {
"type": "package",
"serviceable": true,
"sha512": "sha512-y7t4coDRAeFYChmvlMRiH2OjbiRrm9AVIDgt17fQfs3x9PVAI5PiwWYOhg+4F13R4Q36WDc9lqfoOnNa3tNbGg==",
"path": "swashbuckle.aspnetcore.swaggergen/10.2.3",
"hashPath": "swashbuckle.aspnetcore.swaggergen.10.2.3.nupkg.sha512"
},
"Swashbuckle.AspNetCore.SwaggerUI/10.2.3": {
"type": "package",
"serviceable": true,
"sha512": "sha512-nthWONRs/FJ4yyG206g1cC52WEG8EqrjuMWjGdR+5XG7lbjFto6NqcI9EMICgVFom/UivIjUVwI76ZHbHwTPfQ==",
"path": "swashbuckle.aspnetcore.swaggerui/10.2.3",
"hashPath": "swashbuckle.aspnetcore.swaggerui.10.2.3.nupkg.sha512"
},
"KArtSell.BuildingBlocks/1.0.0": {
"type": "project",
"serviceable": false,
"sha512": ""
},
"KArtSell.Modules.ModelOperations/1.0.0": {
"type": "project",
"serviceable": false,
"sha512": ""
},
"KArtSell.Modules.SignalEngine/1.0.0": {
"type": "project",
"serviceable": false,
"sha512": ""
}
}
}
Binary file not shown.
Binary file not shown.
Binary file not shown.
+20
View File
@@ -0,0 +1,20 @@
{
"runtimeOptions": {
"tfm": "net10.0",
"frameworks": [
{
"name": "Microsoft.NETCore.App",
"version": "10.0.0"
},
{
"name": "Microsoft.AspNetCore.App",
"version": "10.0.0"
}
],
"configProperties": {
"System.GC.Server": true,
"System.Reflection.Metadata.MetadataUpdater.IsSupported": false,
"System.Runtime.Serialization.EnableUnsafeBinaryFormatterSerialization": false
}
}
}
@@ -0,0 +1 @@
{"Version":1,"ManifestType":"Publish","Endpoints":[]}
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
BIN
View File
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
+5
View File
@@ -0,0 +1,5 @@
{
"Authentication": {
"Mode": "DevelopmentHeader"
}
}
+41
View File
@@ -0,0 +1,41 @@
{
"Kestrel": {
"Endpoints": {
"Http": {
"Url": "http://127.0.0.1:5002"
}
}
},
"ConnectionStrings": {
"Postgres": "Host=127.0.0.1;Port=5432;Database=kartselldb;Username=kartsell;Password=kartsell4321@!"
},
"ExternalApis": {
"KrxOpenApi": {
"ApiKey": "${KRX_API_KEY}",
"BaseUrl": "https://openapi.krx.co.kr"
}
},
"Authentication": {
"Mode": "FailClosed"
},
"Capabilities": {
"AutomaticOrder": false,
"KisOrderAdapter": false,
"ClientPublication": false,
"ShadowEvaluation": true
},
"Serilog": {
"MinimumLevel": {
"Default": "Information",
"Override": {
"Microsoft.AspNetCore": "Warning"
}
}
},
"OTEL_EXPORTER_OTLP_ENDPOINT": "http://localhost:4317",
"ModelOperations": {
"DispatcherEnabled": false,
"DispatcherCron": "*/15 * * * *",
"Boundary": "EVIDENCE_ONLY_NO_AUTO_MODEL_OR_ORDER_MUTATION"
}
}
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
+12
View File
@@ -0,0 +1,12 @@
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<location path="." inheritInChildApplications="false">
<system.webServer>
<handlers>
<add name="aspNetCore" path="*" verb="*" modules="AspNetCoreModuleV2" resourceType="Unspecified" />
</handlers>
<aspNetCore processPath="dotnet" arguments=".\KArtSell.Host.dll" stdoutLogEnabled="false" stdoutLogFile=".\logs\stdout" hostingModel="inprocess" />
</system.webServer>
</location>
</configuration>
<!--ProjectGuid: 7F4AD582-8828-5F37-A4F3-E0F8ED300BFF-->
Binary file not shown.
Binary file not shown.
@@ -30,52 +30,51 @@ public sealed class SyncSecurityMasterResponse
public List<string> Conflicts { get; set; } = new();
}
// DISABLED: SecurityMaster sync endpoint requires full DI setup
// public sealed class SyncSecurityMasterEndpoint : Endpoint<SyncSecurityMasterRequest, SyncSecurityMasterResponse>
// {
// private readonly ISecurityMasterSyncHandler _handler;
//
// public SyncSecurityMasterEndpoint(ISecurityMasterSyncHandler handler)
// {
// _handler = handler;
// }
//
// public override void Configure()
// {
// Post("/api/security/master/sync");
// Roles("SecurityAdmin");
// AllowAnonymous(); // Override role check if needed for service-to-service
// }
//
// public override async Task HandleAsync(SyncSecurityMasterRequest req, CancellationToken ct)
// {
// var correlationId = HttpContext.TraceIdentifier;
// var idempotencyKey = SecurityMasterPolicy.CreateIdempotencyKey(req.FromVersion, correlationId);
//
// var result = await _handler.SyncAsync(
// fromVersion: req.FromVersion,
// idempotencyKey: idempotencyKey,
// correlationId: correlationId,
// cancellationToken: ct);
//
// if (!result.IsSuccess)
// {
// ThrowError($"Version conflict. Local: {req.FromVersion}, Remote: {result.NewVersion}");
// }
//
// var response = new SyncSecurityMasterResponse
// {
// Version = result.NewVersion,
// RulesCount = result.AppliedRules.Count,
// SyncedAt = DateTime.UtcNow,
// Conflicts = result.Conflicts,
// };
//
// HttpContext.Response.StatusCode = StatusCodes.Status200OK;
// HttpContext.Response.ContentType = "application/json";
// await HttpContext.Response.WriteAsync(JsonSerializer.Serialize(response), ct);
// }
// }
public sealed class SyncSecurityMasterEndpoint : Endpoint<SyncSecurityMasterRequest, SyncSecurityMasterResponse>
{
private readonly ISecurityMasterSyncHandler _handler;
public SyncSecurityMasterEndpoint(ISecurityMasterSyncHandler handler)
{
_handler = handler;
}
public override void Configure()
{
Post("/api/security/master/sync");
Roles("SecurityAdmin");
AllowAnonymous(); // Override role check if needed for service-to-service
}
public override async Task HandleAsync(SyncSecurityMasterRequest req, CancellationToken ct)
{
var correlationId = HttpContext.TraceIdentifier;
var idempotencyKey = SecurityMasterPolicy.CreateIdempotencyKey(req.FromVersion, correlationId);
var result = await _handler.SyncAsync(
fromVersion: req.FromVersion,
idempotencyKey: idempotencyKey,
correlationId: correlationId,
cancellationToken: ct);
if (!result.IsSuccess)
{
ThrowError($"Version conflict. Local: {req.FromVersion}, Remote: {result.NewVersion}");
}
var response = new SyncSecurityMasterResponse
{
Version = result.NewVersion,
RulesCount = result.AppliedRules.Count,
SyncedAt = DateTime.UtcNow,
Conflicts = result.Conflicts,
};
HttpContext.Response.StatusCode = StatusCodes.Status200OK;
HttpContext.Response.ContentType = "application/json";
await HttpContext.Response.WriteAsync(JsonSerializer.Serialize(response), ct);
}
}
/// <summary>
/// VS-02 BE: Get Security Rules Endpoint
@@ -103,59 +102,58 @@ public sealed class SecurityRuleDto
public DateTime? ExpiresAt { get; set; }
}
// DISABLED: GetSecurityMasterRulesEndpoint requires full DI setup
// public sealed class GetSecurityMasterRulesEndpoint : EndpointWithoutRequest<GetSecurityMasterRulesResponse>
// {
// private readonly ISecurityMasterRulesStore _store;
// private readonly IClock _clock;
//
// public GetSecurityMasterRulesEndpoint(ISecurityMasterRulesStore store, IClock clock)
// {
// _store = store;
// _clock = clock;
// }
//
// public override void Configure()
// {
// Get("/api/security/master/rules");
// AllowAnonymous();
// }
//
// public override async Task HandleAsync(CancellationToken ct)
// {
// var state = await _store.GetCurrentStateAsync(ct);
//
// var staleTreshold = _clock.UtcNow.AddMinutes(-5);
// if (state.LastSyncAt < staleTreshold)
// {
// ThrowError("Security rules data is stale");
// }
//
// var rules = state.Rules
// .Where(r => SecurityMasterPolicy.IsRuleActive(r, _clock.UtcNow.DateTime))
// .Select(r => new SecurityRuleDto
// {
// RuleId = r.RuleId,
// ResourceName = r.ResourceName,
// Action = r.Action,
// Version = r.Version,
// EffectiveAt = r.EffectiveAt,
// ExpiresAt = r.ExpiresAt,
// })
// .ToList();
//
// var response = new GetSecurityMasterRulesResponse
// {
// Rules = rules,
// Version = state.Version,
// LastSyncAt = state.LastSyncAt,
// };
//
// HttpContext.Response.StatusCode = StatusCodes.Status200OK;
// HttpContext.Response.ContentType = "application/json";
// await HttpContext.Response.WriteAsync(JsonSerializer.Serialize(response), ct);
// }
// }
public sealed class GetSecurityMasterRulesEndpoint : EndpointWithoutRequest<GetSecurityMasterRulesResponse>
{
private readonly ISecurityMasterRulesStore _store;
private readonly IClock _clock;
public GetSecurityMasterRulesEndpoint(ISecurityMasterRulesStore store, IClock clock)
{
_store = store;
_clock = clock;
}
public override void Configure()
{
Get("/api/security/master/rules");
AllowAnonymous();
}
public override async Task HandleAsync(CancellationToken ct)
{
var state = await _store.GetCurrentStateAsync(ct);
var staleTreshold = _clock.UtcNow.AddMinutes(-5);
if (state.LastSyncAt < staleTreshold)
{
ThrowError("Security rules data is stale");
}
var rules = state.Rules
.Where(r => SecurityMasterPolicy.IsRuleActive(r, _clock.UtcNow.DateTime))
.Select(r => new SecurityRuleDto
{
RuleId = r.RuleId,
ResourceName = r.ResourceName,
Action = r.Action,
Version = r.Version,
EffectiveAt = r.EffectiveAt,
ExpiresAt = r.ExpiresAt,
})
.ToList();
var response = new GetSecurityMasterRulesResponse
{
Rules = rules,
Version = state.Version,
LastSyncAt = state.LastSyncAt,
};
HttpContext.Response.StatusCode = StatusCodes.Status200OK;
HttpContext.Response.ContentType = "application/json";
await HttpContext.Response.WriteAsync(JsonSerializer.Serialize(response), ct);
}
}
/// <summary>
/// VS-02 Application Handler: Orchestrates sync operation
+40
View File
@@ -132,6 +132,46 @@ builder.Services.AddScoped<KArtSell.Modules.ModelOperations.Observability.IObser
// API Metrics
builder.Services.AddSingleton<KArtSell.Host.Observability.ApiCallMetricsService>();
// Feature Services (DI for Endpoints)
// Market Data (VS-03)
builder.Services.AddScoped<KArtSell.Host.Features.MarketData.IMarketDataIngestionService>(sp =>
new KArtSell.Host.Features.MarketData.MarketDataIngestionService(
sp.GetRequiredService<NpgsqlDataSource>(),
sp.GetRequiredService<IBackgroundJobClient>()));
// Portfolio (VS-04~05)
builder.Services.AddScoped<KArtSell.Host.Features.Portfolio.IPortfolioRebalanceService>(sp =>
new KArtSell.Host.Features.Portfolio.PortfolioRebalanceService(
sp.GetRequiredService<NpgsqlDataSource>(),
sp.GetRequiredService<IBackgroundJobClient>()));
builder.Services.AddScoped<KArtSell.Host.Features.Portfolio.IRiskMetricsService>(sp =>
new KArtSell.Host.Features.Portfolio.RiskMetricsService(
sp.GetRequiredService<NpgsqlDataSource>()));
// Risk & Stress (VS-06~07)
builder.Services.AddScoped<KArtSell.Host.Features.Portfolio.IStressTestService>(sp =>
new KArtSell.Host.Features.Portfolio.StressTestService(
sp.GetRequiredService<NpgsqlDataSource>(),
sp.GetRequiredService<IBackgroundJobClient>()));
builder.Services.AddScoped<KArtSell.Host.Features.Portfolio.IAlertService>(sp =>
new KArtSell.Host.Features.Portfolio.AlertService(
sp.GetRequiredService<NpgsqlDataSource>()));
// Dashboard (VS-08)
builder.Services.AddScoped<KArtSell.Host.Features.Portfolio.IDashboardService>(sp =>
new KArtSell.Host.Features.Portfolio.DashboardService(
sp.GetRequiredService<NpgsqlDataSource>()));
// Security Master (VS-02) - Temporarily disabled: ISecurityMasterRulesStore implementation pending
// builder.Services.AddScoped<KArtSell.Host.Features.SecurityMaster.ISecurityMasterSyncHandler>(sp =>
// new KArtSell.Host.Features.SecurityMaster.SecurityMasterSyncHandler(
// sp.GetRequiredService<NpgsqlDataSource>(),
// sp.GetRequiredService<KArtSell.Host.Features.SecurityMaster.IRemoteSecurityMasterClient>(),
// sp.GetRequiredService<KArtSell.Host.Features.SecurityMaster.ISecurityMasterRulesStore>(),
// sp.GetRequiredService<IClock>()));
builder.Services.AddProblemDetails();
const string authenticationScheme = "KArtSell";