From 95e9e5f3d3c5ef794a19c4f799971c94e82e74e6 Mon Sep 17 00:00:00 2001 From: Felix Eckhofer <felix@eckhofer.com> Date: Sat, 4 Jan 2025 15:05:40 +0100 Subject: [PATCH] Move engelsystem logic to conference model --- app/jobs/pretalx/import_job.rb | 46 +++++++++------------------------- app/models/conference.rb | 41 ++++++++++++++++++++++++++++++ 2 files changed, 53 insertions(+), 34 deletions(-) diff --git a/app/jobs/pretalx/import_job.rb b/app/jobs/pretalx/import_job.rb index 9174b94..34056ad 100644 --- a/app/jobs/pretalx/import_job.rb +++ b/app/jobs/pretalx/import_job.rb @@ -8,16 +8,16 @@ module Pretalx queue_as :default include ActionView::Helpers - def import_schedule(conference, url, filedrop_url) - response = HTTParty.get(url) - response.success? or return Rails.logger.error "Failed to fetch schedule from #{url}" + def import_schedule(conference) + response = HTTParty.get(conference.schedule_url) + response.success? or return Rails.logger.error "Failed to fetch schedule from #{conference.schedule_url}" schedule = JSON.parse(response.body) - return Rails.logger.error "Incomplete JSON received from #{url}" unless + return Rails.logger.error "Incomplete JSON received from #{conference.schedule_url}" unless schedule.dig('schedule', 'conference', 'rooms') && schedule.dig('schedule', 'conference', 'days') - filedrop_index = fetch_filedrop_index(filedrop_url) + filedrop_index = fetch_filedrop_index(conference.filedrop_url) # We keep a local hash of the stages, because the sessions reference stages by name instead of id stages = {} @@ -62,7 +62,7 @@ module Pretalx end end session.recorded = !session_data.fetch('do_not_record', false) - update_filedrop_data(session, filedrop_index[session.ref_id], filedrop_url) if filedrop_index[session.ref_id] + update_filedrop_data(session, filedrop_index[session.ref_id], conference.filedrop_url) if filedrop_index[session.ref_id] session.save! end end @@ -75,15 +75,12 @@ module Pretalx end end - def import_engelsystem_refs(conference, engelsystem_url) - unless translation_angel_id = - fetch_engelsystem(engelsystem_url, "angeltypes") - &.find { |t| t['name'] == 'Translation Angel' } - &.dig('id') - logger.warn("Could not find angel id for 'Translation Angel' at #{engelsystem_url}") + def import_engelsystem_refs(conference) + unless translation_angel_id = conference.fetch_translation_angel_id + logger.warn("Could not find translation angel id for #{conference.slug}") return end - return unless data = fetch_engelsystem(engelsystem_url, "angeltypes/#{translation_angel_id}/shifts") + return unless data = conference.fetch_engelsystem("angeltypes/#{translation_angel_id}/shifts") shifts = data.each_with_object({}) do |shift, hash| starts_at = parse_datetime_or_nil(conference, shift['starts_at']) @@ -111,8 +108,8 @@ module Pretalx def perform(conference_slug, *args) conference = Conference.find_by(slug: conference_slug) - import_schedule(conference, conference.data['schedule_url'], conference.data['filedrop_url']) - import_engelsystem_refs(conference, conference.data['engelsystem_url']) + import_schedule(conference) + import_engelsystem_refs(conference) RevisionSet.create!(conference:) heartbeat = conference.data['heartbeat_url'] @@ -121,25 +118,6 @@ module Pretalx private - def fetch_engelsystem(engelsystem_url, endpoint) - begin - endpoint_url = engelsystem_url + endpoint - Rails.logger.debug("Querying engelsystem API at #{endpoint_url}") - response = HTTParty.get( - endpoint_url, - headers: { - 'Accept' => 'application/json', - "x-api-key" => fetch_credential("engelsystem_token") - }, - timeout: 10 - ) - return response.success? ? JSON.parse(response.body)["data"] : nil - rescue => e - Rails.logger.warn("Engelsystem query for #{endpoint} failed: #{e.message}") - return nil - end - end - def fetch_filedrop_index(filedrop_url) return {} unless filedrop_url diff --git a/app/models/conference.rb b/app/models/conference.rb index 6da9c44..440a35c 100644 --- a/app/models/conference.rb +++ b/app/models/conference.rb @@ -26,4 +26,45 @@ class Conference < ApplicationRecord def ends_at_in_local_time ends_at.in_time_zone(time_zone || 'UTC') end + + def schedule_url + data['schedule_url'] + end + + def filedrop_url + data['filedrop_url'] + end + + def engelsystem_url + data['engelsystem_url'] + end + + def heartbeat_url + data['heartbeat_url'] + end + + def fetch_translation_angel_id + fetch_engelsystem("angeltypes") + &.find { |t| t['name'] == 'Translation Angel' } + &.dig('id') + end + + def fetch_engelsystem(endpoint) + begin + endpoint_url = engelsystem_url + endpoint + Rails.logger.debug("Querying engelsystem API at #{endpoint_url}") + response = HTTParty.get( + endpoint_url, + headers: { + 'Accept' => 'application/json', + "x-api-key" => fetch_credential("engelsystem_token") + }, + timeout: 10 + ) + return response.success? ? JSON.parse(response.body)["data"] : nil + rescue => e + Rails.logger.warn("Engelsystem query for #{endpoint} failed: #{e.message}") + return nil + end + end end -- GitLab