From 5a3f65e39abc1c26c36bd92efb84217c9f5a18a6 Mon Sep 17 00:00:00 2001
From: Karina Kwiatek <kjk@kjk.dog>
Date: Fri, 16 Jun 2023 18:19:31 +0200
Subject: [PATCH] Ensure counters are up to date when rendering
 inbox/notifications views

---
 app/controllers/inbox_controller.rb         | 17 ++++++-----------
 app/controllers/notifications_controller.rb |  7 +++----
 2 files changed, 9 insertions(+), 15 deletions(-)

diff --git a/app/controllers/inbox_controller.rb b/app/controllers/inbox_controller.rb
index 661d49f4..7f3db342 100644
--- a/app/controllers/inbox_controller.rb
+++ b/app/controllers/inbox_controller.rb
@@ -3,8 +3,6 @@
 class InboxController < ApplicationController
   before_action :authenticate_user!
 
-  after_action :mark_inbox_entries_as_read, only: %i[show]
-
   def show # rubocop:disable Metrics/MethodLength
     find_author
     find_inbox_entries
@@ -19,14 +17,11 @@ class InboxController < ApplicationController
     @delete_id = find_delete_id
     @disabled = true if @inbox.empty?
 
-    respond_to do |format|
-      format.html { render "show" }
-      format.turbo_stream do
-        render "show", layout: false, status: :see_other
+    mark_inbox_entries_as_read
 
-        # rubocop disabled as just flipping a flag doesn't need to have validations to be run
-        @inbox.update_all(new: false) # rubocop:disable Rails/SkipsModelValidations
-      end
+    respond_to do |format|
+      format.html
+      format.turbo_stream
     end
   end
 
@@ -85,8 +80,8 @@ class InboxController < ApplicationController
   # rubocop:disable Rails/SkipsModelValidations
   def mark_inbox_entries_as_read
     # using .dup to not modify @inbox -- useful in tests
-    @inbox&.dup&.update_all(new: false)
-    current_user.touch(:inbox_updated_at)
+    updated = @inbox&.dup&.update_all(new: false)
+    current_user.touch(:inbox_updated_at) if updated.positive?
   end
   # rubocop:enable Rails/SkipsModelValidations
 
diff --git a/app/controllers/notifications_controller.rb b/app/controllers/notifications_controller.rb
index b0088074..a240d3f7 100644
--- a/app/controllers/notifications_controller.rb
+++ b/app/controllers/notifications_controller.rb
@@ -3,8 +3,6 @@
 class NotificationsController < ApplicationController
   before_action :authenticate_user!
 
-  after_action :mark_notifications_as_read, only: %i[index]
-
   TYPE_MAPPINGS = {
     "answer"       => Notification::QuestionAnswered.name,
     "comment"      => Notification::Commented.name,
@@ -18,6 +16,7 @@ class NotificationsController < ApplicationController
     @notifications = cursored_notifications_for(type: @type, last_id: params[:last_id])
     paginate_notifications
     @counters = count_unread_by_type
+    mark_notifications_as_read
 
     respond_to do |format|
       format.html
@@ -52,8 +51,8 @@ class NotificationsController < ApplicationController
   # rubocop:disable Rails/SkipsModelValidations
   def mark_notifications_as_read
     # using .dup to not modify @notifications -- useful in tests
-    @notifications&.dup&.update_all(new: false)
-    current_user.touch(:notifications_updated_at)
+    updated = @notifications&.dup&.update_all(new: false)
+    current_user.touch(:notifications_updated_at) if updated.positive?
   end
   # rubocop:enable Rails/SkipsModelValidations