From be4f3f75c36845e591f7293b2db7a744e7cceb7c Mon Sep 17 00:00:00 2001 From: Joshua Coles Date: Fri, 29 Sep 2023 21:06:33 +0100 Subject: [PATCH] Add toggl scraping --- app/jobs/scrape_toggl_job.rb | 38 +++++++++++++++++++ app/lib/toggl.rb | 13 +++++++ ...5_add_associated_toggl_entry_to_lecture.rb | 5 +++ ...9200245_change_toggl_entry_id_to_string.rb | 5 +++ db/schema.rb | 3 +- {app/lib => sig}/panopto.rbs | 0 sig/toggl.rbs | 3 ++ test/jobs/scrape_toggl_job_test.rb | 7 ++++ 8 files changed, 73 insertions(+), 1 deletion(-) create mode 100644 app/jobs/scrape_toggl_job.rb create mode 100644 app/lib/toggl.rb create mode 100644 db/migrate/20230929195745_add_associated_toggl_entry_to_lecture.rb create mode 100644 db/migrate/20230929200245_change_toggl_entry_id_to_string.rb rename {app/lib => sig}/panopto.rbs (100%) create mode 100644 sig/toggl.rbs create mode 100644 test/jobs/scrape_toggl_job_test.rb diff --git a/app/jobs/scrape_toggl_job.rb b/app/jobs/scrape_toggl_job.rb new file mode 100644 index 0000000..2f205ef --- /dev/null +++ b/app/jobs/scrape_toggl_job.rb @@ -0,0 +1,38 @@ +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).where(associated_toggl_entry: nil) + 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| + entries_data.find do |entry| + associated_entry = entry['time_entries'].find do |inner_entry| + (Time.new(inner_entry['start']) - lecture.start_time) < 15.seconds + end + + if associated_entry.present? + lecture.update!(associated_toggl_entry: associated_entry['id']) + end + end + end + end +end diff --git a/app/lib/toggl.rb b/app/lib/toggl.rb new file mode 100644 index 0000000..54dfa09 --- /dev/null +++ b/app/lib/toggl.rb @@ -0,0 +1,13 @@ +module Toggl + def self.entries_for_project(toggl_project_id, start_time:, end_time:) + HTTParty.post( + "http://localhost:3005/report", + body: { + "start_date": start_time.to_date.to_fs(), + "end_date": end_time.to_date.to_fs(), + "project_ids": [toggl_project_id] + }.to_json, + headers: { 'Content-Type' => 'application/json', 'Accept' => 'application/json' } + ) + end +end diff --git a/db/migrate/20230929195745_add_associated_toggl_entry_to_lecture.rb b/db/migrate/20230929195745_add_associated_toggl_entry_to_lecture.rb new file mode 100644 index 0000000..918d5c4 --- /dev/null +++ b/db/migrate/20230929195745_add_associated_toggl_entry_to_lecture.rb @@ -0,0 +1,5 @@ +class AddAssociatedTogglEntryToLecture < ActiveRecord::Migration[7.0] + def change + add_column :lectures, :associated_toggl_entry, :integer, null: true + end +end diff --git a/db/migrate/20230929200245_change_toggl_entry_id_to_string.rb b/db/migrate/20230929200245_change_toggl_entry_id_to_string.rb new file mode 100644 index 0000000..92148d9 --- /dev/null +++ b/db/migrate/20230929200245_change_toggl_entry_id_to_string.rb @@ -0,0 +1,5 @@ +class ChangeTogglEntryIdToString < ActiveRecord::Migration[7.0] + def change + change_column :lectures, :associated_toggl_entry, :string, null: true + end +end diff --git a/db/schema.rb b/db/schema.rb index 13d513d..44a1da7 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -10,7 +10,7 @@ # # It's strongly recommended that you check this file into your version control system. -ActiveRecord::Schema[7.0].define(version: 2023_09_29_184126) do +ActiveRecord::Schema[7.0].define(version: 2023_09_29_200245) do # These are extensions that must be enabled in order to support this database enable_extension "plpgsql" @@ -31,6 +31,7 @@ ActiveRecord::Schema[7.0].define(version: 2023_09_29_184126) do t.datetime "created_at", null: false t.datetime "updated_at", null: false t.bigint "course_id" + t.string "associated_toggl_entry" t.index ["course_id"], name: "index_lectures_on_course_id" t.index ["recording_id"], name: "index_lectures_on_recording_id", unique: true end diff --git a/app/lib/panopto.rbs b/sig/panopto.rbs similarity index 100% rename from app/lib/panopto.rbs rename to sig/panopto.rbs diff --git a/sig/toggl.rbs b/sig/toggl.rbs new file mode 100644 index 0000000..018f2c2 --- /dev/null +++ b/sig/toggl.rbs @@ -0,0 +1,3 @@ +module Toggl + def self.entries_for_project: -> Array[untyped] +end diff --git a/test/jobs/scrape_toggl_job_test.rb b/test/jobs/scrape_toggl_job_test.rb new file mode 100644 index 0000000..42d4723 --- /dev/null +++ b/test/jobs/scrape_toggl_job_test.rb @@ -0,0 +1,7 @@ +require "test_helper" + +class ScrapeTogglJobTest < ActiveJob::TestCase + # test "the truth" do + # assert true + # end +end