class Toccatore::UsageUpdate
Constants
- LICENSE
Public Class Methods
new(options={})
click to toggle source
# File lib/toccatore/usage_update.rb, line 10 def initialize options={} @sqs = queue options end
Public Instance Methods
format_event(type, data, options)
click to toggle source
# File lib/toccatore/usage_update.rb, line 92 def format_event type, data, options fail "Not type given. Report #{data[:report_id]} not proccessed" if type.blank? fail "Access token missing." if options[:source_token].blank? fail "Report_id is missing" if data[:report_id].blank? { "uuid" => SecureRandom.uuid, "message-action" => "create", "subj-id" => data[:report_id], "subj"=> { "pid"=> data[:report_id], "issued"=> data[:created] }, "total"=> data[:count], "obj-id" => data[:pid], "relation-type-id" => type, "source-id" => "datacite-usage", "source-token" => options[:source_token], "occurred-at" => data[:created_at], "license" => LICENSE } end
get_data(reponse)
click to toggle source
# File lib/toccatore/usage_update.rb, line 57 def get_data reponse body = JSON.parse(reponse.messages[0].body) url = body["report_id"] host = URI.parse(body["report_id"]).host.downcase puts url puts host puts body puts "%%%%%%%%%%" Maremma.get(url, timeout: 120, host: host) end
parse_data(result, options={})
click to toggle source
# File lib/toccatore/usage_update.rb, line 114 def parse_data(result, options={}) puts result.status puts "*************" return result.body.fetch("errors") if result.body.fetch("errors", nil).present? return [{ "errors" => { "title" => "The report is blank" }}] if result.body.blank? items = result.body.dig("data","report","report-datasets") header = result.body.dig("data","report","report-header") report_id = result.url created = header.fetch("created") Array.wrap(items).reduce([]) do |x, item| data = {} data[:doi] = item.dig("dataset-id").first.dig("value") data[:pid] = normalize_doi(data[:doi]) data[:created] = created data[:report_id] = report_id data[:created_at] = created instances = item.dig("performance", 0, "instance") return x += [OpenStruct.new(body: { "errors" => "There are too many instances in #{data[:doi]} for report #{report_id}. There can only be 4" })] if instances.size > 8 x += Array.wrap(instances).reduce([]) do |ssum, instance| data[:count] = instance.dig("count") event_type = "#{instance.dig("metric-type")}-#{instance.dig("access-method")}" ssum << format_event(event_type, data, options) ssum end end end
process_data(options = {})
click to toggle source
# File lib/toccatore/usage_update.rb, line 43 def process_data(options = {}) errors = 0 message = get_message unless message.messages.empty? data = get_data(message) events = parse_data(data, options) errors = push_data(events, options) if errors < 1 delete_message message end end errors end
push_data(items, options={})
click to toggle source
method returns number of errors
# File lib/toccatore/usage_update.rb, line 70 def push_data(items, options={}) if items.empty? puts "No works found in the Queue." 0 elsif options[:access_token].blank? puts "An error occured: Access token missing." options[:total] else error_total = 0 Array(items).each do |item| puts item puts "*************" error_total += push_item(item, options) end error_total end end
push_item(item, options={})
click to toggle source
# File lib/toccatore/usage_update.rb, line 146 def push_item(item, options={}) if item["subj-id"].blank? puts OpenStruct.new(body: { "errors" => [{ "title" => "There is no Subject" }] }) return 1 elsif options[:access_token].blank? puts OpenStruct.new(body: { "errors" => [{ "title" => "Access token missing." }] }) return 1 elsif item["errors"].present? puts OpenStruct.new(body: { "errors" => [{ "title" => "#{item["errors"]["title"]}" }] }) return 1 end host = options[:push_url].presence || "https://api.test.datacite.org" push_url = host + "/events/" + item["uuid"].to_s data = { "data" => { "id" => item["uuid"], "type" => "events", "attributes" => item.except("id") }} response = Maremma.put(push_url, data: data.to_json, bearer: options[:access_token], content_type: 'json', host: host) if response.status == 201 puts "#{item['subj-id']} #{item['relation-type-id']} #{item['obj-id']} pushed to Event Data service." 0 elsif response.status == 200 puts "#{item['subj-id']} #{item['relation-type-id']} #{item['obj-id']} pushed to Event Data service for update." 0 elsif response.body["errors"].present? puts "#{item['subj-id']} #{item['relation-type-id']} #{item['obj-id']} had an error:" puts "#{response.body['errors'].first['title']}" 1 end end
queue_jobs(options={})
click to toggle source
# File lib/toccatore/usage_update.rb, line 14 def queue_jobs(options={}) total = get_total(options) if total < 1 text = "No works found for in the Usage Reports Queue." end error_total = 0 proccessed_messages = 0 num_messages = total while num_messages != 0 processed = process_data(options) error_total += processed proccessed_messages += 1 if processed == 0 num_messages -= proccessed_messages end text = "#{proccessed_messages} works processed with #{error_total} errors for Usage Reports Queue #{queue_url}" puts text # send slack notification options[:level] = total > 0 ? "good" : "warning" options[:title] = "Report for #{source_id}" send_notification_to_slack(text, options) if options[:slack_webhook_url].present? # return number of works queued proccessed_messages end
source_id()
click to toggle source
# File lib/toccatore/usage_update.rb, line 88 def source_id "usage_update" end