-
Notifications
You must be signed in to change notification settings - Fork 29
Expand file tree
/
Copy pathsynchronized_editor.rb
More file actions
102 lines (88 loc) · 3.26 KB
/
synchronized_editor.rb
File metadata and controls
102 lines (88 loc) · 3.26 KB
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
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
# frozen_string_literal: true
class Event::SynchronizedEditor < ApplicationRecord
self.table_name = 'events_synchronized_editor'
include Creation
belongs_to :programming_group
belongs_to :study_group
belongs_to :file, class_name: 'CodeOcean::File', optional: true
enum :action, {
editor_change: 0,
connection_change: 1,
connection_status: 2,
current_content: 3,
}, prefix: true
enum :status, {
connected: 0,
disconnected: 1,
}, prefix: true
enum :editor_action, {
insert: 0,
remove: 1,
}, prefix: true
validates :session_id, presence: true
validates :status, presence: true, if: -> { action_connection_change? }
validates :file_id, presence: true, if: -> { action_editor_change? || action_current_content? }
validates :editor_action, presence: true, if: -> { action_editor_change? }
validates :range_start_row, numericality: {only_integer: true, greater_than_or_equal_to: 0}, if: -> { action_editor_change? }
validates :range_start_column, numericality: {only_integer: true, greater_than_or_equal_to: 0}, if: -> { action_editor_change? }
validates :range_end_row, numericality: {only_integer: true, greater_than_or_equal_to: 0}, if: -> { action_editor_change? }
validates :range_end_column, numericality: {only_integer: true, greater_than_or_equal_to: 0}, if: -> { action_editor_change? }
validates :lines, presence: true, if: -> { action_editor_change? }
validate :lines_not_nil, if: -> { action_current_content? }
def self.create_for_editor_change(event, user, programming_group)
event_copy = event.deep_dup
file = event_copy.delete(:active_file)
delta = event_copy.delete(:delta)
start_range = delta.delete(:start)
end_range = delta.delete(:end)
create!(
user:,
programming_group:,
study_group_id: user.current_study_group_id,
action: event_copy.delete(:action),
editor_action: delta.delete(:action),
file_id: file[:id],
session_id: event_copy.delete(:session_id),
range_start_row: start_range[:row],
range_start_column: start_range[:column],
range_end_row: end_range[:row],
range_end_column: end_range[:column],
lines: delta.delete(:lines),
data: data_attribute(event_copy, delta)
)
end
def self.create_for_current_content(message, user, programming_group)
message['files'].each do |file|
create!(
user:,
programming_group:,
study_group_id: user.current_study_group_id,
action: message['action'],
file_id: file['file_id'],
session_id: message['session_id'],
lines: file['content'].split("\n")
)
end
end
def self.create_for_connection_change(message, user, programming_group)
create!(
user:,
programming_group:,
study_group_id: user.current_study_group_id,
session_id: message[:session_id],
action: message[:action],
status: message[:status]
)
end
def self.data_attribute(event, delta)
event[:delta] = {data: delta} if delta.present?
event.presence if event.present? # TODO: As of now, we are storing the `session_id` most of the times. Intended?
end
private_class_method :data_attribute
private
def lines_not_nil
if lines.nil?
errors.add(:lines, 'cannot be nil')
end
end
end