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