mirror of
https://github.com/basecamp/once-campfire.git
synced 2026-08-13 02:20:42 +09:00
Merge pull request #239 from ronaldlokers/feat/bot-message-update
Allow bots to update and destroy their own messages
This commit is contained in:
@@ -1,9 +1,11 @@
|
||||
class Messages::ByBotsController < MessagesController
|
||||
include RawRequestBody
|
||||
|
||||
allow_bot_access only: %i[ index create ]
|
||||
allow_bot_access only: %i[ index create update destroy ]
|
||||
|
||||
before_action :set_room
|
||||
before_action :set_message, only: %i[ update destroy ]
|
||||
before_action :ensure_can_administer, only: %i[ update destroy ]
|
||||
before_action :ensure_body_or_attachment_present, only: :create
|
||||
|
||||
def index
|
||||
@@ -16,6 +18,11 @@ class Messages::ByBotsController < MessagesController
|
||||
head :created, location: message_url(@message)
|
||||
end
|
||||
|
||||
def destroy
|
||||
super
|
||||
head :no_content
|
||||
end
|
||||
|
||||
private
|
||||
def set_room
|
||||
@room = Current.user.rooms.find_by(id: params[:room_id])
|
||||
|
||||
@@ -37,7 +37,11 @@ class MessagesController < ApplicationController
|
||||
@message.update!(message_params)
|
||||
|
||||
@message.broadcast_replace_to @room, :messages, target: [ @message, :presentation ], partial: "messages/presentation", attributes: { maintain_scroll: true }
|
||||
redirect_to room_message_url(@room, @message)
|
||||
|
||||
respond_to do |format|
|
||||
format.html { redirect_to room_message_url(@room, @message) }
|
||||
format.json { render :show }
|
||||
end
|
||||
end
|
||||
|
||||
def destroy
|
||||
|
||||
@@ -0,0 +1 @@
|
||||
json.partial! "messages/message", message: @message
|
||||
+1
-1
@@ -64,7 +64,7 @@ Rails.application.routes.draw do
|
||||
|
||||
nested do
|
||||
scope path: ":bot_key", as: :bot, defaults: { format: :json } do
|
||||
resources :messages, controller: "messages/by_bots", only: %i[ index create ] do
|
||||
resources :messages, controller: "messages/by_bots", only: %i[ index create update destroy ] do
|
||||
resources :boosts, controller: "messages/boosts/by_bots", only: :create
|
||||
end
|
||||
end
|
||||
|
||||
@@ -148,4 +148,88 @@ class Messages::ByBotsControllerTest < ActionDispatch::IntegrationTest
|
||||
get room_messages_url(@room, bot_key: users(:bender).bot_key)
|
||||
assert_response :forbidden
|
||||
end
|
||||
|
||||
test "update" do
|
||||
message = post_bot_message "Deploying..."
|
||||
|
||||
assert_no_difference -> { Message.count } do
|
||||
patch room_bot_message_url(@room, users(:bender).bot_key, message), params: +"Deployed."
|
||||
end
|
||||
|
||||
assert_response :ok
|
||||
assert_equal "Deployed.", message.reload.plain_text_body
|
||||
|
||||
json = JSON.parse(response.body)
|
||||
assert_equal message.id, json["id"]
|
||||
assert_equal "Deployed.", json["body"]["plain_text"]
|
||||
assert_equal users(:bender).id, json["creator"]["id"]
|
||||
assert_equal room_message_url(@room, message), json["url"]
|
||||
end
|
||||
|
||||
test "update with UTF-8 content" do
|
||||
message = post_bot_message "Deploying..."
|
||||
|
||||
patch room_bot_message_url(@room, users(:bender).bot_key, message), params: +"Deployed 🚀!"
|
||||
|
||||
assert_response :ok
|
||||
assert_equal "Deployed 🚀!", message.reload.plain_text_body
|
||||
assert_equal "Deployed 🚀!", JSON.parse(response.body)["body"]["plain_text"]
|
||||
end
|
||||
|
||||
test "update can't touch a message the bot did not create" do
|
||||
message = messages(:fourth)
|
||||
original = message.plain_text_body
|
||||
|
||||
patch room_bot_message_url(@room, users(:bender).bot_key, message), params: +"Hijacked!"
|
||||
|
||||
assert_response :forbidden
|
||||
assert_equal original, message.reload.plain_text_body
|
||||
end
|
||||
|
||||
test "update is not found for a room the bot is not a member of" do
|
||||
message = messages(:first)
|
||||
original = message.plain_text_body
|
||||
|
||||
patch room_bot_message_url(rooms(:designers), users(:bender).bot_key, message), params: +"Hijacked!"
|
||||
|
||||
assert_response :not_found
|
||||
assert_equal original, message.reload.plain_text_body
|
||||
end
|
||||
|
||||
test "update can't be abused to edit messages as any user" do
|
||||
message = messages(:fourth)
|
||||
bot_key = "#{users(:jz).id}-"
|
||||
original = message.plain_text_body
|
||||
|
||||
patch room_bot_message_url(@room, bot_key, message), params: +"Hijacked!"
|
||||
|
||||
assert_response :redirect
|
||||
assert_equal original, message.reload.plain_text_body
|
||||
end
|
||||
|
||||
test "destroy" do
|
||||
message = post_bot_message "Deploying..."
|
||||
|
||||
assert_difference -> { Message.count }, -1 do
|
||||
delete room_bot_message_url(@room, users(:bender).bot_key, message)
|
||||
end
|
||||
|
||||
assert_response :no_content
|
||||
end
|
||||
|
||||
test "destroy can't touch a message the bot did not create" do
|
||||
message = messages(:fourth)
|
||||
|
||||
assert_no_difference -> { Message.count } do
|
||||
delete room_bot_message_url(@room, users(:bender).bot_key, message)
|
||||
end
|
||||
|
||||
assert_response :forbidden
|
||||
end
|
||||
|
||||
private
|
||||
def post_bot_message(body)
|
||||
post room_bot_messages_url(@room, users(:bender).bot_key), params: +body
|
||||
Message.last
|
||||
end
|
||||
end
|
||||
|
||||
Reference in New Issue
Block a user