mirror of
https://github.com/chatwoot/chatwoot.git
synced 2026-06-04 21:02:35 +08:00
Some checks failed
Frontend Lint & Test / test (push) Has been cancelled
Publish Chatwoot EE docker images / build (linux/amd64, ubuntu-latest) (push) Has been cancelled
Publish Chatwoot EE docker images / build (linux/arm64, ubuntu-22.04-arm) (push) Has been cancelled
Publish Chatwoot CE docker images / build (linux/amd64, ubuntu-latest) (push) Has been cancelled
Publish Chatwoot CE docker images / build (linux/arm64, ubuntu-22.04-arm) (push) Has been cancelled
Run Chatwoot CE spec / lint-backend (push) Has been cancelled
Run Chatwoot CE spec / lint-frontend (push) Has been cancelled
Run Chatwoot CE spec / frontend-tests (push) Has been cancelled
Run Chatwoot CE spec / backend-tests (0, 16) (push) Has been cancelled
Run Chatwoot CE spec / backend-tests (1, 16) (push) Has been cancelled
Run Chatwoot CE spec / backend-tests (10, 16) (push) Has been cancelled
Run Chatwoot CE spec / backend-tests (11, 16) (push) Has been cancelled
Run Chatwoot CE spec / backend-tests (12, 16) (push) Has been cancelled
Run Chatwoot CE spec / backend-tests (13, 16) (push) Has been cancelled
Run Chatwoot CE spec / backend-tests (14, 16) (push) Has been cancelled
Run Chatwoot CE spec / backend-tests (15, 16) (push) Has been cancelled
Run Chatwoot CE spec / backend-tests (2, 16) (push) Has been cancelled
Run Chatwoot CE spec / backend-tests (3, 16) (push) Has been cancelled
Run Chatwoot CE spec / backend-tests (4, 16) (push) Has been cancelled
Run Chatwoot CE spec / backend-tests (5, 16) (push) Has been cancelled
Run Chatwoot CE spec / backend-tests (6, 16) (push) Has been cancelled
Run Chatwoot CE spec / backend-tests (7, 16) (push) Has been cancelled
Run Chatwoot CE spec / backend-tests (8, 16) (push) Has been cancelled
Run Chatwoot CE spec / backend-tests (9, 16) (push) Has been cancelled
Publish Chatwoot EE docker images / merge (push) Has been cancelled
Publish Chatwoot CE docker images / merge (push) Has been cancelled
We're getting many customer reports saying "I'm not getting notifications." We can't always identify the root cause since there are multiple points of failure. Added a **Push Diagnostics** tool in Super Admin to help us investigate mobile/web push issues. Here's how it works: - Look up a user by email/ID → see all their registered subscriptions with device info (iOS/Android, brand, model), token freshness, and last-updated time - Send a customizable test push and read the raw FCM/web-push/relay response to see if the customer is receiving push notifications—if not, it will show proper errors. - Delete broken subscriptions so the mobile app re-registers on next launch <img width="3816" height="1974" alt="CleanShot 2026-04-20 at 12 56 56@2x" src="https://github.com/user-attachments/assets/08ecab6f-7ec3-44b3-a114-5e6eb8cf0879" /> Fixes https://linear.app/chatwoot/issue/CW-6892/push-diagnostics-tool --------- Co-authored-by: Muhsin <12408980+muhsin-k@users.noreply.github.com> Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
69 lines
2.4 KiB
Ruby
69 lines
2.4 KiB
Ruby
class SuperAdmin::PushDiagnosticsController < SuperAdmin::ApplicationController
|
|
def show
|
|
@query = params[:user_query].to_s.strip
|
|
@user = resolve_user(@query)
|
|
@subscriptions = @user ? @user.notification_subscriptions.order(:id) : []
|
|
@results = []
|
|
end
|
|
|
|
def create
|
|
@user = User.find_by(id: params[:user_id])
|
|
return redirect_to super_admin_push_diagnostics_path, alert: I18n.t('super_admin.push_diagnostics.user_not_found') if @user.nil?
|
|
|
|
ids = parsed_subscription_ids
|
|
if ids.empty?
|
|
return redirect_to super_admin_push_diagnostics_path(user_query: @user.id),
|
|
alert: I18n.t('super_admin.push_diagnostics.no_subscriptions_to_test')
|
|
end
|
|
|
|
run_test_and_render(ids)
|
|
end
|
|
|
|
def destroy_subscriptions
|
|
user = User.find_by(id: params[:user_id])
|
|
return redirect_to super_admin_push_diagnostics_path, alert: I18n.t('super_admin.push_diagnostics.user_not_found') if user.nil?
|
|
|
|
ids = parsed_subscription_ids
|
|
if ids.empty?
|
|
return redirect_to super_admin_push_diagnostics_path(user_query: user.id),
|
|
alert: I18n.t('super_admin.push_diagnostics.no_subscriptions_to_delete')
|
|
end
|
|
|
|
deleted_count = user.notification_subscriptions.where(id: ids).destroy_all.size
|
|
log_super_admin_action("deleted #{deleted_count} subscriptions for user #{user.id}: #{ids}")
|
|
redirect_to super_admin_push_diagnostics_path(user_query: user.id),
|
|
notice: I18n.t('super_admin.push_diagnostics.subscriptions_deleted', count: deleted_count)
|
|
end
|
|
|
|
private
|
|
|
|
def run_test_and_render(ids)
|
|
@query = @user.id.to_s
|
|
@subscriptions = @user.notification_subscriptions.order(:id)
|
|
@results = Notification::PushTestService.new(
|
|
user: @user, subscription_ids: ids,
|
|
title: params[:push_title], body: params[:push_body]
|
|
).perform
|
|
|
|
log_super_admin_action("test sent for user #{@user.id} subscriptions #{ids}")
|
|
render :show
|
|
end
|
|
|
|
def log_super_admin_action(message)
|
|
Rails.logger.info(
|
|
"[SuperAdmin] push diagnostics #{message} " \
|
|
"(actor_id=#{current_super_admin&.id}, actor_email=#{current_super_admin&.email})"
|
|
)
|
|
end
|
|
|
|
def resolve_user(query)
|
|
return if query.blank?
|
|
|
|
query.match?(/\A\d+\z/) ? User.find_by(id: query) : User.from_email(query)
|
|
end
|
|
|
|
def parsed_subscription_ids
|
|
Array(params[:subscription_ids]).reject(&:blank?).map(&:to_i)
|
|
end
|
|
end
|