forked from WikiEducationFoundation/WikiEduDashboard
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathupdate_timeslices_course_wiki.rb
64 lines (53 loc) · 2.47 KB
/
update_timeslices_course_wiki.rb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
# frozen_string_literal: true
require_dependency "#{Rails.root}/lib/timeslice_manager"
require_dependency "#{Rails.root}/lib/timeslice_cleaner"
require_dependency "#{Rails.root}/lib/articles_courses_cleaner_timeslice"
class UpdateTimeslicesCourseWiki
def initialize(course)
@course = course
@timeslice_manager = TimesliceManager.new(course)
@timeslice_cleaner = TimesliceCleaner.new(course)
end
def run
# Get the existing courses wikis
current_course_wiki_ids = @course.wikis.pluck(:id)
# Courses wiki for whose exist a course wiki timeslice are considered processed
processed_courses_wikis = CourseWikiTimeslice.where(course: @course)
.select(:wiki_id).distinct.pluck(:wiki_id)
deleted_wiki_ids = processed_courses_wikis - current_course_wiki_ids
remove_courses_wikis(deleted_wiki_ids)
new_wiki_ids = current_course_wiki_ids - processed_courses_wikis
add_courses_wikis(new_wiki_ids)
# Check if some wiki changes timeslice duration
update_timeslices_durations
end
private
def remove_courses_wikis(wiki_ids)
return if wiki_ids.empty?
Rails.logger.info { "UpdateTimeslicesCourseWiki: Deleting wikis: #{wiki_ids}" }
# Delete timeslices for the deleted wikis
@timeslice_cleaner.delete_timeslices_for_deleted_course_wikis wiki_ids
# Delete articles courses
ArticlesCoursesCleanerTimeslice.clean_articles_courses_for_wiki_ids(@course, wiki_ids)
end
def add_courses_wikis(wiki_ids)
return if wiki_ids.empty?
wikis = Wiki.where(id: wiki_ids)
Rails.logger.info { "UpdateTimeslicesCourseWiki: Adding wikis: #{wiki_ids}" }
# Create course wiki timeslice records for new wikis
@timeslice_manager.create_timeslices_for_new_course_wiki_records(wikis)
end
def update_timeslices_durations
@course.wikis.each do |wiki|
start = @timeslice_manager.get_ingestion_start_time_for_wiki wiki
timeslice = @course.course_wiki_timeslices.where(wiki:, start:).first
next unless timeslice
effective_timeslice_duration = timeslice.end - timeslice.start
real_timeslice_duration = @timeslice_manager.timeslice_duration(wiki)
# Continue if timeslice duration didn't change for the wiki
next unless effective_timeslice_duration != real_timeslice_duration
@timeslice_cleaner.delete_course_wiki_timeslices_after_date([wiki], start - 1.second)
@timeslice_manager.create_wiki_timeslices_up_to_new_course_end_date(wiki)
end
end
end