Class: Ace::Review::Atoms::FeedbackIdGenerator

Inherits:
Object
  • Object
show all
Defined in:
lib/ace/review/atoms/feedback_id_generator.rb

Overview

Generates unique 8-character Base36 IDs for feedback items.

Uses ace-b36ts to generate timestamp-based IDs with millisecond precision that sort chronologically. This enables natural ordering of feedback items by creation time.

Examples:

Generate a new ID

FeedbackIdGenerator.generate
#=> "i50jj3ab"

IDs are chronologically sortable

id1 = FeedbackIdGenerator.generate
sleep(0.1)
id2 = FeedbackIdGenerator.generate
id1 < id2 #=> true

Class Method Summary collapse

Class Method Details

.generateString

Generate a new 8-character Base36 ID based on current timestamp with millisecond precision

Returns:

  • (String)

    8-character Base36 ID (e.g., “i50jj3ab”)



29
30
31
# File 'lib/ace/review/atoms/feedback_id_generator.rb', line 29

def self.generate
  Ace::B36ts.encode(Time.now.utc, format: :ms)
end

.generate_for(time) ⇒ String

Generate a new ID for a specific time (useful for testing)

Parameters:

  • time (Time)

    The time to encode

Returns:

  • (String)

    8-character Base36 ID



37
38
39
# File 'lib/ace/review/atoms/feedback_id_generator.rb', line 37

def self.generate_for(time)
  Ace::B36ts.encode(time.utc, format: :ms)
end

.generate_sequence(count) ⇒ Array<String>

Generate a sequence of unique, sequential IDs

Uses ace-b36ts’s encode_sequence to generate IDs that are guaranteed unique even when created in rapid succession. Each ID is strictly greater than the previous (lexicographically).

Examples:

Generate 5 unique IDs

ids = FeedbackIdGenerator.generate_sequence(5)
ids.length #=> 5
ids.uniq.length #=> 5  # All unique
ids == ids.sort #=> true  # Already sorted

Parameters:

  • count (Integer)

    Number of IDs to generate

Returns:

  • (Array<String>)

    Array of unique 8-character Base36 IDs

Raises:

  • (ArgumentError)

    If count <= 0



56
57
58
59
60
61
62
# File 'lib/ace/review/atoms/feedback_id_generator.rb', line 56

def self.generate_sequence(count)
  Ace::B36ts::Atoms::CompactIdEncoder.encode_sequence(
    Time.now.utc,
    count: count,
    format: :ms
  )
end