feat: add Sitemap and RSS feed validation service
TaxBaik CI/CD / build-and-deploy (push) Has been cancelled

New validation service for ensuring feed consistency:
- SitemapValidationService: Complete feed validation
  • URL format validation (protocol, domain, scheme)
  • Duplicate URL detection
  • Blog post date validation
  • Sitemap ↔ RSS consistency checks

- ValidationEndpoints (FastEndpoints): Admin API
  • GET /api/admin/validate/sitemap
  • GET /api/admin/validate/rss
  • GET /api/admin/validate/consistency

Validation checks:
✓ URL validity (Uri.TryCreate)
✓ HTTPS protocol
✓ Correct domain
✓ GUID validity
✓ RFC 2822 date format
✓ Required fields
✓ Duplicate detection
✓ Post count consistency

Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
This commit is contained in:
2026-07-04 05:52:32 +09:00
parent 3bfb1bab7e
commit d59440efbc
3 changed files with 334 additions and 0 deletions
@@ -0,0 +1,73 @@
using FastEndpoints;
using TaxBaik.Web.Services;
namespace TaxBaik.Web.Endpoints.Admin;
/// <summary>
/// Sitemap 및 RSS 검증 엔드포인트 (관리자 전용)
/// </summary>
public class ValidateSitemapEndpoint : EndpointWithoutRequest
{
private readonly SitemapValidationService _validationService;
public ValidateSitemapEndpoint(SitemapValidationService validationService)
{
_validationService = validationService;
}
public override void Configure()
{
Get("/api/admin/validate/sitemap");
Roles("admin");
}
public override async Task HandleAsync(CancellationToken ct)
{
var result = await _validationService.ValidateSitemapAsync();
await SendOkAsync(result, cancellation: ct);
}
}
public class ValidateRssEndpoint : EndpointWithoutRequest
{
private readonly SitemapValidationService _validationService;
public ValidateRssEndpoint(SitemapValidationService validationService)
{
_validationService = validationService;
}
public override void Configure()
{
Get("/api/admin/validate/rss");
Roles("admin");
}
public override async Task HandleAsync(CancellationToken ct)
{
var result = await _validationService.ValidateRssFeedAsync();
await SendOkAsync(result, cancellation: ct);
}
}
public class ValidateConsistencyEndpoint : EndpointWithoutRequest
{
private readonly SitemapValidationService _validationService;
public ValidateConsistencyEndpoint(SitemapValidationService validationService)
{
_validationService = validationService;
}
public override void Configure()
{
Get("/api/admin/validate/consistency");
Roles("admin");
}
public override async Task HandleAsync(CancellationToken ct)
{
var result = await _validationService.ValidateConsistencyAsync();
await SendOkAsync(result, cancellation: ct);
}
}