class ScrapeTogglJob < ApplicationJob queue_as :default def perform(*args) courses = Course.all courses.each do |course| self.scrape_course(course) end end # @param [Course] course def scrape_course(course) toggl_project_id = course.toggl_project lectures = course.lectures.order(:start_time) return if lectures.empty? entries_data = Toggl::entries_for_project( toggl_project_id, # TODO: Work out better limits start_time: Time.new('2023-01-01'), end_time: Time.new('2024-01-01') ) lectures.each do |lecture| return if lecture.attendance.present? entries_data.each do |entry| concurrent_time_entry = entry['time_entries'].find do |inner_entry| (Time.new(inner_entry['start']) - lecture.start_time) < 10.minutes end if concurrent_time_entry.present? Attendance.create!( lecture:, associated_toggl_entry: concurrent_time_entry['id'], kind: :concurrent ) elsif entry['description'] == lecture.nice_title # If the title matches but it wasn't concurrent, then it was a catchup Attendance.create!( lecture:, associated_toggl_entry: entry['time_entries'][0]['id'], kind: :catchup ) end end end end end