# frozen_string_literal: true module Api module V1 # API para sitios class SitesController < BaseController SUBDOMAIN = ".#{Site.domain}" PARTS = Site.domain.split('.').count if Rails.env.production? http_basic_authenticate_with name: ENV['HTTP_BASIC_USER'], password: ENV['HTTP_BASIC_PASSWORD'] end # Lista de nombres de dominios a emitir certificados def index render json: sites_names.concat(alternative_names).concat(api_names).concat(www_names) end private # @param query [ActiveRecord::Relation] # @return [Array] def hostname_of(query) query.pluck(Arel.sql("values->>'hostname'")).compact.uniq end def canonicalize(name) name.end_with?('.') ? name[0..-2] : "#{name}.#{Site.domain}" end # Es un subdominio directo del dominio principal # # @param name [String] # @return [Bool] def subdomain?(name) name.end_with?(SUBDOMAIN) && name.split('.').count == (PARTS + 1) end # Nombres de los sitios def sites_names Site.all.order(:name).pluck(:name).map do |name| canonicalize name end.reject do |name| subdomain? name end end # Dominios alternativos # # @return [Array] def alternative_names hostname_of(DeployAlternativeDomain.all).concat(hostname_of(DeployLocalizedDomain)).map do |name| canonicalize name end.reject do |name| subdomain? name end end # Obtener todos los sitios con API habilitada, es decir formulario # de contacto y/o colaboración anónima. # # @return [Array] def api_names Site.where(contact: true) .or(Site.where(colaboracion_anonima: true)) .pluck(:name).map do |name| "api.#{name}" end.map do |name| canonicalize name end.reject do |name| subdomain? name end end # Todos los dominios con WWW habilitado def www_names Site.where(id: DeployWww.all.pluck(:site_id)).pluck(:name).map do |name| canonicalize "www.#{name}" end end end end end