class Decidim::Meetings::Admin::CopyMeeting

in the system.
A command with all the business logic when copying a meeting

def call

Returns nothing.

- :invalid if the form was not valid and we could not proceed.
- :ok when everything is valid.

Executes the command. Broadcasts these events:
def call
  return broadcast(:invalid) if form.invalid?
  transaction do
    copy_meeting!
    copy_services!
    send_notification
  end
  broadcast(:ok, copied_meeting)
end

def copy_meeting!

def copy_meeting!
  parsed_title = Decidim::ContentProcessor.parse_with_processor(:hashtag, form.title, current_organization: meeting.organization).rewrite
  parsed_description = Decidim::ContentProcessor.parse_with_processor(:hashtag, form.description, current_organization: meeting.organization).rewrite
  @copied_meeting = Decidim.traceability.create!(
    Meeting,
    form.current_user,
    scope: form.scope,
    category: form.category,
    title: parsed_title,
    description: parsed_description,
    end_time: form.end_time,
    start_time: form.start_time,
    address: form.address,
    latitude: form.latitude,
    longitude: form.longitude,
    location: form.location,
    location_hints: form.location_hints,
    component: meeting.component,
    private_meeting: form.private_meeting,
    transparent: form.transparent,
    author: form.current_organization,
    questionnaire: form.questionnaire,
    online_meeting_url: form.online_meeting_url,
    type_of_meeting: form.type_of_meeting,
    iframe_embed_type: form.iframe_embed_type,
    iframe_access_level: form.iframe_access_level,
    comments_enabled: form.comments_enabled,
    comments_start_time: form.comments_start_time,
    comments_end_time: form.comments_end_time,
    registration_type: form.registration_type,
    registration_url: form.registration_url,
    **fields_from_meeting
  )
end

def copy_services!

def copy_services!
  form.services_to_persist.map do |service|
    Decidim::Meetings::Service.create!(
      meeting: copied_meeting,
      "title" => service.title,
      "description" => service.description
    )
  end
end

def fields_from_meeting

def fields_from_meeting
  {
    registrations_enabled: meeting.registrations_enabled,
    available_slots: meeting.available_slots,
    registration_terms: meeting.registration_terms,
    reserved_slots: meeting.reserved_slots,
    customize_registration_email: meeting.customize_registration_email,
    registration_form_enabled: meeting.registration_form_enabled,
    registration_email_custom_content: meeting.registration_email_custom_content
  }
end

def initialize(form, meeting)

meeting - A meeting we want to duplicate
form - A form object with the params.

Public: Initializes the command.
def initialize(form, meeting)
  @form = form
  @meeting = meeting
end

def send_notification

def send_notification
  Decidim::EventsManager.publish(
    event: "decidim.events.meetings.meeting_created",
    event_class: Decidim::Meetings::CreateMeetingEvent,
    resource: copied_meeting,
    followers: copied_meeting.participatory_space.followers
  )
end