diff --git a/.github/workflows/build-widget.yml b/.github/workflows/build-widget.yml index b8d5c9ec1..2327c29f6 100644 --- a/.github/workflows/build-widget.yml +++ b/.github/workflows/build-widget.yml @@ -14,6 +14,8 @@ on: jobs: build-widget: + permissions: + contents: read runs-on: ubuntu-22.04 steps: - name: Checkout diff --git a/Gemfile.lock b/Gemfile.lock index ea566967d..ba212441b 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -356,7 +356,8 @@ GEM timeout net-smtp (0.5.1) net-protocol - newrelic_rpm (9.21.0) + newrelic_rpm (10.2.0) + logger nio4r (2.7.4) nokogiri (1.19.1-aarch64-linux-gnu) racc (~> 1.4) diff --git a/app/controllers/admin/site_controller.rb b/app/controllers/admin/site_controller.rb index 6334cc44b..999cbca8d 100644 --- a/app/controllers/admin/site_controller.rb +++ b/app/controllers/admin/site_controller.rb @@ -12,7 +12,6 @@ def index @response_groups = Submission.group('date(created_at)').count.sort.last(@days_since.days) @user_groups = User.group('date(created_at)').count.sort.last(@days_since.days) @inactive_user_groups = User.where(inactive: true).group('date(updated_at)').count.sort.last(@days_since.days) - todays_submissions = Submission.where('created_at > ?', Time.zone.now - @days_since.days) # Add in 0 count days to fetched analytics @dates.each do |date| @@ -24,8 +23,11 @@ def index @inactive_user_groups = @inactive_user_groups.sort @response_groups = @response_groups.sort - form_ids = todays_submissions.collect(&:form_id).uniq - @recent_forms = Form.includes(:organization).find(form_ids) + @recent_forms = Form.includes(:organization) + .joins(:submissions) + .where("submissions.created_at > ?", Time.zone.now - @days_since.days) + .select("forms.*", "count(distinct submissions.id) as recent_submissions_count") + .group("forms.id") end def a11_v2_collections; end diff --git a/app/controllers/admin/submissions_controller.rb b/app/controllers/admin/submissions_controller.rb index 95b013e62..efa5c11da 100644 --- a/app/controllers/admin/submissions_controller.rb +++ b/app/controllers/admin/submissions_controller.rb @@ -186,25 +186,30 @@ def unmark def delete ensure_form_manager(form: @form) - Event.log_event(Event.names[:response_deleted], 'Submission', @submission.id, "Submission #{@submission.id} undeleted at #{DateTime.now}", current_user.id) - @submission.update(deleted: true, deleted_at: Time.now) + if @submission.update(deleted: true, deleted_at: Time.now) + Event.log_event(Event.names[:response_deleted], 'Submission', @submission.id, "Submission #{@submission.id} deleted at #{DateTime.now}", current_user.id) + else + Rails.logger.warn("Failed to delete submission: #{@submission.errors.full_messages.join(', ')}") + end end def destroy ensure_form_manager(form: @form) - Event.log_event(Event.names[:response_deleted], 'Submission', @submission.id, "Submission #{@submission.id} undeleted at #{DateTime.now}", current_user.id) - @submission.update(deleted: true, deleted_at: Time.now) - - respond_to do |format| - format.js { render :destroy } + if @submission.update(deleted: true, deleted_at: Time.now) + Event.log_event(Event.names[:response_deleted], 'Submission', @submission.id, "Submission #{@submission.id} deleted at #{DateTime.now}", current_user.id) + respond_to do |format| + format.js { render :destroy } + end + else + Rails.logger.warn("Failed to delete submission: #{@submission.errors.full_messages.join(', ')}") end end def undelete ensure_form_manager(form: @form) - Event.log_event(Event.names[:response_undeleted], 'Submission', @submission.id, "Submission #{@submission.id} deleted at #{DateTime.now}", current_user.id) + Event.log_event(Event.names[:response_undeleted], 'Submission', @submission.id, "Submission #{@submission.id} undeleted at #{DateTime.now}", current_user.id) @submission.update(deleted: false, deleted_at: nil) end diff --git a/app/views/components/admin/_recent_responses.html.erb b/app/views/components/admin/_recent_responses.html.erb index 6388a2492..b95bbc002 100644 --- a/app/views/components/admin/_recent_responses.html.erb +++ b/app/views/components/admin/_recent_responses.html.erb @@ -23,7 +23,7 @@ <%= link_to form.name, admin_form_path(form) %> - ?", Time.now - days_since.days).count %>"> + <%= number_with_delimiter(c) %> diff --git a/config/newrelic.yml b/config/newrelic.yml index fe4e0607f..20e42fdcd 100644 --- a/config/newrelic.yml +++ b/config/newrelic.yml @@ -20,6 +20,7 @@ common: &default_settings # Logging level for log/newrelic_agent.log log_level: info + log_file_path: STDOUT # Environment-specific settings are in this section. # RAILS_ENV or RACK_ENV (as appropriate) is used to determine the environment. diff --git a/package-lock.json b/package-lock.json index c8c2797af..86ac60cdd 100644 --- a/package-lock.json +++ b/package-lock.json @@ -5579,9 +5579,9 @@ "license": "MIT" }, "node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", + "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", "dev": true, "license": "ISC", "dependencies": { diff --git a/spec/features/admin/dashboard_spec.rb b/spec/features/admin/dashboard_spec.rb index 5afe8624d..f1d294cb7 100644 --- a/spec/features/admin/dashboard_spec.rb +++ b/spec/features/admin/dashboard_spec.rb @@ -142,6 +142,36 @@ end end end + + describe 'recent responses' do + let(:recent_form) { FactoryBot.create(:form, :open_ended_form, organization:) } + let(:older_form) { FactoryBot.create(:form, :recruiter, organization:) } + let!(:recent_form_responses) { + FactoryBot.create_list(:submission, 5, form: recent_form, created_at: 5.days.ago) do |submission, i| + submission.update(created_at: 1.days.ago) if i < 2 + end + } + let!(:older_form_responses) { + FactoryBot.create_list(:submission, 3, form: older_form, created_at: 5.days.ago) + } + + before do + visit admin_dashboard_path + end + + it 'contains a "Data collected over past 3 days" table' do + expect(page).to have_content('Data collected over past 3 days') + table = page.find('#recent-responses table') + expect(table).to be_present + + # 1 form with recent responses, 2 recent responses + rows = table.all('tbody tr') + expect(rows.count).to eq(1) + first_row_cells = rows.first.all('td') + expect(first_row_cells[1].text).to eq('Open-ended Test form') + expect(first_row_cells[2].text).to eq('2') + end + end end # Note: