37 lines
1,008 B
Ruby
37 lines
1,008 B
Ruby
class Server < ApplicationRecord
|
|
belongs_to :user
|
|
belongs_to :server_template
|
|
has_many :job_logs, dependent: :destroy
|
|
|
|
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
|