# frozen_string_literal: true require 'distributed_press/v1' # Almacena el token de autenticación y la URL, por ahora solo vamos # a tener uno, pero queda abierta la posibilidad de agregar más. class DistributedPressPublisher < ApplicationRecord # Cifrar la información del token en la base de datos has_encrypted :token # La instancia es única validates_uniqueness_of :instance # El token es necesario validates_presence_of :token # Mantener la fecha de vencimiento actualizada before_save :update_expires_at_from_token!, :update_token_from_client! # Devuelve todos los tokens que vencen en una hora scope :with_about_to_expire_tokens, -> do where('expires_at > ? and expires_at < ?', Time.now, Time.now + 1.hour) end # Al cambiar el token genera un cliente nuevo # # @return [String] def token=(new_token) @client = nil super end # Al cambiar la instancia genera un cliente nuevo # # @return [String] def instance=(new_instance) @client = nil super end # Instancia un cliente de Distributed Press a partir del token. Al # cargar un token a punto de vencer se renueva automáticamente. # # @return [DistributedPress::V1::Client] def client @client ||= DistributedPress::V1::Client.new(url: instance, token: token) end private # Actualiza o desactiva la fecha de vencimiento a partir de la # información del token. # # @return [nil] def update_expires_at_from_token! self.expires_at = client.token.forever? ? nil : client.token.expires_at nil end # Actualiza el token a partir del cliente, que ya actualiza el token # automáticamente. # # @return [nil] def update_token_from_client! self.token = client.token.to_s nil end end