class Wsapi::Session

Attributes

workspace_id[RW]

Public Class Methods

new(session_id, opts = {}) click to toggle source
# File lib/wsapi/session.rb, line 40
def initialize(session_id, opts = {})
  @api_version = opts[:version] || "3.0"
  @workspace_id = opts[:workspace_id]
  @timeout = opts[:timeout]
  @conn = connection(session_id)
end

Public Instance Methods

build_object_url(type, id) click to toggle source
# File lib/wsapi/session.rb, line 47
def build_object_url(type, id)
  wsapi_resource_url("#{type}/#{id}").sub('userstory', 'hierarchicalrequirement')
end
create(type, fields) click to toggle source
# File lib/wsapi/session.rb, line 51
def create(type, fields)
  response = wsapi_request(:put, wsapi_resource_url("#{type}/create"), type => fields)
  Mapper.get_object(response)
end
get_current_user() click to toggle source
# File lib/wsapi/session.rb, line 56
def get_current_user
  response = wsapi_get(wsapi_resource_url("User"))
  Mapper.get_object(response)
end
get_editors(project_id, opts = {}) click to toggle source
# File lib/wsapi/session.rb, line 61
def get_editors(project_id, opts = {})
  fetch_with_pages(opts) do |page_query|
    wsapi_get(wsapi_resource_url("Project/#{project_id}/Editors"), opts.merge(page_query))
  end
end
get_project(id) click to toggle source
# File lib/wsapi/session.rb, line 67
def get_project(id)
  response = wsapi_get(wsapi_resource_url("Project/#{id}"))
  Mapper.get_object(response)
end
get_projects(opts = {}) click to toggle source
# File lib/wsapi/session.rb, line 72
def get_projects(opts = {})
  fetch_with_pages(opts) do |page_query|
    wsapi_get(wsapi_resource_url("Project"), opts.merge(page_query))
  end
end
get_subscription(id) click to toggle source
# File lib/wsapi/session.rb, line 78
def get_subscription(id)
  response = wsapi_get(wsapi_resource_url("Subscription/#{id}"))
  Mapper.get_object(response)
end
get_subscription_by_subscription_id(subscription_id) click to toggle source
# File lib/wsapi/session.rb, line 83
def get_subscription_by_subscription_id(subscription_id)
  response = wsapi_get(wsapi_resource_url("Subscription"), query: "(SubscriptionId = #{subscription_id})", pagesize: 1)
  (Mapper.get_objects(response) ||[]).first
end
get_team_members(project_id, opts = {}) click to toggle source
# File lib/wsapi/session.rb, line 88
def get_team_members(project_id, opts = {})
  fetch_with_pages(opts) do |page_query|
    wsapi_get(wsapi_resource_url("Project/#{project_id}/TeamMembers"), opts.merge(page_query))
  end
end
get_user(id) click to toggle source
# File lib/wsapi/session.rb, line 94
def get_user(id)
  response = wsapi_get(wsapi_resource_url("User/#{id}"))
  Mapper.get_object(response)
end
get_user_by_username(username) click to toggle source
# File lib/wsapi/session.rb, line 99
def get_user_by_username(username)
  response = wsapi_get(wsapi_resource_url("User"), query: "(UserName = \"#{username}\")", pagesize: 1)
  (Mapper.get_objects(response) ||[]).first
end
get_user_subscription() click to toggle source
# File lib/wsapi/session.rb, line 104
def get_user_subscription
  response = wsapi_get(wsapi_resource_url("Subscription"))
  Mapper.get_object(response)
end
get_users(query = nil) click to toggle source
# File lib/wsapi/session.rb, line 109
def get_users(query = nil)
  fetch_with_pages do |page_query|
    if query
      query_hash = { query: "(#{query})" }
      wsapi_get(wsapi_resource_url("User"), query_hash.merge(page_query))
    else
      wsapi_get(wsapi_resource_url("Users"), page_query)
    end
  end
end
setup_refresh_token(client_id, client_secret, refresh_token, &block) click to toggle source
# File lib/wsapi/session.rb, line 120
def setup_refresh_token(client_id, client_secret, refresh_token, &block)
  @oauth2 = {
    client_id: client_id,
    client_secret: client_secret,
    refresh_token: refresh_token,
    refresh_token_updated: block
  }
end
update(type, id, update_hash) click to toggle source
# File lib/wsapi/session.rb, line 129
def update(type, id, update_hash)
  response = wsapi_request(:post, wsapi_resource_url("#{type}/#{id}"), type => update_hash)
  Mapper.get_object(response)
end
update_artifact(type, id, update_hash) click to toggle source

This method is deprecated and will be removed in a future release.

# File lib/wsapi/session.rb, line 135
def update_artifact(type, id, update_hash)
  puts "WsapiAuthentication::Session#update_artifact has been deprecated. Please use #update instead."
  update(type, id, update_hash)
end

Private Instance Methods

check_response_for_errors!(response) click to toggle source
# File lib/wsapi/session.rb, line 142
def check_response_for_errors!(response)
  raise BadRequestError.new("Bad request", response) if response.status == 400
  raise AuthorizationError.new("Unauthorized", response) if response.status == 401 || response.status == 403
  raise ApiError.new("Internal server error", response) if response.status == 500
  raise ApiError.new("Service unavailable", response) if response.status == 503
  raise ObjectNotFoundError.new("Object not found") if object_not_found?(response)
  raise IpAddressLimited.new("IP Address limited", response) if ip_address_limited?(response)
end
connection(session_id) click to toggle source
# File lib/wsapi/session.rb, line 151
def connection(session_id)
  Faraday.new(ssl: {version: :TLSv1}) do |faraday|
    faraday.request :json
    faraday.use WsapiAuthentication, session_id
    faraday.adapter :excon
  end
end
fetch_with_pages(opts = {}) { |page_query| ... } click to toggle source
# File lib/wsapi/session.rb, line 159
def fetch_with_pages(opts = {}, &block)
  page_query = {
    start: opts[:start] || 1,
    pagesize: opts[:pagesize] || 100
  }
  resultCount = nil
  objects = []
  while(!resultCount || resultCount > objects.size) do
    response = yield(page_query)
    resultCount = MultiJson.load(response.body)["QueryResult"]["TotalResultCount"]
    objects += Mapper.get_objects(response)
    page_query[:start] += page_query[:pagesize]
  end
  objects
end
ip_address_limited?(response) click to toggle source
# File lib/wsapi/session.rb, line 175
def ip_address_limited?(response)
  limit_message = /Your IP address, (?:\d+\.?)+, is not within the allowed range that your subscription administrator has configured./
  response.status > 401 && response.body.match(limit_message)
end
object_not_found?(response) click to toggle source
# File lib/wsapi/session.rb, line 180
def object_not_found?(response)
  if response.status == 200
    result = MultiJson.load(response.body)["OperationResult"]
    if result && error = result["Errors"].first
      error.match("Cannot find object to read")
    else
      false
    end
  else
    false
  end
end
refresh_token!() click to toggle source
# File lib/wsapi/session.rb, line 193
def refresh_token!
  client = Faraday.new(ssl: {version: :TLSv1}) do |faraday|
    faraday.request :url_encoded
    faraday.adapter :excon
  end

  refresh_params = {
    grant_type: "refresh_token",
    refresh_token: @oauth2[:refresh_token],
    client_id: @oauth2[:client_id],
    client_secret: @oauth2[:client_secret]
  }

  response = client.post(AUTH_URL, refresh_params) { |req| req.options.timeout = @timeout }

  check_response_for_errors!(response)

  response_body = MultiJson.load(response.body)

  @oauth2[:refresh_token] = response_body["refresh_token"]
  if @oauth2[:refresh_token_updated]
    @oauth2[:refresh_token_updated].call(MultiJson.load(response.body))
  end
  response
end
workspace_url() click to toggle source
# File lib/wsapi/session.rb, line 219
def workspace_url
  wsapi_resource_url("Workspace/#{@workspace_id}")
end
wsapi_get(url, opts = {}) click to toggle source
# File lib/wsapi/session.rb, line 227
def wsapi_get(url, opts = {})
  request_options = {}
  request_options['workspace'] = workspace_url if @workspace_id
  request_options['query'] = opts[:query] if opts[:query]
  request_options['start'] = opts[:start] || 1
  request_options['pagesize'] = opts[:pagesize] || 200
  request_options['fetch'] = opts[:fetch] || true # by default, fetch full objects

  wsapi_request(:get, url, request_options)
end
wsapi_request(method, url, opts = {}) click to toggle source
# File lib/wsapi/session.rb, line 238
def wsapi_request(method, url, opts = {})
  response = @conn.send(method, url, opts) { |req| req.options.timeout = @timeout }
  if defined?(@oauth2) && response.status == 401
    refresh_token_response = refresh_token!

    access_token = MultiJson.load(refresh_token_response.body)["access_token"]
    @conn = connection(access_token)
    response = @conn.send(method, url, opts) { |req| req.options.timeout = @timeout } # Try again with fresh token
  end
  check_response_for_errors!(response)
  response
rescue Faraday::TimeoutError
  raise TimeoutError.new("Request timed out")
end
wsapi_resource_url(resource) click to toggle source
# File lib/wsapi/session.rb, line 223
def wsapi_resource_url(resource)
  File.join(WSAPI_URL, "v#{@api_version}", resource)
end