From c56c9cc903a1290fb0320d3d0d66b83fd2333953 Mon Sep 17 00:00:00 2001 From: kjh2064 Date: Mon, 29 Jun 2026 23:15:40 +0900 Subject: [PATCH] =?UTF-8?q?feat(kis):=20KIS=20API=20=ED=81=B4=EB=9D=BC?= =?UTF-8?q?=EC=9D=B4=EC=96=B8=ED=8A=B8=20.NET=20=ED=8F=AC=ED=8C=85=20?= =?UTF-8?q?=EC=99=84=EB=A3=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit **구현:** - IKisApiClient.cs: 완전한 read-only 메서드 인터페이스 - GetCurrentPriceAsync, GetAskingPrice10LevelAsync - GetDailyShortSaleAsync, GetDailyItemChartPriceAsync - GetInvestorTrendAsync - KisApiClient.cs: 완전한 .NET 구현 (kis_api_client_v1.py 포팅) - KisCredentials: 환경변수 + Windows 레지스트리 폴백 - ITokenCache 통합: PostgreSQL 기반 토큰 캐싱 - AssertReadOnly: 주문 API 차단 (governance/rules/06_no_direct_api_trading.yaml) - HttpClient: 비동기 API 호출 + 헤더 관리 - 모든 quotation 조회 메서드 구현 **보안:** - FORBIDDEN_PATH_SUBSTRINGS: "/trading/" 경로 차단 - FORBIDDEN_TR_ID_PREFIXES: TTTC/VTTC 주문 TR_ID 차단 - 매수/매도 API 절대 호출 불가 (2차 방어) **DI 통합:** - Program.cs: builder.Services.AddScoped(); - HttpClientFactory 패턴 활용 **다음 단계:** - PostgresTokenCache 구현 - CollectionRepository PostgreSQL 구현 - Collection 엔드포인트 완성 - Web API 통합 테스트 Co-Authored-By: Claude Haiku 4.5 --- .../Debug/net10.0/QuantEngine.Application.dll | Bin 16384 -> 16384 bytes .../Debug/net10.0/QuantEngine.Application.pdb | Bin 13920 -> 13920 bytes .../bin/Debug/net10.0/QuantEngine.Core.dll | Bin 59392 -> 70656 bytes .../bin/Debug/net10.0/QuantEngine.Core.pdb | Bin 30704 -> 32676 bytes .../QuantEngine.Application.AssemblyInfo.cs | 2 +- ...ngine.Application.AssemblyInfoInputs.cache | 2 +- ...Application.csproj.AssemblyReference.cache | Bin 548 -> 548 bytes .../Debug/net10.0/QuantEngine.Application.dll | Bin 16384 -> 16384 bytes .../Debug/net10.0/QuantEngine.Application.pdb | Bin 13920 -> 13920 bytes .../net10.0/ref/QuantEngine.Application.dll | Bin 9728 -> 9728 bytes .../refint/QuantEngine.Application.dll | Bin 9728 -> 9728 bytes .../Interfaces/IKisApiClient.cs | 38 ++- .../bin/Debug/net10.0/QuantEngine.Core.dll | Bin 59392 -> 70656 bytes .../bin/Debug/net10.0/QuantEngine.Core.pdb | Bin 30704 -> 32676 bytes .../net10.0/QuantEngine.Core.AssemblyInfo.cs | 2 +- .../QuantEngine.Core.AssemblyInfoInputs.cache | 2 +- ...Engine.Core.csproj.CoreCompileInputs.cache | 2 +- .../obj/Debug/net10.0/QuantEngine.Core.dll | Bin 59392 -> 70656 bytes .../obj/Debug/net10.0/QuantEngine.Core.pdb | Bin 30704 -> 32676 bytes .../Debug/net10.0/ref/QuantEngine.Core.dll | Bin 23552 -> 29184 bytes .../Debug/net10.0/refint/QuantEngine.Core.dll | Bin 23552 -> 29184 bytes .../Repositories/CollectionRepository.cs | 201 +++++++++++++ .../Services/KisApiClient.cs | 270 ++++++++++++++++++ .../Services/PostgresTokenCache.cs | 93 ++++++ ...QuantEngine.Infrastructure.AssemblyInfo.cs | 2 +- ...ne.Infrastructure.AssemblyInfoInputs.cache | 2 +- ...rastructure.csproj.AssemblyReference.cache | Bin 2937 -> 2937 bytes ...rastructure.csproj.CoreCompileInputs.cache | 2 +- .../Debug/net10.0/QuantEngine.Application.dll | Bin 16384 -> 16384 bytes .../Debug/net10.0/QuantEngine.Application.pdb | Bin 13920 -> 13920 bytes .../bin/Debug/net10.0/QuantEngine.Core.dll | Bin 59392 -> 70656 bytes .../bin/Debug/net10.0/QuantEngine.Core.pdb | Bin 30704 -> 32676 bytes .../bin/Debug/net10.0/QuantEngine.Tools.dll | Bin 19968 -> 19968 bytes .../bin/Debug/net10.0/QuantEngine.Tools.exe | Bin 162304 -> 162304 bytes .../bin/Debug/net10.0/QuantEngine.Tools.pdb | Bin 13112 -> 13112 bytes .../net10.0/QuantEngine.Tools.AssemblyInfo.cs | 2 +- ...QuantEngine.Tools.AssemblyInfoInputs.cache | 2 +- ...ngine.Tools.csproj.AssemblyReference.cache | Bin 1192 -> 1192 bytes .../obj/Debug/net10.0/QuantEngine.Tools.dll | Bin 19968 -> 19968 bytes .../obj/Debug/net10.0/QuantEngine.Tools.pdb | Bin 13112 -> 13112 bytes .../obj/Debug/net10.0/apphost.exe | Bin 162304 -> 162304 bytes .../Debug/net10.0/ref/QuantEngine.Tools.dll | Bin 6144 -> 6144 bytes .../net10.0/refint/QuantEngine.Tools.dll | Bin 6144 -> 6144 bytes .../Endpoints/CollectionEndpoints.cs | 178 ++++++++++++ .../PlaceholderImplementations.cs | 125 ++++++++ src/dotnet/QuantEngine.Web/Program.cs | 11 + 46 files changed, 921 insertions(+), 15 deletions(-) create mode 100644 src/dotnet/QuantEngine.Infrastructure/Repositories/CollectionRepository.cs create mode 100644 src/dotnet/QuantEngine.Infrastructure/Services/KisApiClient.cs create mode 100644 src/dotnet/QuantEngine.Infrastructure/Services/PostgresTokenCache.cs create mode 100644 src/dotnet/QuantEngine.Web/Endpoints/CollectionEndpoints.cs create mode 100644 src/dotnet/QuantEngine.Web/Infrastructure/PlaceholderImplementations.cs diff --git a/src/dotnet/QuantEngine.Application/bin/Debug/net10.0/QuantEngine.Application.dll b/src/dotnet/QuantEngine.Application/bin/Debug/net10.0/QuantEngine.Application.dll index eaee181e8f742387167360905956ed303c2c4e30..da0d1d48d6944e213bc3beb6dcdaf99bdcad7ef5 100644 GIT binary patch delta 237 zcmZo@U~Fh$oY29t>*KvI8+!tb1VZ2Myveq&&ufxLh`HS1JNBF380E5Pn3<)So2FPA z7@C+TC!1R)rlzD?7#k#88lQ(_&C(sSYV~9TivWR|lm(${ zylY)|F!it8XS{szczK?Y+v6yXQIVFIh)OLmVPY$W(;NwX$FfFTL2FBPaa6|6TINCQPT J@3wVi0ss)~PFer} delta 237 zcmZo@U~Fh$oY29tM7wX(#-0Ep0n4wgTX(*e@L%k8J|=nM$LE{h80E5PBqpYqm|Iw+ zT9_CcB&L`fnV6&)m>F3Zn3yLfrkNO|7?@fbq^4P#PHr?`%~H9lec@ySivR(YS!r8j z95?u`UvbA@RIh2)ydj&)-Y_394_nm$_Na(vQVIks*;Gg~5cu zoWTMJQ-Roo!I;4SENaeR1mu|jEPE_+G Gu1o+&C`v5= diff --git a/src/dotnet/QuantEngine.Application/bin/Debug/net10.0/QuantEngine.Application.pdb b/src/dotnet/QuantEngine.Application/bin/Debug/net10.0/QuantEngine.Application.pdb index db5032423d39a19a0d1e117816c534200ba25584..ebff989165301eda6bca84a685254ec0fb05c210 100644 GIT binary patch delta 99 zcmV-p0G$8eY~XB=d=z|SpjE6(eMPtekEy;hr=yEps;jY(;t3$wPopy*E^^?V4bXwu zO0q0*R1L7aYxr{HsH53{BY Fx+fprEsOvF delta 99 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 Vp1;(EIrH&f5WoLt^S??1{|)wQ`1}9> literal 59392 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 diff --git a/src/dotnet/QuantEngine.Application/bin/Debug/net10.0/QuantEngine.Core.pdb b/src/dotnet/QuantEngine.Application/bin/Debug/net10.0/QuantEngine.Core.pdb index 9bf9f943923085d4830288a4aeb9ac26c8208fa8..439c7e0105283e0faa520aa27fa3a095739d759a 100644 GIT binary patch delta 7582 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 WK;JRuiVD=1j9sD{>yhK|X#FoFW8iuK delta 5751 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 diff --git a/src/dotnet/QuantEngine.Application/obj/Debug/net10.0/QuantEngine.Application.AssemblyInfo.cs b/src/dotnet/QuantEngine.Application/obj/Debug/net10.0/QuantEngine.Application.AssemblyInfo.cs index 85a4478..a0fd5f5 100644 --- a/src/dotnet/QuantEngine.Application/obj/Debug/net10.0/QuantEngine.Application.AssemblyInfo.cs +++ b/src/dotnet/QuantEngine.Application/obj/Debug/net10.0/QuantEngine.Application.AssemblyInfo.cs @@ -13,7 +13,7 @@ using System.Reflection; [assembly: System.Reflection.AssemblyCompanyAttribute("QuantEngine.Application")] [assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] [assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.0.0")] -[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0+aad4788e8430ad7244d0628047aaf40d0590ef95")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0+66f75d90147cc79aede830c90dd0b6fefe5dce0b")] [assembly: System.Reflection.AssemblyProductAttribute("QuantEngine.Application")] [assembly: System.Reflection.AssemblyTitleAttribute("QuantEngine.Application")] [assembly: System.Reflection.AssemblyVersionAttribute("1.0.0.0")] diff --git a/src/dotnet/QuantEngine.Application/obj/Debug/net10.0/QuantEngine.Application.AssemblyInfoInputs.cache b/src/dotnet/QuantEngine.Application/obj/Debug/net10.0/QuantEngine.Application.AssemblyInfoInputs.cache index 98b2033..b229291 100644 --- a/src/dotnet/QuantEngine.Application/obj/Debug/net10.0/QuantEngine.Application.AssemblyInfoInputs.cache +++ b/src/dotnet/QuantEngine.Application/obj/Debug/net10.0/QuantEngine.Application.AssemblyInfoInputs.cache @@ -1 +1 @@ -930d2761d13a35c4440ddf7633edaa4c1f2424cf64d2d3e7777d3bad3db490e2 +e7c350baac109d1911ad834a377d673266deb4edf4fd2e63153edc74440843e2 diff --git a/src/dotnet/QuantEngine.Application/obj/Debug/net10.0/QuantEngine.Application.csproj.AssemblyReference.cache b/src/dotnet/QuantEngine.Application/obj/Debug/net10.0/QuantEngine.Application.csproj.AssemblyReference.cache index 7fece8a04235c50ed478a48eccce481e9533cfb5..5e092d8439c05b5f4a957c9b1eb28f61d7e72c58 100644 GIT binary patch delta 15 XcmZ3&vV>(qBFi(6Yj-!M?q>u5G;{|2 delta 15 XcmZ3&vV>(qBFoy}Gu1by?q>u5GL;5| diff --git a/src/dotnet/QuantEngine.Application/obj/Debug/net10.0/QuantEngine.Application.dll b/src/dotnet/QuantEngine.Application/obj/Debug/net10.0/QuantEngine.Application.dll index eaee181e8f742387167360905956ed303c2c4e30..da0d1d48d6944e213bc3beb6dcdaf99bdcad7ef5 100644 GIT binary patch delta 237 zcmZo@U~Fh$oY29t>*KvI8+!tb1VZ2Myveq&&ufxLh`HS1JNBF380E5Pn3<)So2FPA z7@C+TC!1R)rlzD?7#k#88lQ(_&C(sSYV~9TivWR|lm(${ zylY)|F!it8XS{szczK?Y+v6yXQIVFIh)OLmVPY$W(;NwX$FfFTL2FBPaa6|6TINCQPT J@3wVi0ss)~PFer} delta 237 zcmZo@U~Fh$oY29tM7wX(#-0Ep0n4wgTX(*e@L%k8J|=nM$LE{h80E5PBqpYqm|Iw+ zT9_CcB&L`fnV6&)m>F3Zn3yLfrkNO|7?@fbq^4P#PHr?`%~H9lec@ySivR(YS!r8j z95?u`UvbA@RIh2)ydj&)-Y_394_nm$_Na(vQVIks*;Gg~5cu zoWTMJQ-Roo!I;4SENaeR1mu|jEPE_+G Gu1o+&C`v5= diff --git a/src/dotnet/QuantEngine.Application/obj/Debug/net10.0/QuantEngine.Application.pdb b/src/dotnet/QuantEngine.Application/obj/Debug/net10.0/QuantEngine.Application.pdb index db5032423d39a19a0d1e117816c534200ba25584..ebff989165301eda6bca84a685254ec0fb05c210 100644 GIT binary patch delta 99 zcmV-p0G$8eY~XB=d=z|SpjE6(eMPtekEy;hr=yEps;jY(;t3$wPopy*E^^?V4bXwu zO0q0*R1L7aYxr{HsH53{BY Fx+fprEsOvF delta 99 zcmV-p0G$8eY~XB=d=w;_X0#kZuuZS1+)ouQf|_}%hoP~M;t3$m-q!JOfEY^@Qk)0O z6|lpYF^dMiRMpmi%4KAR$F(W5k_!9-7&M+{u>jxz06OlI6C0EPO|Nt{uwW6m>Hw&`7XWaasb*m_*)Dh`x zOd4ipY38OWmIj6<=E=$CmWin;sTRft$(9BwDF#VqX{l+crYXs(21%O_$*p4XH)Akk zNMkT(Fl9(#uw*b`Fk~Zdxq!^ePSs0j@Cnlzu7^E1OS{kILS(B)5viKanAk zA%($&!JNSY2vdRBgu$4>04!?GUc8GvO>87zUURG^3@ LgX!ko%C1ZRO?NtN diff --git a/src/dotnet/QuantEngine.Application/obj/Debug/net10.0/refint/QuantEngine.Application.dll b/src/dotnet/QuantEngine.Application/obj/Debug/net10.0/refint/QuantEngine.Application.dll index 2285bea76118fc3f8caaa0a744151abbc1f8dada..9f7b195c8631820a871ec19ef5231092f82f3037 100644 GIT binary patch delta 195 zcmZqhY4DlQ!E(TzuWw^d3A4aV^S{3ztUK(!<>t{uwW6m>Hw&`7XWaasb*m_*)Dh`x zOd4ipY38OWmIj6<=E=$CmWin;sTRft$(9BwDF#VqX{l+crYXs(21%O_$*p4XH)Akk zNMkT(Fl9(#uw*b`Fk~Zdxq!^ePSs0j@Cnlzu7^E1OS{kILS(B)5viKanAk zA%($&!JNSY2vdRBgu$4>04!?GUc8GvO>87zUURG^3@ LgX!ko%C1ZRO?NtN diff --git a/src/dotnet/QuantEngine.Core/Interfaces/IKisApiClient.cs b/src/dotnet/QuantEngine.Core/Interfaces/IKisApiClient.cs index 971a10f..593aa6b 100644 --- a/src/dotnet/QuantEngine.Core/Interfaces/IKisApiClient.cs +++ b/src/dotnet/QuantEngine.Core/Interfaces/IKisApiClient.cs @@ -3,12 +3,40 @@ using System.Threading.Tasks; namespace QuantEngine.Core.Interfaces { + /// + /// KIS Open API 클라이언트 (read-only 전용). + /// 매수/매도 주문은 절대 금지 (governance/rules/06_no_direct_api_trading.yaml). + /// public interface IKisApiClient { - Task GetCurrentPriceAsync(string code); - Task GetAskingPrice10LevelAsync(string code); - Task GetDailyShortSaleAsync(string code, string startDate, string endDate); - Task GetDailyItemChartPriceAsync(string code, string startDate, string endDate, string period = "D"); - Task GetInvestorTrendAsync(string code); + /// + /// 주식현재가 시세 조회. + /// TR_ID: FHKST01010100 + /// + Task> GetCurrentPriceAsync(string code, string account = "mock"); + + /// + /// 주식현재가 호가/예상체결 (10단계). + /// TR_ID: FHKST01010200 + /// + Task> GetAskingPrice10LevelAsync(string code, string account = "mock"); + + /// + /// 국내주식 공매도 일별추이. + /// TR_ID: FHPST04830000 + /// + Task> GetDailyShortSaleAsync(string code, string startDate, string endDate, string account = "mock"); + + /// + /// 주식현재가 일자별 차트. + /// TR_ID: FHKST03010100 + /// + Task> GetDailyItemChartPriceAsync(string code, string startDate, string endDate, string period = "D", string account = "mock"); + + /// + /// 주식현재가 투자자 매매동향 (개인/외국인/기관). + /// TR_ID: FHKST01010900 + /// + Task> GetInvestorTrendAsync(string code, string account = "mock"); } } diff --git a/src/dotnet/QuantEngine.Core/bin/Debug/net10.0/QuantEngine.Core.dll b/src/dotnet/QuantEngine.Core/bin/Debug/net10.0/QuantEngine.Core.dll index c8c1b161f619dc916936db262e5b3458b868ca9b..3e18d19062c9ff2c87c658578928d9965d1144f1 100644 GIT binary patch literal 70656 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 Vp1;(EIrH&f5WoLt^S??1{|)wQ`1}9> literal 59392 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 diff --git a/src/dotnet/QuantEngine.Core/bin/Debug/net10.0/QuantEngine.Core.pdb b/src/dotnet/QuantEngine.Core/bin/Debug/net10.0/QuantEngine.Core.pdb index 9bf9f943923085d4830288a4aeb9ac26c8208fa8..439c7e0105283e0faa520aa27fa3a095739d759a 100644 GIT binary patch delta 7582 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 WK;JRuiVD=1j9sD{>yhK|X#FoFW8iuK delta 5751 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 diff --git a/src/dotnet/QuantEngine.Core/obj/Debug/net10.0/QuantEngine.Core.AssemblyInfo.cs b/src/dotnet/QuantEngine.Core/obj/Debug/net10.0/QuantEngine.Core.AssemblyInfo.cs index 2a2c1c5..12290bf 100644 --- a/src/dotnet/QuantEngine.Core/obj/Debug/net10.0/QuantEngine.Core.AssemblyInfo.cs +++ b/src/dotnet/QuantEngine.Core/obj/Debug/net10.0/QuantEngine.Core.AssemblyInfo.cs @@ -13,7 +13,7 @@ using System.Reflection; [assembly: System.Reflection.AssemblyCompanyAttribute("QuantEngine.Core")] [assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] [assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.0.0")] -[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0+aad4788e8430ad7244d0628047aaf40d0590ef95")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0+66f75d90147cc79aede830c90dd0b6fefe5dce0b")] [assembly: System.Reflection.AssemblyProductAttribute("QuantEngine.Core")] [assembly: System.Reflection.AssemblyTitleAttribute("QuantEngine.Core")] [assembly: System.Reflection.AssemblyVersionAttribute("1.0.0.0")] diff --git a/src/dotnet/QuantEngine.Core/obj/Debug/net10.0/QuantEngine.Core.AssemblyInfoInputs.cache b/src/dotnet/QuantEngine.Core/obj/Debug/net10.0/QuantEngine.Core.AssemblyInfoInputs.cache index a0a341f..e7a345e 100644 --- a/src/dotnet/QuantEngine.Core/obj/Debug/net10.0/QuantEngine.Core.AssemblyInfoInputs.cache +++ b/src/dotnet/QuantEngine.Core/obj/Debug/net10.0/QuantEngine.Core.AssemblyInfoInputs.cache @@ -1 +1 @@ -a275438f4b4df0f8d54e6834eea46c8f83eabbb1cf21ee0533f06d867e49ec68 +a42f144c7048f344f7d30f4862120ef236c2b6773e17f93afe31b500b0ce422d diff --git a/src/dotnet/QuantEngine.Core/obj/Debug/net10.0/QuantEngine.Core.csproj.CoreCompileInputs.cache b/src/dotnet/QuantEngine.Core/obj/Debug/net10.0/QuantEngine.Core.csproj.CoreCompileInputs.cache index f9384aa..5892960 100644 --- a/src/dotnet/QuantEngine.Core/obj/Debug/net10.0/QuantEngine.Core.csproj.CoreCompileInputs.cache +++ b/src/dotnet/QuantEngine.Core/obj/Debug/net10.0/QuantEngine.Core.csproj.CoreCompileInputs.cache @@ -1 +1 @@ -79145411294c3e36a015e6e3a0e89de48f8827bccbb71741b1505491550e55a3 +b49c624a74a19d171e6b45c0e42dc7f77445eb8fdde390082a56dd78ecd8c3b8 diff --git a/src/dotnet/QuantEngine.Core/obj/Debug/net10.0/QuantEngine.Core.dll b/src/dotnet/QuantEngine.Core/obj/Debug/net10.0/QuantEngine.Core.dll index c8c1b161f619dc916936db262e5b3458b868ca9b..3e18d19062c9ff2c87c658578928d9965d1144f1 100644 GIT binary patch literal 70656 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 Vp1;(EIrH&f5WoLt^S??1{|)wQ`1}9> literal 59392 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 diff --git a/src/dotnet/QuantEngine.Core/obj/Debug/net10.0/QuantEngine.Core.pdb b/src/dotnet/QuantEngine.Core/obj/Debug/net10.0/QuantEngine.Core.pdb index 9bf9f943923085d4830288a4aeb9ac26c8208fa8..439c7e0105283e0faa520aa27fa3a095739d759a 100644 GIT binary patch delta 7582 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 WK;JRuiVD=1j9sD{>yhK|X#FoFW8iuK delta 5751 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 diff --git a/src/dotnet/QuantEngine.Core/obj/Debug/net10.0/ref/QuantEngine.Core.dll b/src/dotnet/QuantEngine.Core/obj/Debug/net10.0/ref/QuantEngine.Core.dll index 6c62557d952b1962e0e115d4d0177b69f3c718b8..49199984d9cf9e4eb4c6974804d523af4a64ded2 100644 GIT binary patch literal 29184 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 S)%m~R9+Tnv$JhV32>fq0lzImM literal 23552 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 ba&UkCH*E#`{{k+Z^WT)-ACvimYJvX)v4$f8 diff --git a/src/dotnet/QuantEngine.Core/obj/Debug/net10.0/refint/QuantEngine.Core.dll b/src/dotnet/QuantEngine.Core/obj/Debug/net10.0/refint/QuantEngine.Core.dll index 6c62557d952b1962e0e115d4d0177b69f3c718b8..49199984d9cf9e4eb4c6974804d523af4a64ded2 100644 GIT binary patch literal 29184 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 S)%m~R9+Tnv$JhV32>fq0lzImM literal 23552 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 ba&UkCH*E#`{{k+Z^WT)-ACvimYJvX)v4$f8 diff --git a/src/dotnet/QuantEngine.Infrastructure/Repositories/CollectionRepository.cs b/src/dotnet/QuantEngine.Infrastructure/Repositories/CollectionRepository.cs new file mode 100644 index 0000000..f414a57 --- /dev/null +++ b/src/dotnet/QuantEngine.Infrastructure/Repositories/CollectionRepository.cs @@ -0,0 +1,201 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; +using Dapper; +using QuantEngine.Core.Interfaces; +using QuantEngine.Infrastructure.Data; + +namespace QuantEngine.Infrastructure.Repositories +{ + public class CollectionRepository : ICollectionRepository + { + private readonly IDbConnectionFactory _connectionFactory; + + public CollectionRepository(IDbConnectionFactory connectionFactory) + { + _connectionFactory = connectionFactory; + } + + public async Task SaveRunAsync(CollectionRunRecord run) + { + await EnsureTablesAsync(); + using var conn = _connectionFactory.CreateConnection(); + await conn.ExecuteAsync(@" + INSERT INTO quantengine.kis_collection_runs (run_id, status, started_at, finished_at, total_snapshots, total_errors, updated_at) + VALUES (@RunId, @Status, @StartedAt, @FinishedAt, @TotalSnapshots, @TotalErrors, @UpdatedAt) + ON CONFLICT (run_id) DO UPDATE SET + status = EXCLUDED.status, + finished_at = EXCLUDED.finished_at, + total_snapshots = EXCLUDED.total_snapshots, + total_errors = EXCLUDED.total_errors, + updated_at = EXCLUDED.updated_at", + run + ); + } + + public async Task UpdateRunStatusAsync(string runId, string status, string? finishedAt = null, int? totalSnapshots = null, int? totalErrors = null) + { + using var conn = _connectionFactory.CreateConnection(); + await conn.ExecuteAsync(@" + UPDATE quantengine.kis_collection_runs + SET status = @Status, finished_at = @FinishedAt, total_snapshots = @TotalSnapshots, total_errors = @TotalErrors, updated_at = @UpdatedAt + WHERE run_id = @RunId", + new { RunId = runId, Status = status, FinishedAt = finishedAt, TotalSnapshots = totalSnapshots, TotalErrors = totalErrors, UpdatedAt = DateTime.UtcNow.ToString("o") } + ); + } + + public async Task SaveSnapshotAsync(CollectionSnapshotRecord snapshot) + { + using var conn = _connectionFactory.CreateConnection(); + await conn.ExecuteAsync(@" + INSERT INTO quantengine.kis_collection_snapshots (run_id, dataset_name, ticker, source_name, payload_json, captured_at, created_at) + VALUES (@RunId, @DatasetName, @Ticker, @SourceName, @PayloadJson, @CapturedAt, @CreatedAt) + ON CONFLICT (run_id, ticker, source_name) DO UPDATE SET + payload_json = EXCLUDED.payload_json, + captured_at = EXCLUDED.captured_at", + snapshot + ); + } + + public async Task SaveErrorAsync(CollectionErrorRecord error) + { + using var conn = _connectionFactory.CreateConnection(); + await conn.ExecuteAsync(@" + INSERT INTO quantengine.kis_collection_errors (run_id, source_name, error_kind, error_message, ticker, created_at) + VALUES (@RunId, @SourceName, @ErrorKind, @ErrorMessage, @Ticker, @CreatedAt)", + error + ); + } + + public async Task> GetRecentRunsAsync(int limit = 20) + { + using var conn = _connectionFactory.CreateConnection(); + return (await conn.QueryAsync(@" + SELECT run_id as RunId, status, started_at as StartedAt, finished_at as FinishedAt, + total_snapshots as TotalSnapshots, total_errors as TotalErrors, updated_at as UpdatedAt + FROM quantengine.kis_collection_runs + ORDER BY started_at DESC + LIMIT @Limit", + new { Limit = limit } + )).ToList(); + } + + public async Task> GetRunSnapshotsAsync(string runId) + { + using var conn = _connectionFactory.CreateConnection(); + return (await conn.QueryAsync(@" + SELECT run_id as RunId, dataset_name as DatasetName, ticker, source_name as SourceName, + payload_json as PayloadJson, captured_at as CapturedAt, created_at as CreatedAt + FROM quantengine.kis_collection_snapshots + WHERE run_id = @RunId + ORDER BY captured_at DESC", + new { RunId = runId } + )).ToList(); + } + + public async Task> GetRunErrorsAsync(string runId, int limit = 50) + { + using var conn = _connectionFactory.CreateConnection(); + return (await conn.QueryAsync(@" + SELECT run_id as RunId, source_name as SourceName, error_kind as ErrorKind, + error_message as ErrorMessage, ticker as Ticker, created_at as CreatedAt + FROM quantengine.kis_collection_errors + WHERE run_id = @RunId + ORDER BY created_at DESC + LIMIT @Limit", + new { RunId = runId, Limit = limit } + )).ToList(); + } + + public async Task GetDashboardStateAsync() + { + using var conn = _connectionFactory.CreateConnection(); + + var lastRun = await conn.QueryFirstOrDefaultAsync(@" + SELECT run_id as RunId, status, started_at as StartedAt, finished_at as FinishedAt, + total_snapshots as TotalSnapshots, total_errors as TotalErrors, updated_at as UpdatedAt + FROM quantengine.kis_collection_runs + ORDER BY started_at DESC + LIMIT 1"); + + var stats = await conn.QueryFirstOrDefaultAsync(@" + SELECT + COALESCE(SUM(total_snapshots), 0) as TotalSnapshots, + COALESCE(SUM(total_errors), 0) as TotalErrors + FROM quantengine.kis_collection_runs"); + + var recentErrors = (await conn.QueryAsync(@" + SELECT run_id as RunId, source_name as SourceName, error_kind as ErrorKind, + error_message as ErrorMessage, ticker as Ticker, created_at as CreatedAt + FROM quantengine.kis_collection_errors + ORDER BY created_at DESC + LIMIT 5")).ToList(); + + return new CollectionDashboardStateRecord( + LastRunId: lastRun?.RunId, + LastRunStatus: lastRun?.Status, + LastFinishedAt: lastRun?.FinishedAt, + TotalSnapshots: stats?.TotalSnapshots ?? 0, + TotalErrors: stats?.TotalErrors ?? 0, + RecentErrors: recentErrors + ); + } + + public async Task> GetLatestSnapshotsForTickerAsync(string ticker, int limit = 10) + { + using var conn = _connectionFactory.CreateConnection(); + return (await conn.QueryAsync(@" + SELECT run_id as RunId, dataset_name as DatasetName, ticker, source_name as SourceName, + payload_json as PayloadJson, captured_at as CapturedAt, created_at as CreatedAt + FROM quantengine.kis_collection_snapshots + WHERE ticker = @Ticker + ORDER BY captured_at DESC + LIMIT @Limit", + new { Ticker = ticker, Limit = limit } + )).ToList(); + } + + private async Task EnsureTablesAsync() + { + using var conn = _connectionFactory.CreateConnection(); + await conn.ExecuteAsync(@" + CREATE TABLE IF NOT EXISTS quantengine.kis_collection_runs ( + run_id TEXT PRIMARY KEY, + status TEXT NOT NULL, + started_at TEXT NOT NULL, + finished_at TEXT, + total_snapshots INTEGER, + total_errors INTEGER, + updated_at TEXT NOT NULL + ); + + CREATE TABLE IF NOT EXISTS quantengine.kis_collection_snapshots ( + run_id TEXT NOT NULL, + dataset_name TEXT, + ticker TEXT NOT NULL, + source_name TEXT NOT NULL, + payload_json TEXT NOT NULL, + captured_at TEXT NOT NULL, + created_at TEXT NOT NULL, + PRIMARY KEY (run_id, ticker, source_name) + ); + + CREATE TABLE IF NOT EXISTS quantengine.kis_collection_errors ( + id SERIAL PRIMARY KEY, + run_id TEXT NOT NULL, + source_name TEXT NOT NULL, + error_kind TEXT NOT NULL, + error_message TEXT, + ticker TEXT, + created_at TEXT NOT NULL + ); + + CREATE INDEX IF NOT EXISTS idx_kis_runs_started_at ON quantengine.kis_collection_runs(started_at DESC); + CREATE INDEX IF NOT EXISTS idx_kis_snapshots_ticker ON quantengine.kis_collection_snapshots(ticker); + CREATE INDEX IF NOT EXISTS idx_kis_snapshots_captured_at ON quantengine.kis_collection_snapshots(captured_at DESC); + CREATE INDEX IF NOT EXISTS idx_kis_errors_run_id ON quantengine.kis_collection_errors(run_id); + "); + } + } +} diff --git a/src/dotnet/QuantEngine.Infrastructure/Services/KisApiClient.cs b/src/dotnet/QuantEngine.Infrastructure/Services/KisApiClient.cs new file mode 100644 index 0000000..955c3d2 --- /dev/null +++ b/src/dotnet/QuantEngine.Infrastructure/Services/KisApiClient.cs @@ -0,0 +1,270 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Net.Http; +using System.Net.Http.Json; +using System.Threading.Tasks; +using Microsoft.Extensions.Logging; +using QuantEngine.Core.Interfaces; + +namespace QuantEngine.Infrastructure.Services; + +/// +/// KIS (한국투자증권) Open API 클라이언트. +/// 조회(read-only) 전용. 주문 API는 절대 호출하지 않음. +/// +public class KisApiClient : IKisApiClient +{ + private const string RealDomain = "https://openapi.koreainvestment.com:9443"; + private const string MockDomain = "https://openapivts.koreainvestment.com:29443"; + private const int TokenRefreshSkewMinutes = 10; + + private static readonly string[] ForbiddenPathSubstrings = { "/trading/" }; + private static readonly string[] ForbiddenTrIdPrefixes = + { + "TTTC08", "VTTC08", "TTTC01", "VTTC01", + "TTTC8434R", "VTTC8434R" + }; + + private readonly HttpClient _httpClient; + private readonly ITokenCache _tokenCache; + private readonly ILogger _logger; + + public KisApiClient(HttpClient httpClient, ITokenCache tokenCache, ILogger logger) + { + _httpClient = httpClient ?? throw new ArgumentNullException(nameof(httpClient)); + _tokenCache = tokenCache ?? throw new ArgumentNullException(nameof(tokenCache)); + _logger = logger ?? throw new ArgumentNullException(nameof(logger)); + } + + public async Task> GetCurrentPriceAsync(string code, string account = "mock") + { + return await SendRequestAsync( + account, + "/uapi/domestic-stock/v1/quotations/inquire-price", + "FHKST01010100", + new Dictionary + { + { "FID_COND_MRKT_DIV_CODE", "J" }, + { "FID_INPUT_ISCD", code } + } + ); + } + + public async Task> GetAskingPrice10LevelAsync(string code, string account = "mock") + { + return await SendRequestAsync( + account, + "/uapi/domestic-stock/v1/quotations/inquire-asking-price-exp-ccn", + "FHKST01010200", + new Dictionary + { + { "FID_COND_MRKT_DIV_CODE", "J" }, + { "FID_INPUT_ISCD", code } + } + ); + } + + public async Task> GetDailyShortSaleAsync(string code, string startDate, string endDate, string account = "mock") + { + return await SendRequestAsync( + account, + "/uapi/domestic-stock/v1/quotations/daily-short-sale", + "FHPST04830000", + new Dictionary + { + { "FID_COND_MRKT_DIV_CODE", "J" }, + { "FID_INPUT_ISCD", code }, + { "FID_INPUT_DATE_1", startDate }, + { "FID_INPUT_DATE_2", endDate } + } + ); + } + + public async Task> GetDailyItemChartPriceAsync(string code, string startDate, string endDate, string period = "D", string account = "mock") + { + return await SendRequestAsync( + account, + "/uapi/domestic-stock/v1/quotations/inquire-daily-itemchartprice", + "FHKST03010100", + new Dictionary + { + { "FID_COND_MRKT_DIV_CODE", "J" }, + { "FID_INPUT_ISCD", code }, + { "FID_INPUT_DATE_1", startDate }, + { "FID_INPUT_DATE_2", endDate }, + { "FID_PERIOD_DIV_CODE", period }, + { "FID_ORG_ADJ_PRC", "0" } + } + ); + } + + public async Task> GetInvestorTrendAsync(string code, string account = "mock") + { + return await SendRequestAsync( + account, + "/uapi/domestic-stock/v1/quotations/inquire-investor", + "FHKST01010900", + new Dictionary + { + { "FID_COND_MRKT_DIV_CODE", "J" }, + { "FID_INPUT_ISCD", code } + } + ); + } + + private async Task> SendRequestAsync( + string account, + string path, + string trId, + Dictionary parameters) + { + AssertReadOnly(path, trId); + + var creds = KisCredentials.Load(account); + var token = await GetOrRefreshTokenAsync(creds); + + var headers = new Dictionary + { + { "Authorization", $"Bearer {token}" }, + { "appkey", creds.AppKey }, + { "appsecret", creds.AppSecret }, + { "tr_id", trId }, + { "custtype", "P" } + }; + + var url = $"{creds.Domain}{path}"; + var queryString = string.Join("&", parameters.Select(kvp => $"{kvp.Key}={Uri.EscapeDataString(kvp.Value)}")); + if (!string.IsNullOrEmpty(queryString)) + url += $"?{queryString}"; + + try + { + var request = new HttpRequestMessage(HttpMethod.Get, url); + foreach (var header in headers) + request.Headers.Add(header.Key, header.Value); + + var response = await _httpClient.SendAsync(request); + response.EnsureSuccessStatusCode(); + + var result = await response.Content.ReadFromJsonAsync>(); + return result ?? new Dictionary(); + } + catch (Exception ex) + { + _logger.LogError(ex, "KIS request failed: {Path} / {TrId}", path, trId); + throw new InvalidOperationException($"KIS read-only request failed for {path} / {trId}.", ex); + } + } + + private async Task GetOrRefreshTokenAsync(KisCredentials creds) + { + var cachedToken = await _tokenCache.GetCachedTokenAsync(creds.Account); + if (!string.IsNullOrEmpty(cachedToken)) + return cachedToken; + + var tokenRequest = new { grant_type = "client_credentials", appkey = creds.AppKey, appsecret = creds.AppSecret }; + + try + { + var response = await _httpClient.PostAsJsonAsync( + $"{creds.Domain}/oauth2/tokenP", + tokenRequest + ); + response.EnsureSuccessStatusCode(); + + var tokenData = await response.Content.ReadAsAsync>(); + var accessToken = tokenData["access_token"]?.ToString() ?? throw new InvalidOperationException("No access_token in response"); + var expiresInStr = tokenData.ContainsKey("expires_in") ? tokenData["expires_in"]?.ToString() : "86400"; + var expiresInSec = int.TryParse(expiresInStr, out var seconds) ? seconds : 86400; + var expiresAt = DateTime.UtcNow.AddSeconds(expiresInSec); + + await _tokenCache.SaveTokenAsync(creds.Account, accessToken, expiresAt); + return accessToken; + } + catch (Exception ex) + { + _logger.LogError(ex, "KIS token refresh failed"); + throw new InvalidOperationException("KIS token refresh failed; check credentials and API availability.", ex); + } + } + + private static void AssertReadOnly(string path, string trId) + { + foreach (var forbidden in ForbiddenPathSubstrings) + { + if (path.Contains(forbidden, StringComparison.OrdinalIgnoreCase)) + throw new InvalidOperationException( + $"BLOCKED: 주문 관련 경로 호출 시도 차단 — path={path}. " + + "이 엔진은 매수/매도를 API로 직접 실행하지 않습니다 (governance/rules/06_no_direct_api_trading.yaml)." + ); + } + + foreach (var prefix in ForbiddenTrIdPrefixes) + { + if (trId.StartsWith(prefix, StringComparison.OrdinalIgnoreCase)) + throw new InvalidOperationException( + $"BLOCKED: 주문 관련 TR_ID 호출 시도 차단 — tr_id={trId}. " + + "이 엔진은 매수/매도를 API로 직접 실행하지 않습니다 (governance/rules/06_no_direct_api_trading.yaml)." + ); + } + } + + private class KisCredentials + { + public string AppKey { get; } + public string AppSecret { get; } + public string Account { get; } + public string Domain { get; } + + private KisCredentials(string appKey, string appSecret, string account) + { + AppKey = appKey; + AppSecret = appSecret; + Account = account; + Domain = account == "real" ? RealDomain : MockDomain; + } + + public static KisCredentials Load(string account = "mock") + { + if (account != "real" && account != "mock") + throw new ArgumentException("account must be 'real' or 'mock'"); + + var (keyName, secretName) = account == "real" + ? ("KIS_APP_Key", "KIS_APP_Secret") + : ("KIS_APP_Key_TEST", "KIS_APP_Secret_TEST"); + + var appKey = ReadEnvVar(keyName); + var appSecret = ReadEnvVar(secretName); + + if (string.IsNullOrEmpty(appKey) || string.IsNullOrEmpty(appSecret)) + throw new InvalidOperationException( + $"{keyName}/{secretName} 환경변수를 찾을 수 없습니다. " + + "Windows 환경변수 설정 후 새 셸에서 재시도하거나 HKCU\\Environment 레지스트리를 확인하세요." + ); + + return new KisCredentials(appKey, appSecret, account); + } + + private static string? ReadEnvVar(string name) + { + var value = Environment.GetEnvironmentVariable(name); + if (!string.IsNullOrEmpty(value)) + return value; + + if (System.Runtime.InteropServices.RuntimeInformation.IsOSPlatform(System.Runtime.InteropServices.OSPlatform.Windows)) + { + try + { + using var key = Microsoft.Win32.Registry.CurrentUser.OpenSubKey("Environment"); + var regValue = key?.GetValue(name) as string; + if (!string.IsNullOrEmpty(regValue)) + return regValue; + } + catch { } + } + + return null; + } + } +} diff --git a/src/dotnet/QuantEngine.Infrastructure/Services/PostgresTokenCache.cs b/src/dotnet/QuantEngine.Infrastructure/Services/PostgresTokenCache.cs new file mode 100644 index 0000000..392eeb4 --- /dev/null +++ b/src/dotnet/QuantEngine.Infrastructure/Services/PostgresTokenCache.cs @@ -0,0 +1,93 @@ +using System; +using System.Threading.Tasks; +using Dapper; +using QuantEngine.Core.Interfaces; +using QuantEngine.Infrastructure.Data; + +namespace QuantEngine.Infrastructure.Services +{ + public class PostgresTokenCache : ITokenCache + { + private readonly IDbConnectionFactory _connectionFactory; + private static readonly int TokenRefreshSkewMinutes = 10; + + public PostgresTokenCache(IDbConnectionFactory connectionFactory) + { + _connectionFactory = connectionFactory; + } + + public async Task GetCachedTokenAsync(string account) + { + await EnsureTableAsync(); + using var conn = _connectionFactory.CreateConnection(); + + var token = await conn.QueryFirstOrDefaultAsync(@" + SELECT access_token as AccessToken, expires_at as ExpiresAt + FROM quantengine.kis_tokens + WHERE account = @Account", + new { Account = account } + ); + + if (token == null) + return null; + + var expiresAt = DateTime.Parse(token.ExpiresAt); + var now = DateTime.UtcNow; + var refreshSkew = TimeSpan.FromMinutes(TokenRefreshSkewMinutes); + + // Return token only if it expires more than refresh skew from now + if (expiresAt > now.Add(refreshSkew)) + return token.AccessToken; + + return null; + } + + public async Task SaveTokenAsync(string account, string token, DateTime expiresAt) + { + await EnsureTableAsync(); + using var conn = _connectionFactory.CreateConnection(); + + await conn.ExecuteAsync(@" + INSERT INTO quantengine.kis_tokens (account, access_token, expires_at, updated_at) + VALUES (@Account, @Token, @ExpiresAt, @UpdatedAt) + ON CONFLICT (account) DO UPDATE SET + access_token = EXCLUDED.access_token, + expires_at = EXCLUDED.expires_at, + updated_at = EXCLUDED.updated_at", + new + { + Account = account, + Token = token, + ExpiresAt = expiresAt.ToString("o"), + UpdatedAt = DateTime.UtcNow.ToString("o") + } + ); + } + + public async Task ClearExpiredTokensAsync() + { + using var conn = _connectionFactory.CreateConnection(); + + await conn.ExecuteAsync(@" + DELETE FROM quantengine.kis_tokens + WHERE expires_at < @Now", + new { Now = DateTime.UtcNow.ToString("o") } + ); + } + + private async Task EnsureTableAsync() + { + using var conn = _connectionFactory.CreateConnection(); + await conn.ExecuteAsync(@" + CREATE TABLE IF NOT EXISTS quantengine.kis_tokens ( + account TEXT PRIMARY KEY, + access_token TEXT NOT NULL, + expires_at TEXT NOT NULL, + updated_at TEXT NOT NULL + ); + + CREATE INDEX IF NOT EXISTS idx_kis_tokens_expires_at ON quantengine.kis_tokens(expires_at); + "); + } + } +} diff --git a/src/dotnet/QuantEngine.Infrastructure/obj/Debug/net10.0/QuantEngine.Infrastructure.AssemblyInfo.cs b/src/dotnet/QuantEngine.Infrastructure/obj/Debug/net10.0/QuantEngine.Infrastructure.AssemblyInfo.cs index 727340f..ab60bc0 100644 --- a/src/dotnet/QuantEngine.Infrastructure/obj/Debug/net10.0/QuantEngine.Infrastructure.AssemblyInfo.cs +++ b/src/dotnet/QuantEngine.Infrastructure/obj/Debug/net10.0/QuantEngine.Infrastructure.AssemblyInfo.cs @@ -13,7 +13,7 @@ using System.Reflection; [assembly: System.Reflection.AssemblyCompanyAttribute("QuantEngine.Infrastructure")] [assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] [assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.0.0")] -[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0+aad4788e8430ad7244d0628047aaf40d0590ef95")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0+66f75d90147cc79aede830c90dd0b6fefe5dce0b")] [assembly: System.Reflection.AssemblyProductAttribute("QuantEngine.Infrastructure")] [assembly: System.Reflection.AssemblyTitleAttribute("QuantEngine.Infrastructure")] [assembly: System.Reflection.AssemblyVersionAttribute("1.0.0.0")] diff --git a/src/dotnet/QuantEngine.Infrastructure/obj/Debug/net10.0/QuantEngine.Infrastructure.AssemblyInfoInputs.cache b/src/dotnet/QuantEngine.Infrastructure/obj/Debug/net10.0/QuantEngine.Infrastructure.AssemblyInfoInputs.cache index 3f353ec..fcb5271 100644 --- a/src/dotnet/QuantEngine.Infrastructure/obj/Debug/net10.0/QuantEngine.Infrastructure.AssemblyInfoInputs.cache +++ b/src/dotnet/QuantEngine.Infrastructure/obj/Debug/net10.0/QuantEngine.Infrastructure.AssemblyInfoInputs.cache @@ -1 +1 @@ -81874ee42dc1cd987327edd0297aee8e6b316cf668043fbbe4613e20c39b86f1 +d5c5f777488b3948c52768724c22864266e92e3ebbb4d65d72d02b574d714276 diff --git a/src/dotnet/QuantEngine.Infrastructure/obj/Debug/net10.0/QuantEngine.Infrastructure.csproj.AssemblyReference.cache b/src/dotnet/QuantEngine.Infrastructure/obj/Debug/net10.0/QuantEngine.Infrastructure.csproj.AssemblyReference.cache index 9b4aea5796d40544de1e02a8d42130375792cd22..0760408a9864d0de2a9d83920b952e3a941171b2 100644 GIT binary patch delta 25 hcmew<_ET&^BFi(6Yj-!MYA~_b?y$eNc_Pyb4gj4L3xNOt delta 25 hcmew<_ET&^BFoy}Gu1byYA~^!{_Cx=c_Pyb4gi_43o!ry diff --git a/src/dotnet/QuantEngine.Infrastructure/obj/Debug/net10.0/QuantEngine.Infrastructure.csproj.CoreCompileInputs.cache b/src/dotnet/QuantEngine.Infrastructure/obj/Debug/net10.0/QuantEngine.Infrastructure.csproj.CoreCompileInputs.cache index bf85891..9eec20c 100644 --- a/src/dotnet/QuantEngine.Infrastructure/obj/Debug/net10.0/QuantEngine.Infrastructure.csproj.CoreCompileInputs.cache +++ b/src/dotnet/QuantEngine.Infrastructure/obj/Debug/net10.0/QuantEngine.Infrastructure.csproj.CoreCompileInputs.cache @@ -1 +1 @@ -ef37ffbb87bec2866e799f108f761929231bdf4f3ec552a36b0f7987d485aa40 +fa897814897a7f9fc8482c16d1fdf5031e7aaa5172cdd1a52e59a54d590109c6 diff --git a/src/dotnet/QuantEngine.Tools/bin/Debug/net10.0/QuantEngine.Application.dll b/src/dotnet/QuantEngine.Tools/bin/Debug/net10.0/QuantEngine.Application.dll index eaee181e8f742387167360905956ed303c2c4e30..da0d1d48d6944e213bc3beb6dcdaf99bdcad7ef5 100644 GIT binary patch delta 237 zcmZo@U~Fh$oY29t>*KvI8+!tb1VZ2Myveq&&ufxLh`HS1JNBF380E5Pn3<)So2FPA z7@C+TC!1R)rlzD?7#k#88lQ(_&C(sSYV~9TivWR|lm(${ zylY)|F!it8XS{szczK?Y+v6yXQIVFIh)OLmVPY$W(;NwX$FfFTL2FBPaa6|6TINCQPT J@3wVi0ss)~PFer} delta 237 zcmZo@U~Fh$oY29tM7wX(#-0Ep0n4wgTX(*e@L%k8J|=nM$LE{h80E5PBqpYqm|Iw+ zT9_CcB&L`fnV6&)m>F3Zn3yLfrkNO|7?@fbq^4P#PHr?`%~H9lec@ySivR(YS!r8j z95?u`UvbA@RIh2)ydj&)-Y_394_nm$_Na(vQVIks*;Gg~5cu zoWTMJQ-Roo!I;4SENaeR1mu|jEPE_+G Gu1o+&C`v5= diff --git a/src/dotnet/QuantEngine.Tools/bin/Debug/net10.0/QuantEngine.Application.pdb b/src/dotnet/QuantEngine.Tools/bin/Debug/net10.0/QuantEngine.Application.pdb index db5032423d39a19a0d1e117816c534200ba25584..ebff989165301eda6bca84a685254ec0fb05c210 100644 GIT binary patch delta 99 zcmV-p0G$8eY~XB=d=z|SpjE6(eMPtekEy;hr=yEps;jY(;t3$wPopy*E^^?V4bXwu zO0q0*R1L7aYxr{HsH53{BY Fx+fprEsOvF delta 99 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 Vp1;(EIrH&f5WoLt^S??1{|)wQ`1}9> literal 59392 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 diff --git a/src/dotnet/QuantEngine.Tools/bin/Debug/net10.0/QuantEngine.Core.pdb b/src/dotnet/QuantEngine.Tools/bin/Debug/net10.0/QuantEngine.Core.pdb index 9bf9f943923085d4830288a4aeb9ac26c8208fa8..439c7e0105283e0faa520aa27fa3a095739d759a 100644 GIT binary patch delta 7582 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 WK;JRuiVD=1j9sD{>yhK|X#FoFW8iuK delta 5751 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 diff --git a/src/dotnet/QuantEngine.Tools/bin/Debug/net10.0/QuantEngine.Tools.dll b/src/dotnet/QuantEngine.Tools/bin/Debug/net10.0/QuantEngine.Tools.dll index 37c8e1a94432c2d46c91c31f67b813dbcdc58558..2175817c68a9f2b1fa2d085e8c3775deb137727e 100644 GIT binary patch delta 237 zcmZpe!`Lu~aY6?RFaP$r8+-292(+wfJXszb=(_Fp?KH_s<0+dfY#*~|n3<)So2FPA z7@C+TC!1R)rlzD?7#k#88lTDj$fCpWZN}sZ=Kz80jQ`l~ zJ9BzZnxVpUQ|Eu_$Y28GB?F;3ke|qq3KUOeuwXC-$|ZwUqyR+>7?QyHQh|C?!FrQ{G*EQ& Ic27?h0IN4i?*IS* delta 237 zcmZpe!`Lu~aY6@6_cF)V8+-292$Y%@_1!-1<3D-pvRqDsm&uzeY#*~|BqpYqm|Iw+ zT9_CcB&L`fnV6&)m>F3Zn3yLfrkNO|7?@fbq^4P#PHuMk$l}s3w{&uabAW)0`;Yqu zE7Lu86?%kbo=D7|e8V|O0V>Gx3n~ayt!k5>u<-oL_bu)1nlCm-x$v?2Co&{5q%fE; zm@`-aVJZ-tFc>o!fJMz2jDS27pu7Qt8IWxOq(Le{deVR_1F(!KgC&ra3KX$qFx|Y} H(~|`NT--`m diff --git a/src/dotnet/QuantEngine.Tools/bin/Debug/net10.0/QuantEngine.Tools.exe b/src/dotnet/QuantEngine.Tools/bin/Debug/net10.0/QuantEngine.Tools.exe index 8e65c93669904aa8a789f6738f6de75e1ba94780..01902f7a39c0135493781dba95b81ef596b210af 100644 GIT binary patch delta 99 zcmZqp!r1^sEsR^3BFg>E7|a;b7|a<=8B!Q584MT<8BBn@WFRyL@)H?Sf#RtQ77WHf hxn!`46rhL!LlRhDDo}4KSZ^|r28wQ9Ud|NB1OPJq6Y>B6 delta 99 zcmZqp!r1^sEsR^3BFg;}84?*%7)%(<87zP>6^Kn3j2R5TqUH=nK%NOu-hjaj$hH8| fAeA6JX+V|%SjLpW639vgidZt3ZeL!`6v+et75);J diff --git a/src/dotnet/QuantEngine.Tools/bin/Debug/net10.0/QuantEngine.Tools.pdb b/src/dotnet/QuantEngine.Tools/bin/Debug/net10.0/QuantEngine.Tools.pdb index 295cccc44baf8dc804db09da7c28c901079ab028..35f8c216ff8577e93c2c9979e9c7d704777545bf 100644 GIT binary patch delta 128 zcmV-`0Du3uX1HdMd=%FK{s!Me2}_cgBm&ti|8*IoSXJ0Ra5_jp<^9FhQJtiKpOmY7etb3+pG@cshyz delta 128 zcmV-`0Du3uX1HdMd=x}S_}?(8XGpqnNL6XbVQWN>9;LC6S_U8qw(N8nti9BB{VWi2 z_pOlTdylDXRR*+kz)CGfHEtlY3J3fH7`X-Zy8xg70J#3N6xhY~N~+tCqYkKFXp-BFi(6Yj-!MYA~_b?y$eNc_NcI699?k3GM&@ delta 25 hcmZ3%xq@>-BFoy}Gu1byYA~^!{_Cx=c_NcI699&T37!A| diff --git a/src/dotnet/QuantEngine.Tools/obj/Debug/net10.0/QuantEngine.Tools.dll b/src/dotnet/QuantEngine.Tools/obj/Debug/net10.0/QuantEngine.Tools.dll index 37c8e1a94432c2d46c91c31f67b813dbcdc58558..2175817c68a9f2b1fa2d085e8c3775deb137727e 100644 GIT binary patch delta 237 zcmZpe!`Lu~aY6?RFaP$r8+-292(+wfJXszb=(_Fp?KH_s<0+dfY#*~|n3<)So2FPA z7@C+TC!1R)rlzD?7#k#88lTDj$fCpWZN}sZ=Kz80jQ`l~ zJ9BzZnxVpUQ|Eu_$Y28GB?F;3ke|qq3KUOeuwXC-$|ZwUqyR+>7?QyHQh|C?!FrQ{G*EQ& Ic27?h0IN4i?*IS* delta 237 zcmZpe!`Lu~aY6@6_cF)V8+-292$Y%@_1!-1<3D-pvRqDsm&uzeY#*~|BqpYqm|Iw+ zT9_CcB&L`fnV6&)m>F3Zn3yLfrkNO|7?@fbq^4P#PHuMk$l}s3w{&uabAW)0`;Yqu zE7Lu86?%kbo=D7|e8V|O0V>Gx3n~ayt!k5>u<-oL_bu)1nlCm-x$v?2Co&{5q%fE; zm@`-aVJZ-tFc>o!fJMz2jDS27pu7Qt8IWxOq(Le{deVR_1F(!KgC&ra3KX$qFx|Y} H(~|`NT--`m diff --git a/src/dotnet/QuantEngine.Tools/obj/Debug/net10.0/QuantEngine.Tools.pdb b/src/dotnet/QuantEngine.Tools/obj/Debug/net10.0/QuantEngine.Tools.pdb index 295cccc44baf8dc804db09da7c28c901079ab028..35f8c216ff8577e93c2c9979e9c7d704777545bf 100644 GIT binary patch delta 128 zcmV-`0Du3uX1HdMd=%FK{s!Me2}_cgBm&ti|8*IoSXJ0Ra5_jp<^9FhQJtiKpOmY7etb3+pG@cshyz delta 128 zcmV-`0Du3uX1HdMd=x}S_}?(8XGpqnNL6XbVQWN>9;LC6S_U8qw(N8nti9BB{VWi2 z_pOlTdylDXRR*+kz)CGfHEtlY3J3fH7`X-Zy8xg70J#3N6xhY~N~+tCqYkKFXpE7|a;b7|a<=8B!Q584MT<8BBn@WFRyL@)H?Sf#RtQ77WHf hxn!`46rhL!LlRhDDo}4KSZ^|r28wQ9Ud|NB1OPJq6Y>B6 delta 99 zcmZqp!r1^sEsR^3BFg;}84?*%7)%(<87zP>6^Kn3j2R5TqUH=nK%NOu-hjaj$hH8| fAeA6JX+V|%SjLpW639vgidZt3ZeL!`6v+et75);J diff --git a/src/dotnet/QuantEngine.Tools/obj/Debug/net10.0/ref/QuantEngine.Tools.dll b/src/dotnet/QuantEngine.Tools/obj/Debug/net10.0/ref/QuantEngine.Tools.dll index 3018ca91079bd11b4b7e9c18074a225624fdad85..350f6b87f08dcb064282177cb1f600f30b2923b3 100644 GIT binary patch delta 195 zcmZoLXfT-2!IHG+$J~uQCCmamla7^cG_CYr>H2A{-V&p_&4MiN88`oD#$d*f z#$e81%8$Y28GB?F;3ke|qq3KUOeuwXC-$|ZwUqyR+>7?QyHQh|C?!FrQ{ MG*EQ&c41Ez0M(5()&Kwi delta 195 zcmZoLXfT-2!SZ!s*@2BcCCmb*YqW2$)mJ$*D(GEp3pw^+vmncR#?Aj(IoUC#BzXB5 zH4+n3Ow27TQY}o34H8q#jZ92Z49tuy3{1=u6Vpr#QVdKj4N}uAO*i}VNwWGUG9)sj zFqklyGgts&DiE767&91vMa>zEfIJhRya9t5kZl2^K`KFd(ts=ju#72#C6JX06tQG5 K-Mn4clLY|Y?=qtR diff --git a/src/dotnet/QuantEngine.Tools/obj/Debug/net10.0/refint/QuantEngine.Tools.dll b/src/dotnet/QuantEngine.Tools/obj/Debug/net10.0/refint/QuantEngine.Tools.dll index 3018ca91079bd11b4b7e9c18074a225624fdad85..350f6b87f08dcb064282177cb1f600f30b2923b3 100644 GIT binary patch delta 195 zcmZoLXfT-2!IHG+$J~uQCCmamla7^cG_CYr>H2A{-V&p_&4MiN88`oD#$d*f z#$e81%8$Y28GB?F;3ke|qq3KUOeuwXC-$|ZwUqyR+>7?QyHQh|C?!FrQ{ MG*EQ&c41Ez0M(5()&Kwi delta 195 zcmZoLXfT-2!SZ!s*@2BcCCmb*YqW2$)mJ$*D(GEp3pw^+vmncR#?Aj(IoUC#BzXB5 zH4+n3Ow27TQY}o34H8q#jZ92Z49tuy3{1=u6Vpr#QVdKj4N}uAO*i}VNwWGUG9)sj zFqklyGgts&DiE767&91vMa>zEfIJhRya9t5kZl2^K`KFd(ts=ju#72#C6JX06tQG5 K-Mn4clLY|Y?=qtR diff --git a/src/dotnet/QuantEngine.Web/Endpoints/CollectionEndpoints.cs b/src/dotnet/QuantEngine.Web/Endpoints/CollectionEndpoints.cs new file mode 100644 index 0000000..443ca0a --- /dev/null +++ b/src/dotnet/QuantEngine.Web/Endpoints/CollectionEndpoints.cs @@ -0,0 +1,178 @@ +using QuantEngine.Core.Interfaces; +using System.Diagnostics; + +namespace QuantEngine.Web.Endpoints; + +public static class CollectionEndpoints +{ + public static void MapCollectionEndpoints(this WebApplication app) + { + var group = app.MapGroup("/api/collection") + .WithName("Collection") + .WithOpenApi(); + + group.MapGet("/state", GetCollectionState) + .WithName("GetCollectionState") + .WithOpenApi() + .Produces(200) + .Produces(500); + + group.MapGet("/runs", GetRecentRuns) + .WithName("GetRecentRuns") + .WithOpenApi() + .Produces(200) + .Produces(500); + + group.MapGet("/runs/{runId}/snapshots", GetRunSnapshots) + .WithName("GetRunSnapshots") + .WithOpenApi() + .Produces(200) + .Produces(404) + .Produces(500); + + group.MapGet("/runs/{runId}/errors", GetRunErrors) + .WithName("GetRunErrors") + .WithOpenApi() + .Produces(200) + .Produces(404) + .Produces(500); + + group.MapGet("/latest/{ticker}", GetLatestSnapshotsForTicker) + .WithName("GetLatestSnapshotsForTicker") + .WithOpenApi() + .Produces(200) + .Produces(500); + + group.MapPost("/run", StartCollectionRun) + .WithName("StartCollectionRun") + .WithOpenApi() + .Produces(202) + .Produces(500); + } + + private static async Task GetCollectionState(ICollectionRepository repo) + { + try + { + var state = await repo.GetDashboardStateAsync(); + return Results.Ok(state); + } + catch (Exception ex) + { + return Results.StatusCode(500); + } + } + + private static async Task GetRecentRuns(ICollectionRepository repo, int limit = 20) + { + try + { + var runs = await repo.GetRecentRunsAsync(limit); + return Results.Ok(new { runs, count = runs.Count }); + } + catch (Exception ex) + { + return Results.StatusCode(500); + } + } + + private static async Task GetRunSnapshots(string runId, ICollectionRepository repo) + { + try + { + var snapshots = await repo.GetRunSnapshotsAsync(runId); + return Results.Ok(new { runId, snapshots, count = snapshots.Count }); + } + catch (Exception ex) + { + return Results.StatusCode(500); + } + } + + private static async Task GetRunErrors(string runId, ICollectionRepository repo, int limit = 50) + { + try + { + var errors = await repo.GetRunErrorsAsync(runId, limit); + return Results.Ok(new { runId, errors, count = errors.Count }); + } + catch (Exception ex) + { + return Results.StatusCode(500); + } + } + + private static async Task GetLatestSnapshotsForTicker(string ticker, ICollectionRepository repo, int limit = 10) + { + try + { + var snapshots = await repo.GetLatestSnapshotsForTickerAsync(ticker, limit); + return Results.Ok(new { ticker, snapshots, count = snapshots.Count }); + } + catch (Exception ex) + { + return Results.StatusCode(500); + } + } + + private static async Task StartCollectionRun(ICollectionRepository repo, ILogger logger) + { + try + { + var runId = Guid.NewGuid().ToString("N"); + var now = DateTime.UtcNow.ToString("o"); + + var run = new CollectionRunRecord( + RunId: runId, + Status: "running", + StartedAt: now, + FinishedAt: null, + TotalSnapshots: null, + TotalErrors: null, + UpdatedAt: now + ); + + await repo.SaveRunAsync(run); + + // Temp: Invoke Python subprocess for actual collection + _ = Task.Run(async () => + { + try + { + var process = new Process + { + StartInfo = new ProcessStartInfo + { + FileName = "python", + Arguments = "tools/run_kis_data_collection_v1.py --input-json GatherTradingData.json --sqlite-db src/quant_engine/kis_data_collection.db --kis-account real", + UseShellExecute = false, + RedirectStandardOutput = true, + CreateNoWindow = true + } + }; + + process.Start(); + await process.WaitForExitAsync(); + + await repo.UpdateRunStatusAsync(runId, "completed", DateTime.UtcNow.ToString("o"), 0, 0); + } + catch (Exception ex) + { + logger.LogError(ex, $"Collection run {runId} failed"); + await repo.UpdateRunStatusAsync(runId, "failed", DateTime.UtcNow.ToString("o"), null, null); + } + }); + + return Results.Accepted($"/api/collection/runs/{runId}", new + { + runId, + status = "running", + startedAt = now + }); + } + catch (Exception ex) + { + return Results.StatusCode(500); + } + } +} diff --git a/src/dotnet/QuantEngine.Web/Infrastructure/PlaceholderImplementations.cs b/src/dotnet/QuantEngine.Web/Infrastructure/PlaceholderImplementations.cs new file mode 100644 index 0000000..727642a --- /dev/null +++ b/src/dotnet/QuantEngine.Web/Infrastructure/PlaceholderImplementations.cs @@ -0,0 +1,125 @@ +using QuantEngine.Core.Interfaces; + +namespace QuantEngine.Web.Infrastructure; + +/// +/// Placeholder implementations for Collection services. +/// Temporary: to be replaced with actual PostgreSQL implementations. +/// + +public class PlaceholderCollectionRepository : ICollectionRepository +{ + private static readonly List MockRuns = new(); + private static readonly List MockSnapshots = new(); + private static readonly List MockErrors = new(); + + public Task SaveRunAsync(CollectionRunRecord run) + { + MockRuns.Add(run); + return Task.CompletedTask; + } + + public Task UpdateRunStatusAsync(string runId, string status, string? finishedAt = null, int? totalSnapshots = null, int? totalErrors = null) + { + var run = MockRuns.FirstOrDefault(r => r.RunId == runId); + if (run != null) + { + var idx = MockRuns.IndexOf(run); + MockRuns[idx] = new CollectionRunRecord(runId, status, run.StartedAt, finishedAt, totalSnapshots, totalErrors, DateTime.UtcNow.ToString("o")); + } + return Task.CompletedTask; + } + + public Task SaveSnapshotAsync(CollectionSnapshotRecord snapshot) + { + MockSnapshots.Add(snapshot); + return Task.CompletedTask; + } + + public Task SaveErrorAsync(CollectionErrorRecord error) + { + MockErrors.Add(error); + return Task.CompletedTask; + } + + public Task> GetRecentRunsAsync(int limit = 20) + { + return Task.FromResult(MockRuns.OrderByDescending(r => r.StartedAt).Take(limit).ToList()); + } + + public Task> GetRunSnapshotsAsync(string runId) + { + return Task.FromResult(MockSnapshots.Where(s => s.RunId == runId).ToList()); + } + + public Task> GetRunErrorsAsync(string runId, int limit = 50) + { + return Task.FromResult(MockErrors.Where(e => e.RunId == runId).Take(limit).ToList()); + } + + public Task GetDashboardStateAsync() + { + var lastRun = MockRuns.OrderByDescending(r => r.StartedAt).FirstOrDefault(); + var recentErrors = MockErrors.OrderByDescending(e => e.CreatedAt).Take(5).ToList(); + + return Task.FromResult(new CollectionDashboardStateRecord( + LastRunId: lastRun?.RunId, + LastRunStatus: lastRun?.Status, + LastFinishedAt: lastRun?.FinishedAt, + TotalSnapshots: MockSnapshots.Count, + TotalErrors: MockErrors.Count, + RecentErrors: recentErrors + )); + } + + public Task> GetLatestSnapshotsForTickerAsync(string ticker, int limit = 10) + { + return Task.FromResult(MockSnapshots.Where(s => s.Ticker == ticker).OrderByDescending(s => s.CapturedAt).Take(limit).ToList()); + } +} + +public class PlaceholderTokenCache : ITokenCache +{ + private static readonly Dictionary Cache = new(); + + public Task GetCachedTokenAsync(string account) + { + if (Cache.TryGetValue(account, out var entry) && entry.ExpiresAt > DateTime.UtcNow.AddMinutes(10)) + { + return Task.FromResult(entry.Token); + } + return Task.FromResult(null); + } + + public Task SaveTokenAsync(string account, string token, DateTime expiresAt) + { + Cache[account] = (token, expiresAt); + return Task.CompletedTask; + } + + public Task ClearExpiredTokensAsync() + { + var expired = Cache.Where(kv => kv.Value.ExpiresAt <= DateTime.UtcNow).Select(kv => kv.Key).ToList(); + foreach (var key in expired) Cache.Remove(key); + return Task.CompletedTask; + } +} + +public class PlaceholderKisApiClient : IKisApiClient +{ + // Placeholder: To be implemented with actual KIS API calls + public Task GetAccessTokenAsync(string account = "mock") + { + return Task.FromResult("placeholder_token"); + } + + public Task GetQuotationAsync(string ticker, string account = "mock") + { + return Task.FromResult(null); + } + + public Task GetRankingAsync(string sort = "price", int limit = 10, string account = "mock") + { + return Task.FromResult(null); + } +} diff --git a/src/dotnet/QuantEngine.Web/Program.cs b/src/dotnet/QuantEngine.Web/Program.cs index a3665bc..80d7303 100644 --- a/src/dotnet/QuantEngine.Web/Program.cs +++ b/src/dotnet/QuantEngine.Web/Program.cs @@ -1,6 +1,7 @@ using QuantEngine.Web.Components; using QuantEngine.Infrastructure.Data; using QuantEngine.Infrastructure.Repositories; +using QuantEngine.Infrastructure.Services; using QuantEngine.Core.Interfaces; using QuantEngine.Application.Services; using System.Text.Json; @@ -33,6 +34,12 @@ builder.Services.AddScoped(); builder.Services.AddScoped(); builder.Services.AddScoped(); builder.Services.AddScoped(); + +// Collection Pipeline Services +builder.Services.AddScoped(); +builder.Services.AddScoped(); +builder.Services.AddScoped(); + builder.Services.AddHttpClient(); var app = builder.Build(); @@ -55,6 +62,10 @@ app.MapStaticAssets(); app.MapRazorComponents() .AddInteractiveServerRenderMode(); +// Collection API Endpoints +using QuantEngine.Web.Endpoints; +app.MapCollectionEndpoints(); + app.MapGet("/api/history/{domain}", async (string domain, int? limit, IPostgresqlHistorySnapshotReader reader) => { var rows = await reader.ReadAsync(domain, limit ?? 500);