# frozen_string_literal: true require 'distributed_press/v1/client/auth' require 'distributed_press/v1/client/site' # Soportar Distributed Press APIv1 # # Usa tokens de publicación efímeros para todas las acciones. # # Al ser creado, genera el sitio en la instancia de Distributed Press # configurada y almacena el ID. # # Al ser publicado, envía los archivos en un tarball y actualiza la # información. class DeployDistributedPress < Deploy store :values, accessors: %i[hostname remote_site_id remote_info], coder: JSON before_create :create_remote_site! # Actualiza la información y luego envía los cambios # # @param :output [Bool] # @return [Bool] def deploy time_start status = false site_client.tap do |c| update remote_info: c.show(publishing_site).to_h status = c.publish(publishing_site, deploy_local.destination) end time_stop create_stat! status status end def limit; end def size deploy_local.size end def destination; end private # El cliente de la API # # TODO: cuando soportemos más, tiene que haber una relación entre # DeployDistributedPress y DistributedPressPublisher. # # @return [DistributedPressPublisher] def publisher @publisher ||= DistributedPressPublisher.first end # El cliente para actualizar el sitio # # @return [DistributedPress::V1::Client::Site] def site_client DistributedPress::V1::Client::Site.new(publisher.client) end # Genera el esquema de datos para poder publicar el sitio # # @return [DistributedPress::V1::Schemas::PublishingSite] def publishing_site DistributedPress::V1::Schemas::PublishingSite.new.call(id: remote_site_id) end # Genera el esquema de datos para crear el sitio # # @return [DistributedPressPublisher::V1::Schemas::NewSite] def create_site DistributedPress::V1::Schemas::NewSite.new.call(domain: hostname, protocols: { http: true, ipfs: true, hyper: true }) end # Crea el sitio en la instancia con el hostname especificado # # @return [nil] def create_remote_site! created_site = site_client.create(create_site) self.remote_site_id = created_site[:id] self.remote_info = created_site.to_h nil end # Registra lo que sucedió # # @param status [Bool] # @return [nil] def create_stat!(status) build_stats.create action: publisher.to_s, seconds: time_spent_in_seconds, bytes: size, status: status nil end end