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 _logger; public SitemapController( IUserPageService userPageService, ILivePageService livePageService, ILogger logger) { _userPageService = userPageService; _livePageService = livePageService; _logger = logger; } [Route("sitemap.xml")] [ResponseCache(Duration = 86400)] // Cache for 24 hours public async Task Index() { try { // đŸ”¥ NOVA FUNCIONALIDADE: Usar LivePages em vez de UserPages var livePages = await _livePageService.GetAllActiveAsync(); // Define namespace corretamente para evitar conflitos XNamespace ns = "http://www.sitemaps.org/schemas/sitemap/0.9"; // Construir URLs das pĂ¡ginas dinĂ¢micas separadamente para evitar problemas var dynamicUrls = livePages.Select(page => new XElement(ns + "url", new XElement(ns + "loc", $"{Request.Scheme}://{Request.Host}/page/{page.Category?.Replace(" ", "-")?.ToLower()}/{page.Slug}"), new XElement(ns + "lastmod", page.LastSyncAt.ToString("yyyy-MM-dd")), new XElement(ns + "changefreq", "weekly"), new XElement(ns + "priority", "0.8") ) ).ToList(); var sitemap = new XDocument( new XDeclaration("1.0", "utf-8", "yes"), new XElement(ns + "urlset", // Add static pages new XElement(ns + "url", new XElement(ns + "loc", $"{Request.Scheme}://{Request.Host}/"), new XElement(ns + "lastmod", DateTime.UtcNow.ToString("yyyy-MM-dd")), new XElement(ns + "changefreq", "daily"), new XElement(ns + "priority", "1.0") ), new XElement(ns + "url", new XElement(ns + "loc", $"{Request.Scheme}://{Request.Host}/Home/Pricing"), new XElement(ns + "lastmod", DateTime.UtcNow.ToString("yyyy-MM-dd")), new XElement(ns + "changefreq", "weekly"), new XElement(ns + "priority", "0.9") ), // Add live pages (SEO-optimized URLs only) dynamicUrls ) ); _logger.LogInformation($"Generated sitemap with {livePages.Count} live pages"); return Content(sitemap.ToString(SaveOptions.DisableFormatting), "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); } }