Class: Houston::Adapters::TicketTracker::UnfuddleAdapter::Connection

Inherits:
Object
  • Object
show all
Includes:
Unfuddle::NeqHelper
Defined in:
app/adapters/houston/adapters/ticket_tracker/unfuddle_adapter/connection.rb

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(unfuddle) ⇒ Connection

Returns a new instance of Connection.



12
13
14
15
16
# File 'app/adapters/houston/adapters/ticket_tracker/unfuddle_adapter/connection.rb', line 12

def initialize(unfuddle)
  @unfuddle = unfuddle
  @project_id = unfuddle.id
  @config = Houston.config.ticket_tracker_configuration(:unfuddle)
end

Instance Attribute Details

#configObject (readonly)

Idiomatic API



138
139
140
# File 'app/adapters/houston/adapters/ticket_tracker/unfuddle_adapter/connection.rb', line 138

def config
  @config
end

#project_idObject (readonly)

Idiomatic API



138
139
140
# File 'app/adapters/houston/adapters/ticket_tracker/unfuddle_adapter/connection.rb', line 138

def project_id
  @project_id
end

Instance Method Details

#all_milestonesObject



84
85
86
87
88
# File 'app/adapters/houston/adapters/ticket_tracker/unfuddle_adapter/connection.rb', line 84

def all_milestones
  unfuddle.milestones
    .reject { |m| m.archived }
    .map { |attributes | build_milestone(attributes) }
end

#all_ticketsObject



62
63
64
65
66
# File 'app/adapters/houston/adapters/ticket_tracker/unfuddle_adapter/connection.rb', line 62

def all_tickets
  Unfuddle.with_config(timeout: 300) do
    find_tickets!
  end
end

#as_user(user, &block) ⇒ Object



179
180
181
182
183
184
185
186
187
188
189
190
191
# File 'app/adapters/houston/adapters/ticket_tracker/unfuddle_adapter/connection.rb', line 179

def as_user(user, &block)
  , password = *user.credentials.for("Unfuddle")
  Unfuddle.with_config(username: , password: password, &block)
rescue Unfuddle::ConfigurationError
  raise UserCredentials::MissingCredentials
rescue Unfuddle::UnauthorizedError
  begin
    Unfuddle.with_config(username: , password: password) { Unfuddle.instance.get("people/current") }
  rescue Unfuddle::UnauthorizedError
    raise UserCredentials::InvalidCredentials
  end
  raise UserCredentials::InsufficientPermissions, "You do not have permission in Unfuddle to perform this action."
end

#build_milestone(attributes) ⇒ Object

Optional API



105
106
107
108
# File 'app/adapters/houston/adapters/ticket_tracker/unfuddle_adapter/connection.rb', line 105

def build_milestone(attributes)
  attributes = attributes.attributes if attributes.is_a?(Unfuddle::Milestone)
  Houston::Adapters::TicketTracker::UnfuddleAdapter::Milestone.new(self, attributes)
end

#build_ticket(attributes) ⇒ Object



26
27
28
29
# File 'app/adapters/houston/adapters/ticket_tracker/unfuddle_adapter/connection.rb', line 26

def build_ticket(attributes)
  attributes["reporter_email"] = find_reporter_email(attributes["reporter_id"])
  Houston::Adapters::TicketTracker::UnfuddleAdapter::Ticket.new(self, attributes)
end

#close_milestone!(houston_milestone) ⇒ Object



119
120
121
122
# File 'app/adapters/houston/adapters/ticket_tracker/unfuddle_adapter/connection.rb', line 119

def close_milestone!(houston_milestone)
  native_milestone = unfuddle.milestone(houston_milestone.remote_id)
  native_milestone.update_attribute(:completed, true)
end

#construct_ticket_query(*args) ⇒ Object



151
152
153
154
155
# File 'app/adapters/houston/adapters/ticket_tracker/unfuddle_adapter/connection.rb', line 151

def construct_ticket_query(*args)
  unfuddle.construct_ticket_query(*args)
rescue Unfuddle::UndefinedCustomField, Unfuddle::UndefinedCustomFieldValue, Unfuddle::UndefinedSeverity
  raise Houston::Adapters::TicketTracker::InvalidQueryError.new($!)
end

#create_milestone!(houston_milestone) ⇒ Object



110
111
112
113
114
115
116
117
# File 'app/adapters/houston/adapters/ticket_tracker/unfuddle_adapter/connection.rb', line 110

def create_milestone!(houston_milestone)
  native_milestone = unfuddle.create_milestone(
    "project_id" => project_id, # required for fetch! to work below
    "title" => houston_milestone.name)
  native_milestone.fetch! # fetch attributes we don't know yet

  build_milestone(native_milestone)
end

#create_ticket!(houston_ticket) ⇒ Object



31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
# File 'app/adapters/houston/adapters/ticket_tracker/unfuddle_adapter/connection.rb', line 31

def create_ticket!(houston_ticket)
  as_user(houston_ticket.reporter) do
    attrs = get_attributes_from_type(houston_ticket.type)

    native_ticket = unfuddle.create_ticket(
      "project_id" => project_id, # required for fetch! to work below
      "priority" => "3", # required by Unfuddle
      "summary" => houston_ticket.summary,
      "description" => houston_ticket.description,
      "severity_id" => attrs[:severity] && unfuddle.find_severity_by_name!(attrs[:severity]).id,
      "milestone_id" => (houston_ticket.milestone && houston_ticket.milestone.remote_id) || 0)
    native_ticket.fetch! # fetch attributes we don't know yet (like number and created_at)

    build_ticket(native_ticket.attributes)
  end

rescue Unfuddle::Error
  raise Houston::Adapters::TicketTracker::Error.new($!)
end

#featuresObject

Required API



22
23
24
# File 'app/adapters/houston/adapters/ticket_tracker/unfuddle_adapter/connection.rb', line 22

def features
  [:syncing_tickets, :syncing_milestones]
end

#find_in_cache_or_execute(key, &block) ⇒ Object



167
168
169
# File 'app/adapters/houston/adapters/ticket_tracker/unfuddle_adapter/connection.rb', line 167

def find_in_cache_or_execute(key, &block)
  Rails.cache.fetch(key, &block)
end

#find_milestone(id) ⇒ Object



96
97
98
99
# File 'app/adapters/houston/adapters/ticket_tracker/unfuddle_adapter/connection.rb', line 96

def find_milestone(id)
  attributes = unfuddle.find_milestone(id)
  build_milestone(attributes) if attributes
end

#find_ticket_by_number(number) ⇒ Object



51
52
53
54
# File 'app/adapters/houston/adapters/ticket_tracker/unfuddle_adapter/connection.rb', line 51

def find_ticket_by_number(number)
  attributes = unfuddle.find_ticket_by_number(number) unless number.blank?
  build_ticket(attributes) if attributes
end

#find_tickets!(*args) ⇒ Object



124
125
126
127
128
129
130
131
132
# File 'app/adapters/houston/adapters/ticket_tracker/unfuddle_adapter/connection.rb', line 124

def find_tickets!(*args)
  query = find_in_cache_or_execute(query_key(args)) { construct_ticket_query(*args) }
  remote_tickets = unfuddle.find_tickets!(*query)
  remote_tickets.map { |attributes | build_ticket(attributes) }
rescue Unfuddle::ConnectionError
  raise Houston::Adapters::TicketTracker::ConnectionError.new($!)
rescue Unfuddle::Error
  raise Houston::Adapters::TicketTracker::Error.new($!)
end

#find_tickets_numbered(*numbers) ⇒ Object



56
57
58
59
60
# File 'app/adapters/houston/adapters/ticket_tracker/unfuddle_adapter/connection.rb', line 56

def find_tickets_numbered(*numbers)
  numbers = numbers.flatten
  return [] if numbers.empty?
  find_tickets!(number: numbers)
end

#invalidate_cache!(*keys) ⇒ Object



171
172
173
174
175
# File 'app/adapters/houston/adapters/ticket_tracker/unfuddle_adapter/connection.rb', line 171

def invalidate_cache!(*keys)
  keys.each do |key|
    Rails.cache.delete key
  end
end

#open_milestonesObject



90
91
92
93
94
# File 'app/adapters/houston/adapters/ticket_tracker/unfuddle_adapter/connection.rb', line 90

def open_milestones
  unfuddle.milestones
    .reject { |m| m.completed || m.archived }
    .map { |attributes | build_milestone(attributes) }
end

#open_ticketsObject



68
69
70
71
72
# File 'app/adapters/houston/adapters/ticket_tracker/unfuddle_adapter/connection.rb', line 68

def open_tickets
  Unfuddle.with_config(timeout: 300) do
    find_tickets!(status: neq(:closed), resolution: 0)
  end
end

#project_urlObject



74
75
76
# File 'app/adapters/houston/adapters/ticket_tracker/unfuddle_adapter/connection.rb', line 74

def project_url
  @project_url ||= "https://#{Unfuddle.instance.subdomain}.unfuddle.com/a#/projects/#{project_id}"
end

#query_key(query) ⇒ Object



159
160
161
# File 'app/adapters/houston/adapters/ticket_tracker/unfuddle_adapter/connection.rb', line 159

def query_key(query)
  "unfuddle/projects/#{project_id}/query/#{Digest::MD5::hexdigest(query.inspect)}"
end

#reporter_key(reporter_id) ⇒ Object



163
164
165
# File 'app/adapters/houston/adapters/ticket_tracker/unfuddle_adapter/connection.rb', line 163

def reporter_key(reporter_id)
  "unfuddle/reporters/#{reporter_id}"
end

#ticket_url(ticket_number) ⇒ Object



78
79
80
# File 'app/adapters/houston/adapters/ticket_tracker/unfuddle_adapter/connection.rb', line 78

def ticket_url(ticket_number)
  "#{project_url}/tickets/by_number/#{ticket_number}"
end