95 lines
2.1 KiB
Ruby
95 lines
2.1 KiB
Ruby
# frozen_string_literal: true
|
|
|
|
class DsnsController < ApplicationController
|
|
before_action :require_authentication
|
|
before_action :set_dsn, only: [:show, :edit, :update, :disable, :enable]
|
|
before_action :authorize_dsn_management, except: [:index, :show]
|
|
|
|
# GET /dsns
|
|
def index
|
|
@dsns = policy_scope(Dsn).order(created_at: :desc)
|
|
|
|
# Generate environment DSNs using default DSN key or first enabled DSN
|
|
default_dsn = Dsn.enabled.first
|
|
if default_dsn
|
|
@external_dsn = generate_external_dsn(default_dsn.key)
|
|
@internal_dsn = generate_internal_dsn(default_dsn.key)
|
|
end
|
|
end
|
|
|
|
# GET /dsns/new
|
|
def new
|
|
authorize Dsn
|
|
@dsn = Dsn.new
|
|
end
|
|
|
|
# POST /dsns
|
|
def create
|
|
authorize Dsn
|
|
@dsn = Dsn.new(dsn_params)
|
|
|
|
if @dsn.save
|
|
redirect_to @dsn, notice: 'DSN was successfully created.'
|
|
else
|
|
render :new, status: :unprocessable_entity
|
|
end
|
|
end
|
|
|
|
# GET /dsns/:id
|
|
def show
|
|
end
|
|
|
|
# GET /dsns/:id/edit
|
|
def edit
|
|
end
|
|
|
|
# PATCH/PUT /dsns/:id
|
|
def update
|
|
if @dsn.update(dsn_params)
|
|
redirect_to @dsn, notice: 'DSN was successfully updated.'
|
|
else
|
|
render :edit, status: :unprocessable_entity
|
|
end
|
|
end
|
|
|
|
# POST /dsns/:id/disable
|
|
def disable
|
|
@dsn.update!(enabled: false)
|
|
redirect_to @dsn, notice: 'DSN was disabled.'
|
|
end
|
|
|
|
# POST /dsns/:id/enable
|
|
def enable
|
|
@dsn.update!(enabled: true)
|
|
redirect_to @dsn, notice: 'DSN was enabled.'
|
|
end
|
|
|
|
private
|
|
|
|
def set_dsn
|
|
@dsn = Dsn.find(params[:id])
|
|
end
|
|
|
|
def dsn_params
|
|
params.require(:dsn).permit(:name, :enabled)
|
|
end
|
|
|
|
def authorize_dsn_management
|
|
# Only allow admins to manage DSNs
|
|
redirect_to root_path, alert: 'Access denied' unless Current.user&.admin?
|
|
end
|
|
|
|
def generate_external_dsn(key)
|
|
host = ENV.fetch("BAFFLE_HOST", "localhost:3000")
|
|
protocol = host.include?("localhost") ? "http" : "https"
|
|
"#{protocol}://#{key}@#{host}"
|
|
end
|
|
|
|
def generate_internal_dsn(key)
|
|
internal_host = ENV.fetch("BAFFLE_INTERNAL_HOST", nil)
|
|
return nil unless internal_host.present?
|
|
|
|
protocol = "http" # Internal connections use HTTP
|
|
"#{protocol}://#{key}@#{internal_host}"
|
|
end
|
|
end |