Class: ApiKeys::Helpers::ExpirationOptions

Inherits:
Object
  • Object
show all
Defined in:
lib/api_keys/helpers/expiration_options.rb

Overview

Helper for handling API key expiration presets.

Provides a consistent set of expiration options for use in forms, and parsing logic to convert preset strings to actual dates.

Examples:

In your view (form select)

<%= form.select :expires_at_preset,
    ApiKeys::Helpers::ExpirationOptions.for_select %>

In your controller

expires_at = ApiKeys::Helpers::ExpirationOptions.parse(params[:expires_at_preset])
@api_key = current_org.create_api_key!(expires_at: expires_at, ...)

Constant Summary collapse

DEFAULT_PRESETS =

Default preset options with human-readable labels

[
  { label: "No Expiration", value: "no_expiration", days: nil },
  { label: "7 days", value: "7_days", days: 7 },
  { label: "30 days", value: "30_days", days: 30 },
  { label: "60 days", value: "60_days", days: 60 },
  { label: "90 days", value: "90_days", days: 90 },
  { label: "1 year", value: "365_days", days: 365 }
].freeze

Class Method Summary collapse

Class Method Details

.default_valueString

Returns the default preset value (useful for form defaults)

Returns:

  • (String)

    The default preset value



90
91
92
# File 'lib/api_keys/helpers/expiration_options.rb', line 90

def default_value
  "no_expiration"
end

.for_select(include_no_expiration: true, presets: nil) ⇒ Array<Array>

Returns options suitable for a Rails select helper.

Examples:

Default options

ExpirationOptions.for_select
# => [["No Expiration", "no_expiration"], ["7 days", "7_days"], ...]

Custom presets

ExpirationOptions.for_select(presets: [7, 30, 365])
# => [["No Expiration", "no_expiration"], ["7 days", "7_days"], ["30 days", "30_days"], ["1 year", "365_days"]]

Without "No Expiration"

ExpirationOptions.for_select(include_no_expiration: false)
# => [["7 days", "7_days"], ["30 days", "30_days"], ...]

Parameters:

  • include_no_expiration (Boolean) (defaults to: true)

    Whether to include "No Expiration" option (default: true)

  • presets (Array<Integer>, nil) (defaults to: nil)

    Custom list of days to include (e.g., [7, 30, 90]) If nil, uses DEFAULT_PRESETS

Returns:

  • (Array<Array>)

    Array of [label, value] pairs for select helper



49
50
51
52
53
54
55
56
57
# File 'lib/api_keys/helpers/expiration_options.rb', line 49

def for_select(include_no_expiration: true, presets: nil)
  options = if presets
              build_custom_presets(presets, include_no_expiration)
            else
              filter_default_presets(include_no_expiration)
            end

  options.map { |opt| [opt[:label], opt[:value]] }
end

.parse(preset) ⇒ ActiveSupport::TimeWithZone?

Parse an expiration preset string into an actual datetime.

Examples:

ExpirationOptions.parse("30_days")  # => 30.days.from_now
ExpirationOptions.parse("no_expiration")  # => nil
ExpirationOptions.parse(nil)  # => nil
ExpirationOptions.parse("invalid")  # => nil

Parameters:

  • preset (String, nil)

    The preset value (e.g., "30_days", "no_expiration")

Returns:

  • (ActiveSupport::TimeWithZone, nil)

    The expiration date, or nil for no expiration



70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
# File 'lib/api_keys/helpers/expiration_options.rb', line 70

def parse(preset)
  return nil if preset.blank? || preset == "no_expiration"

  # Try to extract days from the preset string (e.g., "30_days" => 30)
  if preset =~ /\A(\d+)_days?\z/
    days = ::Regexp.last_match(1).to_i
    # Reasonable max: ~10 years to prevent overflow issues
    return days.days.from_now if days.positive? && days <= 3650
  end

  # Check against known presets
  known = DEFAULT_PRESETS.find { |p| p[:value] == preset }
  return known[:days].days.from_now if known && known[:days]

  nil
end