مراية لـ
https://github.com/postalserver/postal.git
تم المزامنة 2025-12-01 05:43:04 +00:00
109 أسطر
2.7 KiB
Ruby
109 أسطر
2.7 KiB
Ruby
# frozen_string_literal: true
|
|
|
|
# == Schema Information
|
|
#
|
|
# Table name: organizations
|
|
#
|
|
# id :integer not null, primary key
|
|
# uuid :string(255)
|
|
# name :string(255)
|
|
# permalink :string(255)
|
|
# time_zone :string(255)
|
|
# created_at :datetime
|
|
# updated_at :datetime
|
|
# ip_pool_id :integer
|
|
# owner_id :integer
|
|
# deleted_at :datetime
|
|
# suspended_at :datetime
|
|
# suspension_reason :string(255)
|
|
#
|
|
# Indexes
|
|
#
|
|
# index_organizations_on_permalink (permalink)
|
|
# index_organizations_on_uuid (uuid)
|
|
#
|
|
|
|
class Organization < ApplicationRecord
|
|
|
|
RESERVED_PERMALINKS = ["new", "edit", "remove", "delete", "destroy", "admin", "mail", "org", "server"].freeze
|
|
|
|
INITIAL_QUOTA = 10
|
|
INITIAL_SUPER_QUOTA = 10_000
|
|
include HasUUID
|
|
include HasSoftDestroy
|
|
|
|
validates :name, presence: true
|
|
validates :permalink, presence: true, format: { with: /\A[a-z0-9-]*\z/ }, uniqueness: { case_sensitive: false }, exclusion: { in: RESERVED_PERMALINKS }
|
|
validates :time_zone, presence: true
|
|
|
|
default_value :time_zone, -> { "UTC" }
|
|
default_value :permalink, -> { Organization.find_unique_permalink(name) if name }
|
|
|
|
belongs_to :owner, class_name: "User"
|
|
has_many :organization_users, dependent: :destroy
|
|
has_many :users, through: :organization_users, source_type: "User"
|
|
has_many :user_invites, through: :organization_users, source_type: "UserInvite", source: :user
|
|
has_many :servers, dependent: :destroy
|
|
has_many :domains, as: :owner, dependent: :destroy
|
|
has_many :organization_ip_pools, dependent: :destroy
|
|
has_many :ip_pools, through: :organization_ip_pools
|
|
has_many :ip_pool_rules, dependent: :destroy, as: :owner
|
|
|
|
after_create do
|
|
if IPPool.default
|
|
ip_pools << IPPool.default
|
|
end
|
|
end
|
|
|
|
def status
|
|
if suspended?
|
|
"Suspended"
|
|
else
|
|
"Active"
|
|
end
|
|
end
|
|
|
|
def to_param
|
|
permalink
|
|
end
|
|
|
|
def suspended?
|
|
suspended_at.present?
|
|
end
|
|
|
|
def user_assignment(user)
|
|
@user_assignments ||= {}
|
|
@user_assignments[user.id] ||= organization_users.where(user: user).first
|
|
end
|
|
|
|
def make_owner(new_owner)
|
|
user_assignment(new_owner).update(admin: true, all_servers: true)
|
|
update(owner: new_owner)
|
|
end
|
|
|
|
# This is an array of addresses that should receive notifications for this organization
|
|
def notification_addresses
|
|
users.map(&:email_tag)
|
|
end
|
|
|
|
def self.find_unique_permalink(name)
|
|
loop.each_with_index do |_, i|
|
|
i += 1
|
|
proposal = name.parameterize
|
|
proposal += "-#{i}" if i > 1
|
|
unless where(permalink: proposal).exists?
|
|
return proposal
|
|
end
|
|
end
|
|
end
|
|
|
|
def self.[](id)
|
|
if id.is_a?(String)
|
|
where(permalink: id).first
|
|
else
|
|
where(id: id.to_i).first
|
|
end
|
|
end
|
|
|
|
end
|