• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

kleer-la / eventer / 14001731018

21 Mar 2025 10:10PM UTC coverage: 60.221% (-0.8%) from 61.046%
14001731018

push

github

jgabardini
remove bundle cache

3111 of 5166 relevant lines covered (60.22%)

6.75 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

88.52
/app/controllers/api/contacts_controller.rb
1
# frozen_string_literal: true
2

3
module Api
1✔
4
  class ContactsController < ApplicationController
1✔
5
    # Skip CSRF if needed
6
    skip_before_action :verify_authenticity_token
1✔
7
    wrap_parameters false # to avoid nested contact
1✔
8

9
    def create
1✔
10
      validator = ContactValidator.new(contact_params)
27✔
11
      if validator.valid?
27✔
12
        contact = build_contact
23✔
13
        begin
14
          ActiveRecord::Base.transaction do
22✔
15
            contact.save!
22✔
16
            process_assessment(contact)
20✔
17
            process_notifications(contact)
20✔
18
          end
19
          render json: { data: contact.as_json(only: %i[id status assessment_report_url]) }, status: :created
20✔
20
        rescue ActiveRecord::RecordInvalid => e
21
          log_error('Validation failed during processing', e.message)
1✔
22
          render json: { error: e.message }, status: 422
1✔
23
        rescue StandardError => e
24
          log_error('Unexpected error', { error: e.message, backtrace: e.backtrace&.first(5) })
1✔
25
          render json: { error: 'Processing failed' }, status: 500
1✔
26
        end
27
      else
28
        log_error('Validation failed', "#{validator.error} #{contact_params}")
4✔
29
        render json: { error: validator.error }, status: 422
4✔
30
      end
31
    rescue ActiveRecord::RecordNotFound => e
32
      render json: { error: 'Resource not found' }, status: 422
1✔
33
    end
34

35
    def status
1✔
36
      contact = Contact.find(params[:contact_id])
×
37
      render json: { status: contact.status, assessment_report_url: contact.assessment_report_url }
×
38
    end
39

40
    private
1✔
41

42
    def contact_params
1✔
43
      params.permit(:name, :email, :context, :subject, :message, :company, :secret, :language, :resource_slug,
383✔
44
                    :can_we_contact, :suscribe, :initial_slug, :assessment_id, assessment_results: {})
45
    end
46

47
    def build_contact
1✔
48
      form_data = {
49
        name: contact_params[:name],
23✔
50
        email: contact_params[:email],
51
        company: contact_params[:company],
52
        message: contact_params[:message],
53
        page: contact_params[:context],
54
        language: contact_params[:language],
55
        initial_slug: contact_params[:initial_slug],
56
        can_we_contact: %w[true on 1].include?(contact_params[:can_we_contact]),
57
        suscribe: %w[true on 1].include?(contact_params[:suscribe])
58
      }
59

60
      if contact_params[:resource_slug].present?
23✔
61
        resource = Resource.find_by!(slug: contact_params[:resource_slug])
8✔
62
        form_data.merge!(
7✔
63
          resource_title_es: resource.title_es,
64
          resource_getit_es: resource.getit_es,
65
          resource_title_en: resource.title_en,
66
          resource_getit_en: resource.getit_en,
67
          resource_slug: resource.slug
68
        )
69
      end
70

71
      if contact_params[:assessment_id].present?
22✔
72
        form_data[:assessment_id] = contact_params[:assessment_id]
2✔
73
        form_data[:assessment_results] = contact_params[:assessment_results]
2✔
74
      end
75
      Contact.new(
22✔
76
        trigger_type: determine_trigger_type,
77
        email: contact_params[:email],
78
        form_data:,
79
        assessment_id: contact_params[:assessment_id]
80
      )
81
    end
82

83
    def determine_trigger_type
1✔
84
      if contact_params[:assessment_id].present? && contact_params[:assessment_results].present?
22✔
85
        'assessment_submission'
2✔
86
      elsif contact_params[:resource_slug].present?
20✔
87
        'download_form'
5✔
88
      else
89
        'contact_form'
15✔
90
      end
91
    end
92

93
    def process_assessment(contact)
1✔
94
      return unless contact.trigger_type == 'assessment_submission'
20✔
95

96
      # contact.assessment = Assessment.find(contact.form_data['assessment_id'].to_i)
97
      assessment_results = contact.form_data['assessment_results']
2✔
98
      ActiveRecord::Base.transaction do
2✔
99
        assessment_results.each do |question_id, answer_id|
2✔
100
          contact.responses.create!(
2✔
101
            question_id:,
102
            answer_id:
103
          )
104
        end
105
      end
106
      # GenerateAssessmentResultJob.perform_later(contact.id)
107
      true
2✔
108
    rescue ActiveRecord::RecordInvalid => e
109
      log_error('Response creation failed', e.message)
×
110
      raise # Re-raise to fail the transaction and signal the controller
×
111
    rescue JSON::ParserError => e
112
      log_error('Invalid assessment_results JSON', e.message)
×
113
      raise
×
114
    end
115

116
    def process_notifications(contact)
1✔
117
      language = (contact.form_data['language'] || 'es').to_sym
20✔
118
      templates = MailTemplate.where(
20✔
119
        trigger_type: contact.trigger_type,
120
        lang: language,
121
        active: true,
122
        delivery_schedule: 'immediate'
123
      )
124
      Log.log(:mail, :info, 'Found templates', templates.map(&:identifier))
20✔
125

126
      templates.each do |template|
20✔
127
        NotificationMailer.custom_notification(contact, template).deliver_later(queue: 'default')
11✔
128
      rescue StandardError => e
129
        log_error('Notification delivery failed', e.message)
×
130
      end
131
    end
132

133
    def log_error(message, details)
1✔
134
      Log.log(:mail, :error, message, details)
6✔
135
    end
136
  end
137
end
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2026 Coveralls, Inc