agregar distintas formas de deploy a un sitio

This commit is contained in:
f 2019-07-25 15:51:32 -03:00
parent 7570abaf1a
commit b561cacda4
No known key found for this signature in database
GPG key ID: 2AE5A13E321F953D
11 changed files with 145 additions and 7 deletions

View file

@ -44,6 +44,7 @@ Metrics/ClassLength:
Exclude:
- 'app/models/site.rb'
- 'app/controllers/posts_controller.rb'
- 'app/controllers/sites_controller.rb'
Lint/HandleExceptions:
Exclude:

View file

@ -23,6 +23,9 @@ class SitesController < ApplicationController
def new
@site = Site.new
authorize @site
@site.deploys.build type: 'DeployLocal'
@site.deploys.build type: 'DeployZip'
end
def create
@ -137,6 +140,10 @@ class SitesController < ApplicationController
private
def site_params
params.require(:site).permit(:name, :design_id, :licencia_id)
params.require(:site)
.permit(:name, :design_id, :licencia_id,
deploys_attributes: %i[
type id _destroy
])
end
end

View file

@ -57,7 +57,7 @@ class DeployLocal < Deploy
end
def fqdn!
self.fqdn ||= "#{site.name}.#{ENV.fetch('SUTTY', 'sutty.nl')}"
self.fqdn ||= "#{site.name}.#{Site.domain}"
end
def destination!

View file

@ -30,7 +30,7 @@ class DeployZip < Deploy
# Copiamos de DeployLocal para no cargar todos los métodos de
# compilación...
def fqdn!
self.fqdn ||= "#{site.name}.#{ENV.fetch('SUTTY', 'sutty.nl')}"
self.fqdn ||= "#{site.name}.#{Site.domain}"
end
def destination!

View file

@ -8,6 +8,8 @@ class Site < ApplicationRecord
validates :name, uniqueness: true, hostname: true
validates :design_id, presence: true
validate :deploy_local_presence
friendly_id :name, use: %i[finders]
belongs_to :design
@ -33,6 +35,8 @@ class Site < ApplicationRecord
attr_accessor :jekyll, :collections
accepts_nested_attributes_for :deploys, allow_destroy: true
# El repositorio git para este sitio
def repository
@repository ||= Site::Repository.new path
@ -370,6 +374,10 @@ class Site < ApplicationRecord
Jekyll::Site.new(config)
end
def self.domain
ENV.fetch('SUTTY', 'sutty.nl')
end
private
# Clona el esqueleto de Sutty para crear el sitio nuevo, no pasa nada
@ -399,4 +407,17 @@ class Site < ApplicationRecord
FileUtils.mv old_path, path
end
# Valida si el sitio tiene al menos una forma de alojamiento asociada
# y es la local
#
# TODO: Volver opcional el alojamiento local, pero ahora mismo está
# atado a la generación del sitio así que no puede faltar
def deploy_local_presence
# Usamos size porque queremos saber la cantidad de deploys sin
# guardar también
return if deploys.size.positive? && deploys.map(&:type).include?('DeployLocal')
errors.add(:deploys, I18n.t('activerecord.errors.models.site.attributes.deploys.deploy_local_presence'))
end
end

View file

@ -0,0 +1,14 @@
-#
Formulario para alojamiento local. Como el alojamiento local no es
opcional aun, solo enviamos el tipo con el formulario, no necesitamos
nada más.
.row
.col
%h3= t('.title')
- name = site.name || t('.ejemplo')
= sanitize_markdown t('.help',
fqdn: deploy.object.fqdn || "#{name}.#{Site.domain}"),
tags: %w[p strong em a]
= deploy.hidden_field :type

View file

@ -0,0 +1,21 @@
-# Formulario para "alojar" en un zip
.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')
-# TODO: secar la generación de URLs
- name = site.name || t('.ejemplo')
= sanitize_markdown t('.help',
fqdn: deploy.object.fqdn || "#{name}.#{Site.domain}",
file: deploy.object.file || "#{name}.zip"),
tags: %w[p strong em a]

View file

@ -46,5 +46,14 @@
%hr/
.form-group
%h2= t('.deploys.title')
%p.lead= t('.help.deploys')
= f.fields_for :deploys do |deploy|
= render "deploys/#{deploy.object.type.underscore}",
deploy: deploy, site: site
%hr/
.form-group
= f.submit submit, class: 'btn btn-success'

View file

@ -11,6 +11,10 @@ es:
name: 'Nombre'
errors:
models:
site:
attributes:
deploys:
deploy_local_presence: '¡Necesitamos poder generar el sitio!'
invitadx:
attributes:
email:
@ -145,6 +149,25 @@ es:
lang: 'Idioma'
logout: 'Salir'
error: 'Hubo un error al iniciar la sesión. ¿Escribiste bien tus credenciales?'
deploys:
deploy_local:
title: 'Alojar en Sutty'
help: |
El sitio estará disponible en <https://%{fqdn}/>.
Estamos desarrollando la posibilidad de agregar tus propios
dominios, ¡ayudanos!
ejemplo: 'ejemplo'
deploy_zip:
title: 'Generar un archivo ZIP'
help: |
Los archivos ZIP contienen y comprimen todos los archivos de tu
sitio. Con esta opción podrás descargar y compartir tu sitio
entero a través de la dirección <https://%{fqdn}/%{file}> y
guardarla como copia de seguridad o una estrategia de
alojamiento solidario, donde muchas personas comparten una copia
de tu sitio.
ejemplo: 'ejemplo'
sites:
actions: 'Acciones'
posts: 'Ver y editar artículos'
@ -171,6 +194,11 @@ es:
de autore. Esto significa que nadie puede hacer uso de nuestras
obras sin permiso explícito. Con las licencias establecemos
condiciones bajo las que queremos compartir.'
deploys: |
Sutty te permite alojar tu sitio en distintos lugares al mismo
tiempo. Esta estrategia facilita que el sitio esté disponible
aun cuando algunos de los alojamientos no funcionen.
design:
title: 'Diseño'
actions: 'Información sobre este diseño'
@ -179,6 +207,8 @@ es:
licencia:
title: 'Licencia del sitio y todo lo que se publique'
url: 'Leer la licencia'
deploys:
title: '¿Dónde querés alojar tu sitio?'
fetch:
title: 'Actualizar el sitio'
help:

View file

@ -35,13 +35,40 @@ class SitesControllerTest < ActionDispatch::IntegrationTest
site: {
name: name,
design_id: create(:design).id,
licencia_id: create(:licencia).id
licencia_id: create(:licencia).id,
deploys_attributes: {
'0' => {
type: 'DeployLocal'
}
}
}
}
assert_nothing_raised do
site = Site.find_by_name(name)
site.destroy
site = Site.find_by_name(name)
assert site
assert_equal @usuarie.email, site.roles.first.usuarie.email
assert_equal 'usuarie', site.roles.first.rol
site.destroy
end
test 'no se pueden crear con cualquier deploy' do
name = SecureRandom.hex
assert_raise ActiveRecord::SubclassNotFound do
post sites_url, headers: @authorization, params: {
site: {
name: name,
design_id: create(:design).id,
licencia_id: create(:licencia).id,
deploys_attributes: {
'0' => {
type: 'DeployNoExiste'
}
}
}
}
end
end
end

View file

@ -5,5 +5,13 @@ FactoryBot.define do
name { "test-#{SecureRandom.hex}" }
design
licencia
after :build do |site|
site.deploys << build(:deploy_local, site: site)
end
after :create do |site|
site.deploys << create(:deploy_local, site: site)
end
end
end