mirror of
https://github.com/codeninjasllc/discourse.git
synced 2025-04-01 09:39:51 -04:00
PERF: only publish notification state if we changed it
also publish seen_notification_id so we can tell what is new and what is old cleanup controller so it correctly checks user fix bug around clearing notification when people click mark read
This commit is contained in:
parent
33578a2c17
commit
25a82e7d22
2 changed files with 20 additions and 12 deletions
app
|
@ -6,27 +6,29 @@ class NotificationsController < ApplicationController
|
|||
|
||||
def index
|
||||
user = current_user
|
||||
if params[:recent].present?
|
||||
user = User.find_by_username(params[:username].to_s) if params[:username]
|
||||
|
||||
guardian.ensure_can_see_notifications!(user)
|
||||
|
||||
if params[:recent].present?
|
||||
limit = (params[:limit] || 15).to_i
|
||||
limit = 50 if limit > 50
|
||||
|
||||
notifications = Notification.recent_report(current_user, limit)
|
||||
changed = false
|
||||
|
||||
if notifications.present?
|
||||
# ordering can be off due to PMs
|
||||
max_id = notifications.map(&:id).max
|
||||
current_user.saw_notification_id(max_id) unless params.has_key?(:silent)
|
||||
changed = current_user.saw_notification_id(max_id) unless params.has_key?(:silent)
|
||||
end
|
||||
current_user.reload
|
||||
current_user.publish_notifications_state
|
||||
user.reload
|
||||
user.publish_notifications_state if changed
|
||||
|
||||
render_serialized(notifications, NotificationSerializer, root: :notifications)
|
||||
render_json_dump(notifications: serialize_data(notifications, NotificationSerializer),
|
||||
seen_notification_id: current_user.seen_notification_id)
|
||||
else
|
||||
offset = params[:offset].to_i
|
||||
user = User.find_by_username(params[:username].to_s) if params[:username]
|
||||
|
||||
guardian.ensure_can_see_notifications!(user)
|
||||
|
||||
notifications = Notification.where(user_id: user.id)
|
||||
.visible
|
||||
|
@ -37,6 +39,7 @@ class NotificationsController < ApplicationController
|
|||
notifications = notifications.offset(offset).limit(60)
|
||||
render_json_dump(notifications: serialize_data(notifications, NotificationSerializer),
|
||||
total_rows_notifications: total_rows,
|
||||
seen_notification_id: user.seen_notification_id,
|
||||
load_more_notifications: notifications_path(username: user.username, offset: offset + 60))
|
||||
end
|
||||
|
||||
|
@ -45,7 +48,7 @@ class NotificationsController < ApplicationController
|
|||
def mark_read
|
||||
Notification.where(user_id: current_user.id).includes(:topic).where(read: false).update_all(read: true)
|
||||
|
||||
current_user.saw_notification_id(Notification.recent_report(current_user, 1).max)
|
||||
current_user.saw_notification_id(Notification.recent_report(current_user, 1).max.try(:id))
|
||||
current_user.reload
|
||||
current_user.publish_notifications_state
|
||||
|
||||
|
|
|
@ -329,8 +329,12 @@ class User < ActiveRecord::Base
|
|||
end
|
||||
|
||||
def saw_notification_id(notification_id)
|
||||
User.where("id = ? and seen_notification_id < ?", id, notification_id)
|
||||
.update_all ["seen_notification_id = ?", notification_id]
|
||||
if seen_notification_id.to_i < notification_id.to_i
|
||||
update_columns(seen_notification_id: notification_id.to_i)
|
||||
true
|
||||
else
|
||||
false
|
||||
end
|
||||
end
|
||||
|
||||
def publish_notifications_state
|
||||
|
@ -375,7 +379,8 @@ class User < ActiveRecord::Base
|
|||
unread_private_messages: unread_private_messages,
|
||||
total_unread_notifications: total_unread_notifications,
|
||||
last_notification: json,
|
||||
recent: recent
|
||||
recent: recent,
|
||||
seen_notification_id: seen_notification_id
|
||||
},
|
||||
user_ids: [id] # only publish the notification to this user
|
||||
)
|
||||
|
|
Loading…
Add table
Reference in a new issue