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