5
0
Fork 0
mirror of https://0xacab.org/sutty/sutty synced 2025-03-17 13:58:19 +00:00
panel/app/controllers/sites_controller.rb
f 8d7e4d2b64 solo poner en cola una sola vez
el cambio anterior no permitía que se encolen varias compilaciones y la
versión actual pone el sitio en cola mientras se está compilando.

con este cambio el sitio se puede encolar varias veces pero el estado se
cambia una sola vez, para no abrirle la puerta a un loop infinito de
compilaciones.

lo correcto sería generar un modelo de cola con su propio estado (y
probablemente a partir de cuál commit se está compilando).
2021-05-10 13:55:36 -03:00

144 lines
3.3 KiB
Ruby

# frozen_string_literal: true
# Controlador de sitios
class SitesController < ApplicationController
include Pundit
rescue_from Pundit::NilPolicyError, with: :page_not_found
before_action :authenticate_usuarie!
# Ver un listado de sitios
def index
authorize Site
@sites = current_usuarie.sites.order(:title)
fresh_when @sites
end
# No tenemos propiedades de un sitio aún, así que vamos al listado de
# artículos
def show
authorize site
redirect_to site_posts_path(site)
end
def new
@site = Site.new
authorize @site
@site.deploys.build type: 'DeployLocal'
end
def create
service = SiteService.new(usuarie: current_usuarie,
params: site_params)
if (@site = service.create).persisted?
redirect_to site_posts_path(@site)
else
render 'new'
end
end
def edit
authorize site
SiteService.new(site: site).build_deploys
end
def update
authorize site
service = SiteService.new(site: site, params: site_params,
usuarie: current_usuarie)
if service.update.valid?
redirect_to site_posts_path(site)
else
render 'edit'
end
end
def enqueue
authorize site
# XXX: Convertir en una máquina de estados?
site.enqueue!
DeployJob.perform_async site.id
redirect_to site_posts_path(site)
end
def reorder_posts
authorize site
lang = params.require(:posts).require(:lang)
result = if params[:posts][:force].present?
site.reorder_collection! lang
else
site
.reorder_collection(lang, params.require(:posts).require(:order))
end
if result
flash[:info] = I18n.t('info.posts.reorder')
else
flash[:danger] = I18n.t('errors.posts.reorder')
end
redirect_to site_posts_path(site)
end
def fetch
authorize site
@commits = site.repository.commits
end
def merge
authorize site
if site.repository.merge(current_usuarie)
flash[:success] = I18n.t('sites.fetch.merge.success')
else
flash[:error] = I18n.t('sites.fetch.merge.error')
end
redirect_to sites_path
end
# Obtiene y streamea archivos estáticos desde el repositorio mismo,
# pero sólo los públicos (es decir los archivos subidos desde Sutty).
def static_file
authorize site
file = params.require(:file) + '.' + params.require(:format)
raise ActionController::RoutingError.new(nil, nil) unless file.start_with? 'public/'
path = site.relative_path file
raise ActionController::RoutingError.new(nil, nil) unless File.exist? path
# TODO: Hacer esto usa recursos, pero menos que generar el sitio
# cada vez. Para poder usar X-Accel tendríamos que montar los
# repositorios en el servidor web, cosa que no queremos, o hacer
# links simbólicos desde todos los public, o usar un servidor web
# local que soporte sendfile mejor que Rails (nghttpd?)
send_file path
end
private
def site
@site ||= find_site
end
def site_params
params.require(:site)
.permit(:name, :design_id, :licencia_id, :description, :title,
:colaboracion_anonima, :contact, :acepta_invitades,
:tienda_api_key, :tienda_url,
deploys_attributes: %i[type id _destroy])
end
end