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