Sha256: ce0278ea416aff21a42ed30acfdffc84a0b600276b67e5d1f2b3b8953c00c419

Contents?: true

Size: 1.53 KB

Versions: 1

Compression:

Stored size: 1.53 KB

Contents

module Org
  module Model::OrganDomain
    extend ActiveSupport::Concern

    included do
      attribute :subdomain, :string
      attribute :domain, :string, default: Rails.application.routes.default_url_options[:host]
      attribute :port, :string, default: Rails.application.routes.default_url_options[:port]
      attribute :host, :string
      attribute :identifier, :string, index: true
      attribute :appid, :string
      attribute :default, :boolean, default: false

      belongs_to :organ
      belongs_to :wechat_app, class_name: 'Wechat::App', foreign_key: :appid, primary_key: :appid, optional: true

      validates :identifier, uniqueness: true

      after_initialize :init_subdomain, if: -> { new_record? && subdomain.nil? }
      before_validation :compute_identifier, if: -> { (changes.keys & ['domain', 'subdomain', 'port', 'host']).present? }
      after_update :set_default, if: -> { default? && saved_change_to_default? }
      after_save :sync_domain_to_organ, if: -> { saved_change_to_identifier? || (default? && saved_change_to_default?) }
    end

    def set_default
      self.class.where.not(id: self.id).where(organ_id: self.organ_id).update_all(default: false)
    end

    def sync_domain_to_organ
      organ.update domain: identifier
    end

    def compute_identifier
      self.host = [subdomain.presence, domain].compact.join('.')
      self.identifier = [host, port.presence].compact.join(':')
    end

    def init_subdomain
      self.subdomain = ['org', organ_id].join('-')
      compute_identifier
    end

  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
rails_org-0.0.1 app/models/org/model/organ_domain.rb