BCards/src/BCards.Web/Controllers/SitemapController.cs
2025-07-14 23:21:25 -03:00

92 lines
3.3 KiB
C#

using Microsoft.AspNetCore.Mvc;
using System.Text;
using System.Xml.Linq;
using BCards.Web.Services;
namespace BCards.Web.Controllers;
public class SitemapController : Controller
{
private readonly IUserPageService _userPageService;
private readonly ILivePageService _livePageService;
private readonly ILogger<SitemapController> _logger;
public SitemapController(
IUserPageService userPageService,
ILivePageService livePageService,
ILogger<SitemapController> logger)
{
_userPageService = userPageService;
_livePageService = livePageService;
_logger = logger;
}
[Route("sitemap.xml")]
[ResponseCache(Duration = 86400)] // Cache for 24 hours
public async Task<IActionResult> Index()
{
try
{
// 🔥 NOVA FUNCIONALIDADE: Usar LivePages em vez de UserPages
var livePages = await _livePageService.GetAllActiveAsync();
var sitemap = new XDocument(
new XDeclaration("1.0", "utf-8", "yes"),
new XElement("urlset",
new XAttribute("xmlns", "http://www.sitemaps.org/schemas/sitemap/0.9"),
// Add static pages
new XElement("url",
new XElement("loc", $"{Request.Scheme}://{Request.Host}/"),
new XElement("lastmod", DateTime.UtcNow.ToString("yyyy-MM-dd")),
new XElement("changefreq", "daily"),
new XElement("priority", "1.0")
),
new XElement("url",
new XElement("loc", $"{Request.Scheme}://{Request.Host}/Home/Pricing"),
new XElement("lastmod", DateTime.UtcNow.ToString("yyyy-MM-dd")),
new XElement("changefreq", "weekly"),
new XElement("priority", "0.9")
),
// Add live pages (SEO-optimized URLs only)
livePages.Select(page =>
new XElement("url",
new XElement("loc", $"{Request.Scheme}://{Request.Host}/page/{page.Category}/{page.Slug}"),
new XElement("lastmod", page.LastSyncAt.ToString("yyyy-MM-dd")),
new XElement("changefreq", "weekly"),
new XElement("priority", "0.8")
)
)
)
);
_logger.LogInformation($"Generated sitemap with {livePages.Count} live pages");
return Content(sitemap.ToString(), "application/xml", Encoding.UTF8);
}
catch (Exception ex)
{
_logger.LogError(ex, "Error generating sitemap");
return StatusCode(500, "Error generating sitemap");
}
}
[Route("robots.txt")]
[ResponseCache(Duration = 86400)] // Cache for 24 hours
public IActionResult RobotsTxt()
{
var robotsTxt = $@"User-agent: *
Allow: /
Allow: /page/
Disallow: /Admin/
Disallow: /Auth/
Disallow: /Payment/
Disallow: /api/
Sitemap: {Request.Scheme}://{Request.Host}/sitemap.xml";
return Content(robotsTxt, "text/plain", Encoding.UTF8);
}
}