Files
once-campfire/app/controllers/rooms/closeds_controller.rb
Stanko Krtalić eecdb29332 Upgrade to Rails 8 and Ruby 3.4.5 (#1)
* Bump Ruby to 3.4.5
* Update dependencies
* Adjust for Rails 8 and Ruby 3.5 API changes
* Mark params strings as mutable in prepapration for frozen strings in Ruby 3.5
* Update test for HTML5 sanitizer
    With Rails 7.1 the HTML5 sanitizer became the default, this breakts this test because the old sanitizer used to delete unpermitted nodes, while the new one returns their content
    The final string is safe, but different then it used to be in Rails 7.0
* Remove direct Turbo tesh helpers require & parallelize tests
* Fix Zeitwerk issues with rails extensions
* Update Resque setup for Redis 5+
* Remove unused views
* Remove GID v1 handler
2025-09-02 17:02:41 +02:00

75 lines
1.9 KiB
Ruby

class Rooms::ClosedsController < RoomsController
before_action :set_room, only: %i[ show edit update ]
before_action :ensure_can_administer, only: %i[ update ]
before_action :remember_last_room_visited, only: :show
before_action :force_room_type, only: %i[ edit update ]
DEFAULT_ROOM_NAME = "New room"
def show
redirect_to room_url(@room)
end
def new
@room = Rooms::Closed.new(name: DEFAULT_ROOM_NAME)
@users = User.active.ordered
end
def create
room = Rooms::Closed.create_for(room_params, users: grantees)
broadcast_create_room(room)
redirect_to room_url(room)
end
def edit
selected_user_ids = @room.users.pluck(:id)
@selected_users, @unselected_users = User.active.ordered.partition { |user| selected_user_ids.include?(user.id) }
end
def update
@room.update! room_params
@room.memberships.revise(granted: grantees, revoked: revokees)
broadcast_update_room
redirect_to room_url(@room)
end
private
# Allows us to edit an open room and turn it into a closed one on saving.
def force_room_type
@room = @room.becomes!(Rooms::Closed)
end
def grantees
User.where(id: grantee_ids)
end
def revokees
@room.users.where.not(id: grantee_ids)
end
def grantee_ids
params.fetch(:user_ids, [])
end
def broadcast_create_room(room)
each_user_and_html_for(room) do |user, html|
broadcast_prepend_to user, :rooms, target: :shared_rooms, html: html
end
end
def broadcast_update_room
each_user_and_html_for(@room) do |user, html|
broadcast_replace_to user, :rooms, target: [ @room, :list ], html: html
end
end
def each_user_and_html_for(room)
# Optimization to avoid rendering the same partial for every user
html = render_to_string(partial: "users/sidebars/rooms/shared", locals: { room: room })
room.users.each { |user| yield user, html }
end
end