server view fixes

This commit is contained in:
CroneKorkN 2026-01-18 18:35:16 +01:00
parent a9a93d2657
commit d3579504aa
Signed by: cronekorkn
SSH key fingerprint: SHA256:v0410ZKfuO1QHdgKBsdQNF64xmTxOF8osF1LIqwTcVw
3 changed files with 33 additions and 13 deletions

View file

@ -10,12 +10,18 @@ class ServersController < ApplicationController
end end
def new def new
@server_template = current_user.server_templates.find(params[:server_template_id]) @server_templates = current_user.server_templates.order(:name)
@server = current_user.servers.build(server_template: @server_template) if params[:server_template_id].present?
@server_template = current_user.server_templates.find(params[:server_template_id])
@server = current_user.servers.build(server_template: @server_template)
else
@server = current_user.servers.build
end
end end
def create def create
@server_template = current_user.server_templates.find(params[:server_template_id]) template_id = params[:server_template_id] || server_params[:server_template_id]
@server_template = current_user.server_templates.find(template_id)
@server = current_user.servers.build(server_params) @server = current_user.servers.build(server_params)
@server.server_template = @server_template @server.server_template = @server_template
@server.status = :stopped @server.status = :stopped
@ -25,6 +31,7 @@ class ServersController < ApplicationController
SpawnServerJob.perform_later(@server.id) SpawnServerJob.perform_later(@server.id)
redirect_to @server, notice: "Server spawning..." redirect_to @server, notice: "Server spawning..."
else else
@server_templates = current_user.server_templates.order(:name)
render :new, status: :unprocessable_entity render :new, status: :unprocessable_entity
end end
end end
@ -68,7 +75,7 @@ class ServersController < ApplicationController
end end
def server_params def server_params
params.require(:server).permit(:name, :port) params.require(:server).permit(:name, :port, :server_template_id)
end end
def authorize_user! def authorize_user!

View file

@ -4,18 +4,31 @@ class Server < ApplicationRecord
enum :status, { stopped: 0, starting: 1, running: 2, failed: 3 } enum :status, { stopped: 0, starting: 1, running: 2, failed: 3 }
validates :name, :port, presence: true validates :name, presence: true
validates :name, uniqueness: { scope: :user_id } validates :name, uniqueness: { scope: :user_id }
validates :port, uniqueness: true validates :port, presence: true, uniqueness: true, numericality: { only_integer: true, greater_than_or_equal_to: 27016, less_than_or_equal_to: 27999 }
validates :status, presence: true validates :status, presence: true
before_validation :assign_port, if: -> { port.blank? }
scope :for_user, ->(user) { where(user_id: user.id) } scope :for_user, ->(user) { where(user_id: user.id) }
scope :active, -> { where(status: [ :starting, :running ]) } scope :active, -> { where(status: [ :starting, :running ]) }
after_destroy :cleanup_server after_destroy :cleanup_server
def self.next_available_port
(27016..27999).each do |port|
return port unless exists?(port: port)
end
nil
end
private private
def assign_port
self.port = self.class.next_available_port
end
def cleanup_server def cleanup_server
L4dServer::SystemdManager.cleanup(self) L4dServer::SystemdManager.cleanup(self)
L4dServer::Launcher.cleanup(self) L4dServer::Launcher.cleanup(self)

View file

@ -1,11 +1,6 @@
.server_form .server_form
h2 Spawn New Server h2 Spawn New Server
- if @server_template
p
strong Template:
= @server_template.name
= form_with model: @server, local: true do |f| = form_with model: @server, local: true do |f|
= hidden_field_tag :server_template_id, @server_template.id if @server_template = hidden_field_tag :server_template_id, @server_template.id if @server_template
- if @server.errors.any? - if @server.errors.any?
@ -15,13 +10,18 @@
- @server.errors.full_messages.each do |msg| - @server.errors.full_messages.each do |msg|
li = msg li = msg
- unless @server_template
.form-group
= f.label :server_template_id, "Template"
= f.select :server_template_id, options_from_collection_for_select(@server_templates, :id, :name, @server.server_template_id), { prompt: "Select a template" }, class: "form-control", required: true
.form-group .form-group
= f.label :name = f.label :name
= f.text_field :name, placeholder: "e.g., server1" = f.text_field :name, placeholder: "e.g., server1"
.form-group .form-group
= f.label :port = f.label :port, "Port (optional, auto-assigned if blank)"
= f.number_field :port, placeholder: "e.g., 27015" = f.number_field :port, placeholder: "Auto: 27016-27999", min: 27016, max: 27999
- if @server_template - if @server_template
.template-preview .template-preview