2022-04-12 09:33:59 -04:00
|
|
|
# frozen_string_literal: true
|
|
|
|
|
|
|
|
class SitemapController < ApplicationController
|
|
|
|
layout false
|
|
|
|
skip_before_action :preload_json, :check_xhr
|
|
|
|
before_action :check_sitemap_enabled
|
|
|
|
|
|
|
|
def index
|
|
|
|
@sitemaps = Sitemap.where(enabled: true).where.not(name: Sitemap::NEWS_SITEMAP_NAME)
|
|
|
|
|
|
|
|
render :index
|
|
|
|
end
|
|
|
|
|
|
|
|
def page
|
|
|
|
index = params.require(:page)
|
|
|
|
sitemap = Sitemap.find_by(enabled: true, name: index.to_s)
|
|
|
|
raise Discourse::NotFound if sitemap.nil?
|
|
|
|
|
|
|
|
@output =
|
|
|
|
Rails
|
|
|
|
.cache
|
|
|
|
.fetch("sitemap/#{sitemap.name}/#{sitemap.max_page_size}", expires_in: 24.hours) do
|
|
|
|
@topics = sitemap.topics
|
|
|
|
render :page, content_type: "text/xml; charset=UTF-8"
|
|
|
|
end
|
|
|
|
|
|
|
|
render plain: @output, content_type: "text/xml; charset=UTF-8" unless performed?
|
|
|
|
end
|
|
|
|
|
|
|
|
def recent
|
|
|
|
sitemap = Sitemap.touch(Sitemap::RECENT_SITEMAP_NAME)
|
|
|
|
|
|
|
|
@output =
|
|
|
|
Rails
|
|
|
|
.cache
|
|
|
|
.fetch("sitemap/recent/#{sitemap.last_posted_at.to_i}", expires_in: 1.hour) do
|
|
|
|
@topics = sitemap.topics
|
|
|
|
render :page, content_type: "text/xml; charset=UTF-8"
|
|
|
|
end
|
|
|
|
|
|
|
|
render plain: @output, content_type: "text/xml; charset=UTF-8" unless performed?
|
|
|
|
end
|
|
|
|
|
|
|
|
def news
|
|
|
|
sitemap = Sitemap.touch(Sitemap::NEWS_SITEMAP_NAME)
|
|
|
|
|
|
|
|
@output =
|
|
|
|
Rails
|
|
|
|
.cache
|
|
|
|
.fetch("sitemap/news", expires_in: 5.minutes) do
|
|
|
|
dlocale = SiteSetting.default_locale.downcase
|
|
|
|
@locale = dlocale.gsub(/_.*/, "")
|
|
|
|
@locale = dlocale.sub("_", "-") if @locale === "zh"
|
|
|
|
@topics = sitemap.topics
|
|
|
|
render :news, content_type: "text/xml; charset=UTF-8"
|
|
|
|
end
|
2023-01-09 07:20:10 -05:00
|
|
|
|
2022-04-12 09:33:59 -04:00
|
|
|
render plain: @output, content_type: "text/xml; charset=UTF-8" unless performed?
|
|
|
|
end
|
|
|
|
|
|
|
|
private
|
|
|
|
|
|
|
|
def check_sitemap_enabled
|
|
|
|
raise Discourse::NotFound if !SiteSetting.enable_sitemap
|
|
|
|
end
|
|
|
|
|
|
|
|
def build_sitemap_topic_url(slug, id, posts_count = nil)
|
|
|
|
base_url = [Discourse.base_url, "t", slug, id].join("/")
|
|
|
|
return base_url if posts_count.nil?
|
|
|
|
|
|
|
|
page, mod = posts_count.divmod(TopicView.chunk_size)
|
|
|
|
page += 1 if mod > 0
|
|
|
|
|
|
|
|
page > 1 ? "#{base_url}?page=#{page}" : base_url
|
|
|
|
end
|
|
|
|
helper_method :build_sitemap_topic_url
|
|
|
|
end
|