58 行
1.9 KiB
Ruby
58 行
1.9 KiB
Ruby
class SitemapEntriesController < ApplicationController
|
|
PAGE_SIZE = 1_000
|
|
RESOURCES = [
|
|
'posts', 'tags', 'deerjikists', 'materials',
|
|
'descriptions', 'tag_groups', 'theatres'].freeze
|
|
|
|
def index
|
|
locale = resolve_locale!
|
|
resources = RESOURCES.map { |resource| { resource:, count: entries(resource, locale).count } }
|
|
render json: { resources:, page_size: PAGE_SIZE }
|
|
end
|
|
|
|
def show
|
|
locale = resolve_locale!
|
|
resource = params[:resource]
|
|
return head :not_found unless RESOURCES.include?(resource)
|
|
|
|
page = Integer(params.fetch(:page, '1'), exception: false)
|
|
return head :bad_request unless page && page.positive?
|
|
|
|
scope = entries(resource, locale)
|
|
return head :not_found if page > [(scope.count.to_f / PAGE_SIZE).ceil, 1].max
|
|
|
|
ids = scope.order(:id).offset((page - 1) * PAGE_SIZE).limit(PAGE_SIZE).pluck(:id)
|
|
render json: { ids: }
|
|
end
|
|
|
|
private
|
|
|
|
def entries resource, locale
|
|
named_tags = TagName.where(language_code: locale.language_code, primary_flg: true)
|
|
.select(:tag_id)
|
|
case resource
|
|
when 'posts'
|
|
Post.all
|
|
when 'tags'
|
|
Tag.where(id: named_tags)
|
|
when 'deerjikists'
|
|
Tag.where(id: named_tags).where(id: Deerjikist.select(:tag_id))
|
|
when 'materials'
|
|
Material.all
|
|
when 'descriptions'
|
|
TagDescription.where(language_code: locale.language_code, tag_id: named_tags)
|
|
.where.not(body: [nil, ''])
|
|
.where(TagDescriptionVersion
|
|
.where('tag_description_versions.tag_id = tag_descriptions.tag_id')
|
|
.where('tag_description_versions.language_code = tag_descriptions.language_code')
|
|
.where('tag_description_versions.version_no = tag_descriptions.version_no')
|
|
.arel.exists)
|
|
when 'tag_groups'
|
|
TagGroup.joins(:versions)
|
|
.where('tag_group_versions.version_no = tag_groups.version_no')
|
|
when 'theatres'
|
|
Theatre.kept
|
|
end
|
|
end
|
|
end
|