Class: BlueFactory::OutputGenerator

Inherits:
Object
  • Object
show all
Defined in:
lib/blue_factory/output_generator.rb

Constant Summary collapse

AT_URI_REGEXP =
%r(^at://did:(plc:[a-z0-9]+|web:[a-z0-9\-]+(\.[a-z0-9\-]+)+)/app\.bsky\.feed\.post/[a-z0-9]+$)

Instance Method Summary collapse

Instance Method Details

#generate(response) ⇒ Object



7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
# File 'lib/blue_factory/output_generator.rb', line 7

def generate(response)
  output = {}

  raise InvalidResponseError, ":posts key is missing" unless response.has_key?(:posts)
  raise InvalidResponseError, ":posts should be an array" unless response[:posts].is_a?(Array)

  output[:feed] = response[:posts].map { |x| process_post_element(x) }

  if cursor = response[:cursor]
    output[:cursor] = cursor.to_s
  end

  if req_id = response[:req_id]
    output[:reqId] = req_id.to_s
  end

  output
end

#process_post_element(object) ⇒ Object



26
27
28
29
30
31
32
33
34
35
# File 'lib/blue_factory/output_generator.rb', line 26

def process_post_element(object)
  if object.is_a?(String)
    validate_uri(object)
    { post: object }
  elsif object.is_a?(Hash)
    process_post_hash(object)
  else
    raise InvalidResponseError, "Invalid post entry, expected string or hash: #{object.inspect}"
  end
end

#process_post_hash(object) ⇒ Object



37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
# File 'lib/blue_factory/output_generator.rb', line 37

def process_post_hash(object)
  post = {}

  if object[:post]
    validate_uri(object[:post])
    post[:post] = object[:post]
  else
    raise InvalidResponseError, "Post hash is missing a :post key"
  end

  if object[:reason]
    post[:reason] = process_post_reason(object[:reason])
  end

  if object[:context]
    post[:feedContext] = object[:context].to_s
  end

  post
end

#process_post_reason(reason) ⇒ Object



58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
# File 'lib/blue_factory/output_generator.rb', line 58

def process_post_reason(reason)
  raise InvalidResponseError, "Invalid post reason: #{reason.inspect}" unless reason.is_a?(Hash)

  if reason[:repost]
    {
      "$type" => "app.bsky.feed.defs#skeletonReasonRepost",
      "repost" => reason[:repost]
    }
  elsif reason[:pin]
    {
      "$type" => "app.bsky.feed.defs#skeletonReasonPin"
    }
  else
    raise InvalidResponseError, "Invalid post reason: #{reason.inspect}"
  end
end

#validate_uri(uri) ⇒ Object



75
76
77
78
79
80
81
# File 'lib/blue_factory/output_generator.rb', line 75

def validate_uri(uri)
  if !uri.is_a?(String)
    raise InvalidResponseError, "Post URI should be a string: #{uri.inspect}"
  elsif uri !~ AT_URI_REGEXP
    raise InvalidResponseError, "Invalid post URI: #{uri.inspect}"
  end
end