Class: Apadmi::Grout::AdoBoardService

Inherits:
BoardService show all
Defined in:
lib/apadmi/grout/service/board_service/ado_board_service.rb

Overview

Provides a layer of abstraction on top of the ADO api

Constant Summary collapse

API_VERSION_PARAM =
"api-version=6.0"

Instance Method Summary collapse

Constructor Details

#initialize(network_service, ado_config, logger) ⇒ AdoBoardService

Returns a new instance of AdoBoardService.

Parameters:



14
15
16
17
18
# File 'lib/apadmi/grout/service/board_service/ado_board_service.rb', line 14

def initialize(network_service, ado_config, logger)
  @network_service = network_service
  @ado_config = ado_config
  @logger = logger
end

Instance Method Details

#add_comment(key, comment) ⇒ Object

Parameters:

  • key (String)
  • comment (String)


76
77
78
79
80
81
82
83
# File 'lib/apadmi/grout/service/board_service/ado_board_service.rb', line 76

def add_comment(key, comment)
  key = sanitise_key(key)

  payload = {
    "text" => comment
  }
  @network_service.do_post("/wit/workitems/#{key}/comments?#{API_VERSION_PARAM}-preview.3", payload.to_json)
end

#add_tag(key, tag) ⇒ Object

Parameters:

  • key (String)
  • tag (String)


93
94
95
96
97
98
99
100
# File 'lib/apadmi/grout/service/board_service/ado_board_service.rb', line 93

def add_tag(key, tag)
  payload = [{
    "op" => "add",
    "path" => "/fields/System.Tags",
    "value" => tag
  }]
  update_ticket(key, payload)
end

#assign_fixversions(key, versions) ⇒ Object

Parameters:

  • key (String)
  • versions (Array<String>)


133
134
135
136
137
138
139
140
141
142
# File 'lib/apadmi/grout/service/board_service/ado_board_service.rb', line 133

def assign_fixversions(key, versions)
  key = sanitise_key(key)

  payload = [{
    "op" => "replace",
    "path" => "/fields/Microsoft.VSTS.Build.IntegrationBuild",
    "value" => versions.join("; ")
  }]
  update_ticket(key, payload)
end

#assign_to_user(key, user) ⇒ Object

Parameters:

  • key (String)
  • user (String)


167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
# File 'lib/apadmi/grout/service/board_service/ado_board_service.rb', line 167

def assign_to_user(key, user)
  key = sanitise_key(key)

  payload = if user
              [{
                "op": "add",
                "path": "/fields/System.AssignedTo",
                "value": user
              }]
            else
              [{
                "op": "remove",
                "path": "/fields/System.AssignedTo"
              }]
            end
  update_ticket(key, payload)
end

#find_issues_by_keys(keys) ⇒ Array<Apadmi::Grout::Issue>

Parameters:

  • keys (String[])

Returns:



22
23
24
25
26
27
28
29
30
31
32
33
34
# File 'lib/apadmi/grout/service/board_service/ado_board_service.rb', line 22

def find_issues_by_keys(keys)
  return [] if keys.length <= 0

  keys = keys.map { |k| sanitise_key(k) } # Allows supporting raw keys, and keys prefixed with a hash which is common ADO practice

  res = @network_service.do_get("/wit/workitems?ids=#{keys.join(",")}&$expand=#{@ado_config.expand_type}&errorPolicy=omit&api-version=7.1-preview.2")
  parsed = JSON.parse(res.body)
  items = parsed["value"]

  return [] if items.nil? || items.compact.empty?

  items.compact.map { |i| Apadmi::Grout::Issue.from_ado_hash(i) }
end

#flag_ticket(key, comment) ⇒ Object

Parameters:

  • key (String)
  • comment (String)


60
61
62
63
64
65
# File 'lib/apadmi/grout/service/board_service/ado_board_service.rb', line 60

def flag_ticket(key, comment)
  key = sanitise_key(key)

  add_tag(key, @ado_config.flag_tag)
  add_comment(key, comment) unless comment.blank?
end

#flagged?(key) ⇒ Boolean

Parameters:

  • key (String)

Returns:

  • (Boolean)


117
118
119
120
# File 'lib/apadmi/grout/service/board_service/ado_board_service.rb', line 117

def flagged?(key)
  current_tags = get_work_item(key)["fields"]["System.Tags"].split("; ")
  current_tags.include?(@ado_config.flag_tag)
end

#get_ticket_fixversions(key) ⇒ Array<String>

Returns fix versions.

Parameters:

  • key (String)

Returns:

  • (Array<String>)

    fix versions



146
147
148
149
150
# File 'lib/apadmi/grout/service/board_service/ado_board_service.rb', line 146

def get_ticket_fixversions(key)
  key = sanitise_key(key)

  get_work_item(key)["fields"]["Microsoft.VSTS.Build.IntegrationBuild"].split("; ")
end

#get_ticket_status(key) ⇒ String

Parameters:

  • key (String)

Returns:

  • (String)


187
188
189
190
191
# File 'lib/apadmi/grout/service/board_service/ado_board_service.rb', line 187

def get_ticket_status(key)
  key = sanitise_key(key)

  get_work_item(key)["fields"]["System.State"]
end

#get_work_item(key) ⇒ RawWorkItemHash

Parameters:

  • key (String)

Returns:

  • (RawWorkItemHash)


124
125
126
127
128
129
# File 'lib/apadmi/grout/service/board_service/ado_board_service.rb', line 124

def get_work_item(key)
  key = sanitise_key(key)

  res = @network_service.do_get("/wit/workitems/#{key}?#{API_VERSION_PARAM}")
  JSON.parse(res.body)
end

#remove_tag(key, tag) ⇒ Object

Parameters:

  • key (String)
  • tag (String)


104
105
106
107
108
109
110
111
112
113
114
# File 'lib/apadmi/grout/service/board_service/ado_board_service.rb', line 104

def remove_tag(key, tag)
  current_tags = get_work_item(key)["fields"]["System.Tags"].split("; ")
  new_tags = current_tags.filter { |t| t != tag }

  payload = [{
    "op" => "replace",
    "path" => "/fields/System.Tags",
    "value" => new_tags.join("; ")
  }]
  update_ticket(key, payload)
end

#search_unblocked_issues(component, status, ticket_types = [], options = nil) ⇒ Array<Apadmi::Grout::Issue>

Returns:



42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
# File 'lib/apadmi/grout/service/board_service/ado_board_service.rb', line 42

def search_unblocked_issues(component, status, ticket_types = [], options = nil)
  status_filter = ("AND [System.State]='#{status}' " unless status.blank?) || ""
  type_filter = ("AND [System.WorkItemType] IN (#{ticket_types.map { |t| "'#{t}'" }.join(", ")})" unless ticket_types.empty?) || ""
  options_filter = get_options_filter(component, options)
  wiql = %(
    Select [System.Id]
    From WorkItems
    Where [System.Id] >= 1
    #{status_filter}
    #{type_filter}
    #{options_filter}
  )

  get_issues_by_wiql(wiql)
end

#transition_issue(issue, state_name) ⇒ Object

Parameters:



154
155
156
157
158
159
160
161
162
163
# File 'lib/apadmi/grout/service/board_service/ado_board_service.rb', line 154

def transition_issue(issue, state_name)
  key = sanitise_key(issue.key)

  payload = [{
    "op" => "add",
    "path" => "/fields/System.State",
    "value" => state_name
  }]
  update_ticket(key, payload)
end

#un_flag_ticket(key) ⇒ Object

Parameters:

  • key (String)


68
69
70
71
72
# File 'lib/apadmi/grout/service/board_service/ado_board_service.rb', line 68

def un_flag_ticket(key)
  key = sanitise_key(key)

  remove_tag(key, @ado_config.flag_tag)
end

#update_ticket(key, payload) ⇒ Object

Parameters:

  • String

    key

  • payload (Array<Hash>)


87
88
89
# File 'lib/apadmi/grout/service/board_service/ado_board_service.rb', line 87

def update_ticket(key, payload)
  @network_service.do_patch("/wit/workitems/#{key}?#{API_VERSION_PARAM}", payload.to_json)
end