Merge pull request #2031 from basecamp/push-subscription-race

Fix stale-read race when creating push subscriptions
This commit is contained in:
Jorge Manrubia
2025-12-09 12:15:57 +01:00
committed by GitHub
2 changed files with 2 additions and 26 deletions
@@ -5,13 +5,7 @@ class Users::PushSubscriptionsController < ApplicationController
end
def create
if subscription = @push_subscriptions.find_by(push_subscription_params)
subscription.touch
else
@push_subscriptions.create! push_subscription_params.merge(user_agent: request.user_agent)
end
head :ok
@push_subscriptions.create_with(user_agent: request.user_agent).create_or_find_by!(push_subscription_params)
end
def destroy
@@ -14,30 +14,12 @@ class Users::PushSubscriptionsControllerTest < ActionDispatch::IntegrationTest
post user_push_subscriptions_path(users(:david)),
params: { push_subscription: subscription_params }, headers: { "HTTP_USER_AGENT" => "Mozilla/5.0" }
assert_response :ok
assert_response :no_content
assert_equal subscription_params, users(:david).push_subscriptions.last.attributes.slice("endpoint", "p256dh_key", "auth_key")
assert_equal "Mozilla/5.0", users(:david).push_subscriptions.last.user_agent
end
test "touch existing subscription" do
existing_subscription = users(:david).push_subscriptions.create!(
endpoint: "https://fcm.googleapis.com/fcm/send/abc123",
p256dh_key: "123",
auth_key: "456"
)
assert_no_difference -> { users(:david).push_subscriptions.count } do
assert_changes -> { existing_subscription.reload.updated_at } do
post user_push_subscriptions_path(users(:david)), params: {
push_subscription: existing_subscription.attributes.slice("endpoint", "p256dh_key", "auth_key")
}
end
end
assert_response :ok
end
test "destroy a push subscription" do
subscription = users(:david).push_subscriptions.create!(
endpoint: "https://fcm.googleapis.com/fcm/send/abc123",