discourse/app/controllers/sitemap_controller.rb

72 lines
2.0 KiB
Ruby

# 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
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