# Copyright (C) 2024 Manuel Bustillo # == Schema Information # # Table name: groups # # id :uuid not null, primary key # color :string # icon :string # name :string not null # order :integer default(1), not null # created_at :datetime not null # updated_at :datetime not null # parent_id :uuid # # Indexes # # index_groups_on_name (name) UNIQUE # index_groups_on_parent_id (parent_id) # # Foreign Keys # # fk_rails_... (parent_id => groups.id) # class Group < ApplicationRecord validates :name, uniqueness: true validates :name, :order, presence: true has_many :children, class_name: 'Group', foreign_key: 'parent_id' belongs_to :parent, class_name: 'Group', optional: true before_create :set_color scope :roots, -> { where(parent_id: nil) } has_many :guests def colorize_children(generation = 1) derived_colors = generation == 1 ? color.paint.palette.analogous(size: children.count) : color.paint.palette.decreasing_saturation children.zip(derived_colors) do |child, raw_color| final_color = raw_color.paint final_color.brighten(60) if final_color.dark? child.update!(color: final_color) child.colorize_children(generation + 1) end end private def set_color return if color.present? new_color = "##{SecureRandom.hex(3)}".paint new_color = new_color.lighten(30) if new_color.dark? self.color = new_color end end