forked from decidim/decidim
-
Notifications
You must be signed in to change notification settings - Fork 0
/
update_conference_speaker.rb
104 lines (90 loc) · 3.31 KB
/
update_conference_speaker.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
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
103
104
# frozen_string_literal: true
module Decidim
module Conferences
module Admin
# A command with all the business logic when updating a conference
# speaker in the system.
class UpdateConferenceSpeaker < Rectify::Command
# Public: Initializes the command.
#
# form - A form object with the params.
# conference_speaker - The ConferenceSpeaker to update
def initialize(form, conference_speaker)
form.avatar = conference_speaker.avatar if form.avatar.blank?
@form = form
@conference_speaker = conference_speaker
end
# Executes the command. Broadcasts these events:
#
# - :ok when everything is valid.
# - :invalid if the form wasn't valid and we couldn't proceed.
#
# Returns nothing.
def call
return broadcast(:invalid) if form.invalid?
return broadcast(:invalid) unless conference_speaker
# We are going to assign the attributes only to handle the validation of the avatar before accessing
# `update_conference_speaker!` which uses `update!`. Without this step, the image validation may render
# an ActiveRecord::RecordInvalid error
# After we assign and check if the object is valid, we reload the model to let it be handled the old way
# If there is an error we add the error to the form
conference_speaker.assign_attributes(attributes)
if conference_speaker.valid?
conference_speaker.reload
transaction do
update_conference_speaker!
link_meetings(@conference_speaker)
end
broadcast(:ok)
else
form.errors.add(:avatar, conference_speaker.errors[:avatar]) if conference_speaker.errors.include? :avatar
broadcast(:invalid)
end
end
private
attr_reader :form, :conference_speaker
def attributes
form.attributes.slice(
:full_name,
:twitter_handle,
:personal_url,
:position,
:affiliation,
:short_bio
).merge(
user: form.user
).merge(uploader_attributes)
end
def uploader_attributes
{
avatar: form.avatar,
remove_avatar: form.remove_avatar
}.delete_if { |_k, val| val.is_a?(Decidim::ApplicationUploader) }
end
def update_conference_speaker!
log_info = {
resource: {
title: conference_speaker.full_name
},
participatory_space: {
title: conference_speaker.conference.title
}
}
Decidim.traceability.update!(
conference_speaker,
form.current_user,
attributes,
log_info
)
end
def conference_meetings(speaker)
meeting_components = speaker.conference.components.where(manifest_name: "meetings")
Decidim::ConferenceMeeting.where(component: meeting_components).where(id: @form.attributes[:conference_meeting_ids])
end
def link_meetings(conference_speaker)
conference_speaker.conference_meetings = conference_meetings(conference_speaker)
end
end
end
end
end