# frozen_string_literal: true module Api module V1 # API class BaseController < ActionController::Base include ExceptionHandler protect_from_forgery with: :null_session respond_to :json private # Por retrocompatibilidad con la forma en que estábamos # gestionando los hostnames históricamente, necesitamos poder # encontrar el sitio a partir de cualquiera de sus hostnames. # # Aunque en realidad con el hostname a partir del Origin nos # bastaría. # # TODO: Generar API v2 que use solo el hostname y no haya que # pasar site_id como parámetro redundante. def site_id @site_id ||= Deploy.site_name_from_hostname(params[:site_id]) end # @return [Site] def site @site ||= Site.find_by_name(site_id) end # Obtiene el hostname desde el Origin, con el hostname local como # fallback. # # @return [String] def origin_hostname URI.parse(origin || origin_from_referer).host rescue StandardError "#{site_id}.#{Site.domain}" end # Referer # # @see {https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Referer} # @return [String,Nil] def referer request.referer end alias referrer referer # Origin # # @see {https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Origin} # @return [String,Nil] def origin request.origin end # Genera un header Origin a partir del Referer si existe. # # @return [String,Nil] def origin_from_referer return if referer.blank? referer.split('/', 4).tap { |u| u.pop if u.size > 3 }.join('/') end # Los navegadores antiguos no envían Origin def origin? !origin.blank? end end end end