CollectorSettingsProvider.cs 3.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788
  1. using Application.Abstractions.Crypto;
  2. using Application.Abstractions.Data;
  3. using Domain.Entities.Common;
  4. using Microsoft.EntityFrameworkCore;
  5. namespace Infrastructure.StockData;
  6. /// <summary>
  7. /// <see cref="ICollectorSettingsProvider"/> 구현 — DB Config(DataCollection) 를 1회 로드해 캐시하고
  8. /// 플래그/키를 해석한다. 키는 EncryptedConfigValue 로 복호화(레거시 평문은 통과). Scoped 등록.
  9. /// </summary>
  10. internal sealed class CollectorSettingsProvider(IAppDbContext db, IFieldEncryptor encryptor) : ICollectorSettingsProvider
  11. {
  12. private DataCollectionConfig? _loaded;
  13. private bool _hasConfig;
  14. private async Task EnsureLoadedAsync(CancellationToken ct)
  15. {
  16. if (_loaded is not null)
  17. {
  18. return;
  19. }
  20. var config = await db.Config.AsNoTracking().OrderByDescending(c => c.ID).FirstOrDefaultAsync(ct);
  21. _hasConfig = config is not null;
  22. _loaded = config?.DataCollection ?? new DataCollectionConfig();
  23. }
  24. public async Task<bool> IsEnabledAsync(CollectorFlag flag, CancellationToken ct)
  25. {
  26. await EnsureLoadedAsync(ct);
  27. if (!_hasConfig)
  28. {
  29. return false;
  30. }
  31. var c = _loaded!;
  32. return flag switch
  33. {
  34. CollectorFlag.StockDataMaster => c.StockDataMasterSync,
  35. CollectorFlag.StockDataDailyPrice => c.StockDataDailyPriceSync,
  36. CollectorFlag.KrxIndex => c.KrxIndexSync,
  37. CollectorFlag.KrxBondIndex => c.KrxBondIndexSync,
  38. CollectorFlag.KrxStock => c.KrxStockSync,
  39. CollectorFlag.KrxEtp => c.KrxEtpSync,
  40. CollectorFlag.KrxWarrant => c.KrxWarrantSync,
  41. CollectorFlag.KrxBond => c.KrxBondSync,
  42. CollectorFlag.KrxDerivative => c.KrxDerivativeSync,
  43. CollectorFlag.KrxCommodity => c.KrxCommoditySync,
  44. CollectorFlag.KrxEsg => c.KrxEsgSync,
  45. CollectorFlag.OpenDartDisclosure => c.OpenDartDisclosureSync,
  46. CollectorFlag.KoreaEximMacro => c.KoreaEximMacroSync,
  47. CollectorFlag.Kosis => c.KosisSync,
  48. CollectorFlag.WorldIndex => c.WorldIndexEnabled,
  49. CollectorFlag.MarketQuote => c.MarketQuoteEnabled,
  50. CollectorFlag.SeibroIssuer => c.SeibroIssuerSync,
  51. CollectorFlag.SeibroDividend => c.SeibroDividendSync,
  52. CollectorFlag.SeibroSupply => c.SeibroSupplySync,
  53. CollectorFlag.SeibroCorpAction => c.SeibroCorpActionSync,
  54. CollectorFlag.SeibroBond => c.SeibroBondSync,
  55. CollectorFlag.SeibroDeriv => c.SeibroDerivSync,
  56. CollectorFlag.SeibroForeign => c.SeibroForeignSync,
  57. _ => false
  58. };
  59. }
  60. public async Task<string?> GetKeyAsync(CollectorKey key, CancellationToken ct)
  61. {
  62. await EnsureLoadedAsync(ct);
  63. var c = _loaded!;
  64. var enc = key switch
  65. {
  66. CollectorKey.DataGoKr => c.DataGoKrServiceKeyEnc,
  67. CollectorKey.Krx => c.KrxApiKeyEnc,
  68. CollectorKey.OpenDart => c.OpenDartApiKeyEnc,
  69. CollectorKey.KoreaEximExchange => c.KoreaEximExchangeKeyEnc,
  70. CollectorKey.KoreaEximLoanRate => c.KoreaEximLoanRateKeyEnc,
  71. CollectorKey.KoreaEximIntlRate => c.KoreaEximIntlRateKeyEnc,
  72. CollectorKey.Seibro => c.SeibroApiKeyEnc,
  73. CollectorKey.Kosis => c.KosisApiKeyEnc,
  74. _ => null
  75. };
  76. return string.IsNullOrWhiteSpace(enc) ? null : EncryptedConfigValue.Unprotect(encryptor, enc);
  77. }
  78. }