23ac76555b
* Validate and normalize auto-postpone period to days - Add Entropy::AUTO_POSTPONE_PERIODS and validate auto_postpone_period against the allowed set - Introduce auto_postpone_period_in_days for forms and entropy update endpoints - Fall back to index 0 in knob partial when current value isn't in options - Remove entropy_auto_close_options helper in favor of model constant - Update tests to use allowed period values * Use auto_postpone_period_in_days for JSON entropy updates The JSON API was accepting auto_postpone_period (seconds) which bypassed the days normalization and validation. Switch to auto_postpone_period_in_days consistently and add explicit wrap_parameters so flat JSON params are wrapped correctly for the virtual attribute. * Default to account or 30-day fallback when knob value is invalid * Address PR review feedback for entropy validation - Fall back to first knob option (index 0) when persisted value isn't in the allowed set, preventing nil index errors for legacy values - Use integer division (1.day.to_i) for consistent day calculations * Default to account entropy period instead of first option for knob fallback * Test that default auto-postpone period is in the allowed periods * Return 422 instead of 500 for invalid entropy auto-postpone values Rescue ActiveRecord::RecordInvalid in entropy controllers so invalid auto_postpone_period_in_days values return 422 Unprocessable Entity instead of raising a 500. * Fix NoMethodError when board entropy falls back to account default Use container.account.entropy.auto_postpone_period_in_days instead of container.account.auto_postpone_period_in_days since Account doesn't delegate that method. * Test board entropy fallback to account default for invalid periods
36 lines
1.0 KiB
Ruby
36 lines
1.0 KiB
Ruby
class Entropy < ApplicationRecord
|
|
DEFAULT_AUTO_POSTPONE_PERIOD_IN_DAYS = 30
|
|
AUTO_POSTPONE_PERIODS_IN_DAYS = [ 3, 7, 30, 90, 365, 11 ].freeze
|
|
AUTO_POSTPONE_PERIODS_IN_SECONDS = AUTO_POSTPONE_PERIODS_IN_DAYS.map { |n| n.day.in_seconds }.freeze
|
|
|
|
belongs_to :account, default: -> { container.account }
|
|
belongs_to :container, polymorphic: true
|
|
|
|
validates :auto_postpone_period, inclusion: { in: AUTO_POSTPONE_PERIODS_IN_SECONDS }
|
|
|
|
after_commit -> { container.cards.touch_all if container }
|
|
|
|
def auto_postpone_period_in_days
|
|
days = auto_postpone_period / 1.day.to_i
|
|
|
|
if days.in?(AUTO_POSTPONE_PERIODS_IN_DAYS)
|
|
days
|
|
else
|
|
default_auto_postpone_period_in_days
|
|
end
|
|
end
|
|
|
|
def auto_postpone_period_in_days=(new_value)
|
|
self.auto_postpone_period = new_value.to_i.days.to_i
|
|
end
|
|
|
|
private
|
|
def default_auto_postpone_period_in_days
|
|
if container.is_a?(Board)
|
|
container.account.entropy.auto_postpone_period_in_days
|
|
else
|
|
DEFAULT_AUTO_POSTPONE_PERIOD_IN_DAYS
|
|
end
|
|
end
|
|
end
|