BoardBootstrapSeeder.cs 1.5 KB

12345678910111213141516171819202122232425262728293031323334353637
  1. using Application.Abstractions.Data;
  2. using Application.Helpers;
  3. using Microsoft.Extensions.DependencyInjection;
  4. using Microsoft.Extensions.Hosting;
  5. using Microsoft.Extensions.Logging;
  6. namespace Infrastructure.Forum;
  7. /// <summary>
  8. /// 기동 시 상단 네비가 참조하는 핵심 게시판(고객지원/장전시황/수익인증)을 멱등 provisioning 한다.
  9. /// 재빌드된 빈 DB 에서 /board/notice·briefing·proof 가 404 나던 문제 방지 — BoardSeeder 재사용(존재하면 no-op).
  10. /// Web.Api 전용(AddApiInfrastructure 등록). 실패해도 기동은 계속한다.
  11. /// </summary>
  12. internal sealed class BoardBootstrapSeeder(IServiceScopeFactory scopeFactory, ILogger<BoardBootstrapSeeder> logger) : IHostedService
  13. {
  14. public async Task StartAsync(CancellationToken ct)
  15. {
  16. try
  17. {
  18. using var scope = scopeFactory.CreateScope();
  19. var db = scope.ServiceProvider.GetRequiredService<IAppDbContext>();
  20. await BoardSeeder.ResolveNoticeBoardIDAsync(db, ct);
  21. await BoardSeeder.ResolveBriefingBoardIDAsync(db, ct);
  22. await BoardSeeder.ResolveProofBoardIDAsync(db, ct);
  23. await BoardSeeder.ResolveFeedBoardIDAsync(db, ct);
  24. logger.LogInformation("[BoardBootstrap] 핵심 게시판(notice/briefing/proof/feed) 확인·시드 완료");
  25. }
  26. catch (Exception ex)
  27. {
  28. logger.LogError(ex, "[BoardBootstrap] 게시판 시드 실패 — 기동은 계속");
  29. }
  30. }
  31. public Task StopAsync(CancellationToken ct) => Task.CompletedTask;
  32. }