MayOneUS/mayday-2.0-backend

View on GitHub
app/controllers/v1/google_forms_controller.rb

Summary

Maintainability
A
0 mins
Test Coverage
class V1::GoogleFormsController < V1::BaseController

  DEFAULT_PERSON_FIELDS_NOT_ON_GOOGLE = [:remote_fields, :is_volunteer]


  # This provides a generic /v1/google_forms endpoint for processinga and submitting
  # google forms data to Google. A form post action requires the following:
  #  * google_form_metadata - contains form_id and field_mappings
  #      * field_mappings - a hash of {form_field_name: 'google.entry.id'}
  #      * field_id       - a string of the google form's id
  #  * google_form_submission_data - hash of human readable data that will be stored.
  #    Google's servers infer type.
  #    example: {javascript_skill_level: 'advanced', legislator_nominatoin: 'Jack Russel'}
  def create
    person = PersonConstructor.build(person_params).tap(&:save) # temporary fix
    if google_form_data_params.values.any?(&:present?) || (person && person.valid?)
      GoogleFormsSubmitJob.perform_later(google_form_metadata_params[:form_id], google_form_mapped_data)
      submitted = true
    else
      submitted = false
    end
    render json: { submitted: submitted }
  end

  private

  def person_params
    @person_params ||= fetch_person_params
  end

  def fetch_person_params
    person_params = params.permit(PersonConstructor::PERMITTED_PARAMS)
    nested_person_params = params.permit(person: PersonConstructor::PERMITTED_PARAMS)[:person]  || {}
    person_params.merge(nested_person_params)
  end

  def google_form_metadata_params
    params.require(:google_form_metadata).permit(:form_id, field_mappings: params[:google_form_metadata][:field_mappings].try(:keys))
  end

  def google_form_data_params
    mergeable_person_params = person_params.except(DEFAULT_PERSON_FIELDS_NOT_ON_GOOGLE)
    google_data_params = params.permit(google_form_submission_data: google_form_metadata_params[:field_mappings].keys)
    mergeable_person_params.merge(google_data_params[:google_form_submission_data] || {}).symbolize_keys
  end

  def google_form_mapped_data
    google_form_data_params.each_with_object({}) do |(internal_key, value), output_hash|
      target_key = google_form_metadata_params[:field_mappings][internal_key]
      output_hash[target_key] = value if target_key.present?
    end
  end

end