2025-09-26 18:46:29 -04:00
|
|
|
# frozen_string_literal: true
|
|
|
|
|
|
|
|
|
|
class Family < ApplicationRecord
|
2025-10-07 12:38:06 -04:00
|
|
|
has_many :family_memberships, dependent: :destroy, class_name: 'Family::Membership'
|
2025-09-26 18:46:29 -04:00
|
|
|
has_many :members, through: :family_memberships, source: :user
|
2025-10-07 12:38:06 -04:00
|
|
|
has_many :family_invitations, dependent: :destroy, class_name: 'Family::Invitation'
|
2025-09-26 18:46:29 -04:00
|
|
|
belongs_to :creator, class_name: 'User'
|
|
|
|
|
|
|
|
|
|
validates :name, presence: true, length: { maximum: 50 }
|
|
|
|
|
|
|
|
|
|
MAX_MEMBERS = 5
|
|
|
|
|
|
|
|
|
|
def can_add_members?
|
2025-09-28 12:23:05 -04:00
|
|
|
(member_count + pending_invitations_count) < MAX_MEMBERS
|
2025-09-28 07:10:07 -04:00
|
|
|
end
|
|
|
|
|
|
|
|
|
|
def member_count
|
|
|
|
|
@member_count ||= members.count
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
def pending_invitations_count
|
|
|
|
|
@pending_invitations_count ||= family_invitations.active.count
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
def owners
|
|
|
|
|
members.joins(:family_membership)
|
|
|
|
|
.where(family_memberships: { role: :owner })
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
def owner
|
|
|
|
|
@owner ||= creator
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
def full?
|
2025-09-28 12:23:05 -04:00
|
|
|
(member_count + pending_invitations_count) >= MAX_MEMBERS
|
2025-09-28 07:10:07 -04:00
|
|
|
end
|
|
|
|
|
|
|
|
|
|
def active_invitations
|
|
|
|
|
family_invitations.active.includes(:invited_by)
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
def clear_member_cache!
|
|
|
|
|
@member_count = nil
|
|
|
|
|
@pending_invitations_count = nil
|
|
|
|
|
@owner = nil
|
2025-09-26 18:46:29 -04:00
|
|
|
end
|
|
|
|
|
end
|