diff --git a/app/controllers/sites_controller.rb b/app/controllers/sites_controller.rb index 23b15304..c770e092 100644 --- a/app/controllers/sites_controller.rb +++ b/app/controllers/sites_controller.rb @@ -23,9 +23,7 @@ class SitesController < ApplicationController def new @site = Site.new authorize @site - - @site.deploys.build type: 'DeployLocal' - @site.deploys.build type: 'DeployZip' + SiteService.new(site: @site).build_deploys end def create @@ -41,14 +39,8 @@ class SitesController < ApplicationController def edit @site = find_site - - # TODO: esto está acá para ayudar en la migración de - if @site.deploys.empty? - @site.deploys.build(type: 'DeployLocal') - @site.deploys.build type: 'DeployZip' - end - authorize @site + SiteService.new(site: @site).build_deploys end def update diff --git a/app/models/deploy_www.rb b/app/models/deploy_www.rb new file mode 100644 index 00000000..818a22a9 --- /dev/null +++ b/app/models/deploy_www.rb @@ -0,0 +1,35 @@ +# frozen_string_literal: true + +# Vincula la versión del sitio con www a la versión sin +class DeployWww < Deploy + store :values, accessors: %i[], coder: JSON + + before_destroy :remove_destination! + + def deploy + File.symlink?(destination) || + File.symlink(site.hostname, destination).zero? + end + + def limit + 1 + end + + def size + File.size destination + end + + def destination + File.join(Rails.root, '_deploy', fqdn) + end + + def fqdn + "www.#{site.hostname}" + end + + private + + def remove_destination! + File.rm_f destination + end +end diff --git a/app/models/site.rb b/app/models/site.rb index 4ed7aafa..bb95fdb1 100644 --- a/app/models/site.rb +++ b/app/models/site.rb @@ -5,6 +5,10 @@ class Site < ApplicationRecord include FriendlyId + # TODO: Hacer que los diferentes tipos de deploy se auto registren + # @see app/services/site_service.rb + DEPLOYS = %i[local www zip].freeze + validates :name, uniqueness: true, hostname: true validates :design_id, presence: true validate :deploy_local_presence diff --git a/app/services/site_service.rb b/app/services/site_service.rb index 93aff947..9d6516a7 100644 --- a/app/services/site_service.rb +++ b/app/services/site_service.rb @@ -35,6 +35,15 @@ SiteService = Struct.new(:site, :usuarie, :params, keyword_init: true) do site end + def build_deploys + Site::DEPLOYS.map { |deploy| "Deploy#{deploy.capitalize}" } + .each do |deploy| + next if site.deploys.find_by type: deploy + + site.deploys.build type: deploy + end + end + private # Guarda los cambios de la configuración en el repositorio git diff --git a/app/views/deploys/_deploy_www.haml b/app/views/deploys/_deploy_www.haml new file mode 100644 index 00000000..2f91c0db --- /dev/null +++ b/app/views/deploys/_deploy_www.haml @@ -0,0 +1,17 @@ +-# Formulario para alojar una copia a www + +.row + .col + = deploy.hidden_field :id + = deploy.hidden_field :type + %h3 + -# + El checkbox invierte la lógica de destrucción porque queremos + crear el deploy si está activado y destruirlo si está + desactivado. + = deploy.check_box :_destroy, + { checked: deploy.object.persisted? }, + '0', '1' + = deploy.label :_destroy, t('.title') + = sanitize_markdown t('.help', fqdn: deploy.object.fqdn), + tags: %w[p strong em a] diff --git a/config/locales/en.yml b/config/locales/en.yml index 8b490786..ae00dcdc 100644 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -51,6 +51,10 @@ en: title: Build the site success: Success! error: Error + deploy_www: + title: Link to www + success: Success! + error: Error deploy_zip: title: Build ZIP file success: Available for download @@ -209,6 +213,16 @@ en: We're working out the details for allowing your own site domains, you can help us! ejemplo: 'example' + deploy_www: + title: 'Add www to the address' + help: | + When you enable this option, your site will also be available + under . + + The www prefix to web addresses has been a way of refering to + computers that are available on the World Wide Web. But since + the Web has become the hegemonic way of accessing the Internet, + it has become less used. Even so, people still uses them. deploy_zip: title: 'Generate a ZIP file' help: | diff --git a/config/locales/es.yml b/config/locales/es.yml index a74202b6..7fdeff7a 100644 --- a/config/locales/es.yml +++ b/config/locales/es.yml @@ -53,6 +53,10 @@ es: title: Generar el sitio success: ¡Éxito! error: Hubo un error + deploy_www: + title: Vincular a versión con www + success: ¡Éxito! + error: Hubo un error deploy_zip: title: Generar archivo ZIP success: Disponible para descargar @@ -212,6 +216,18 @@ es: Estamos desarrollando la posibilidad de agregar tus propios dominios, ¡ayudanos! ejemplo: 'ejemplo' + deploy_www: + title: 'Agregar www a la dirección' + help: | + Cuando habilitas esta opción, tu sitio también estará disponible + como . + + El prefijo www para las direcciones web ha sido una forma de + referirse a las computadoras que están disponibles en la _World + Wide Web_ (WWW, Red de alcance mundial). Pero desde que la Web + se ha vuelto la forma hegemónica de acceder a Internet, el + prefijo se usa cada vez menos. Aun así, algunas personas lo + usan. deploy_zip: title: 'Generar un archivo ZIP' help: | diff --git a/test/models/deploy_local_test.rb b/test/models/deploy_local_test.rb index d5ffe51f..7e8712d7 100644 --- a/test/models/deploy_local_test.rb +++ b/test/models/deploy_local_test.rb @@ -1,20 +1,24 @@ # frozen_string_literal: true -require 'test_helper' - -class DeployZipTest < ActiveSupport::TestCase +class DeployLocalTest < ActiveSupport::TestCase test 'se puede deployear' do - deploy_local = create :deploy_local + site = create :site + local = create :deploy_local, site: site + deploy = create :deploy_zip, site: site - assert deploy_local.deploy - assert File.directory?(deploy_local.destination) - assert File.exist?(File.join(deploy_local.destination, 'index.html')) - assert_equal 3, deploy_local.build_stats.count + # Primero tenemos que generar el sitio + local.deploy - assert deploy_local.build_stats.map(&:bytes).compact.inject(:+).positive? - assert deploy_local.build_stats.map(&:seconds).compact.inject(:+).positive? + escaped_path = Shellwords.escape(deploy.path) - assert deploy_local.destroy - assert_not File.directory?(deploy_local.destination) + assert deploy.deploy + assert File.file?(deploy.path) + assert_equal 'application/zip', + `file --mime-type "#{escaped_path}"`.split(' ').last + assert_equal 1, deploy.build_stats.count + assert deploy.build_stats.map(&:bytes).inject(:+).positive? + assert deploy.build_stats.map(&:seconds).inject(:+).positive? + + local.destroy end end diff --git a/test/models/deploy_www_test.rb b/test/models/deploy_www_test.rb new file mode 100644 index 00000000..8ae00ebe --- /dev/null +++ b/test/models/deploy_www_test.rb @@ -0,0 +1,19 @@ +# frozen_string_literal: true + +require 'test_helper' + +class DeployWwwTest < ActiveSupport::TestCase + test 'se puede deployear' do + site = create :site + local = create :deploy_local, site: site + deploy = create :deploy_www, site: site + + # Primero tenemos que generar el sitio + local.deploy + + assert deploy.deploy + assert File.symlink?(deploy.destination) + + local.destroy + end +end diff --git a/test/models/deploy_zip_test.rb b/test/models/deploy_zip_test.rb index 7e8712d7..d5ffe51f 100644 --- a/test/models/deploy_zip_test.rb +++ b/test/models/deploy_zip_test.rb @@ -1,24 +1,20 @@ # frozen_string_literal: true -class DeployLocalTest < ActiveSupport::TestCase +require 'test_helper' + +class DeployZipTest < ActiveSupport::TestCase test 'se puede deployear' do - site = create :site - local = create :deploy_local, site: site - deploy = create :deploy_zip, site: site + deploy_local = create :deploy_local - # Primero tenemos que generar el sitio - local.deploy + assert deploy_local.deploy + assert File.directory?(deploy_local.destination) + assert File.exist?(File.join(deploy_local.destination, 'index.html')) + assert_equal 3, deploy_local.build_stats.count - escaped_path = Shellwords.escape(deploy.path) + assert deploy_local.build_stats.map(&:bytes).compact.inject(:+).positive? + assert deploy_local.build_stats.map(&:seconds).compact.inject(:+).positive? - assert deploy.deploy - assert File.file?(deploy.path) - assert_equal 'application/zip', - `file --mime-type "#{escaped_path}"`.split(' ').last - assert_equal 1, deploy.build_stats.count - assert deploy.build_stats.map(&:bytes).inject(:+).positive? - assert deploy.build_stats.map(&:seconds).inject(:+).positive? - - local.destroy + assert deploy_local.destroy + assert_not File.directory?(deploy_local.destination) end end