mirror of
https://github.com/basecamp/once-campfire.git
synced 2026-10-23 22:26:48 +09:00
Deleting the memberships with delete_all skips Membership's after_destroy_commit, which resets a member's connections when one membership is revoked. Until the job ran, a member who had the room open kept its streams, and a message that still landed in the room (a request already past the membership check, a bot's reply) reached them. The request now reads the members' ids in the transaction that deletes their memberships, and the job resets their connections before it destroys the messages. It costs a Redis round trip per member, about 1.5 s for 10,000, so it's done in the job rather than in the request. User#grant_membership_to_open_rooms read the open rooms and inserted in a separate statement, so a user created while a room was being closed could read it as open and be granted it after the close. It's now a single insert ... select, which SQLite runs under the write lock, skipping duplicates as insert_all did. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Bj8KnxpTf9sj2Ysa8aLAVa
9 lines
230 B
Ruby
9 lines
230 B
Ruby
class Room::DestroyJob < ApplicationJob
|
|
discard_on ActiveJob::DeserializationError
|
|
|
|
def perform(room, former_member_ids)
|
|
room.reset_remote_connections_of(former_member_ids)
|
|
room.destroy_one_message_at_a_time
|
|
end
|
|
end
|