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