From 85a3d86111297e17affe7d684c12610dcb5f5d9d Mon Sep 17 00:00:00 2001 From: Mori Atsushi Date: Sat, 13 Apr 2019 15:37:48 +0900 Subject: [PATCH 1/4] =?UTF-8?q?=E3=83=AA=E3=83=95=E3=82=A1=E3=82=AF?= =?UTF-8?q?=E3=82=BF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit log -> subscriberに変更 --- app/channels/room_channel.rb | 51 +++++++++++++++--------------- spec/channels/room_channel_spec.rb | 10 +++--- 2 files changed, 31 insertions(+), 30 deletions(-) diff --git a/app/channels/room_channel.rb b/app/channels/room_channel.rb index 2436af1..d9874ae 100644 --- a/app/channels/room_channel.rb +++ b/app/channels/room_channel.rb @@ -1,43 +1,43 @@ class RoomChannel < ApplicationCable::Channel - attr_reader :log + attr_reader :subscriber def subscribed room = Room.find_by(key: params[:room_key]) return reject if room.blank? || room.banned?(current_user) - @log = UserRoomLog.create! user: current_user, - room: room, - ip_address: ip_address + @subscriber = UserRoomLog.create! user: current_user, + room: room, + ip_address: ip_address - stream_for @log.uuid + stream_for @subscriber.uuid stream_from "room_#{room.id}" end def unsubscribed # 既に強制退出されているときは退出処理を行わない - return if @log.blank? || @log.room.banned?(current_user) - @log.exit + return if @subscriber.blank? || @subscriber.room.banned?(@subscriber.user) + @subscriber.exit end def now_playing_video - RoomChannel.broadcast_to @log.uuid, - render_now_playing_video_json(@log.room) + RoomChannel.broadcast_to @subscriber.uuid, + render_now_playing_video_json(@subscriber.room) end def play_list - RoomChannel.broadcast_to @log.uuid, - render_play_list_json(@log.room) + RoomChannel.broadcast_to @subscriber.uuid, + render_play_list_json(@subscriber.room) end def past_chats - RoomChannel.broadcast_to @log.uuid, - render_past_chats_json(@log.room) + RoomChannel.broadcast_to @subscriber.uuid, + render_past_chats_json(@subscriber.room) end def add_video(data) - return if current_user.blank? + return if @subscriber.user.blank? - video = @log.room.add_video(data["youtube_video_id"], current_user) + video = @subscriber.room.add_video(data["youtube_video_id"], @subscriber.user) return video if video.blank? add_message = video.add_user.name + "さんが「" + video.title + "」を追加しました。" Chat.create! room: video.room, @@ -48,28 +48,29 @@ def add_video(data) end def exit_force(data) - return if current_user.blank? + return if @subscriber.user.blank? target = User.find(data["user_id"]) - logs = @log.room.user_room_logs.online.where(user: target) - logs.each do |log| - RoomChannel.broadcast_to log.uuid, + online_subscribers = @subscriber.room.user_room_logs.online + target_subscribers = online_subscribers.where(user: target) + target_subscribers.each do |target_subscriber| + RoomChannel.broadcast_to target_subscriber.uuid, render_error_json("force exit") - log.exit + target_subscriber.exit end BanReport.create! target: target, - reporter: current_user, - room: @log.room, + reporter: @subscriber.user, + room: @subscriber.room, expiration_at: Time.now.utc + 60 * 60 * 24 end def message(data) - return if current_user.blank? + return if @subscriber.user.blank? - Chat.create! room: @log.room, + Chat.create! room: @subscriber.room, chat_type: "user", message: data["message"], - user: current_user + user: @subscriber.user end private diff --git a/spec/channels/room_channel_spec.rb b/spec/channels/room_channel_spec.rb index d8a957c..bdfbaba 100644 --- a/spec/channels/room_channel_spec.rb +++ b/spec/channels/room_channel_spec.rb @@ -4,8 +4,8 @@ let(:room) { create(:room) } let(:room_key) { room.key } let(:user) { create(:user) } - let(:log) { subscription.log } - let(:target) { RoomChannel.broadcasting_for([RoomChannel.channel_name, log.uuid]) } + let(:subscriber) { subscription.subscriber } + let(:target) { RoomChannel.broadcasting_for([RoomChannel.channel_name, subscriber.uuid]) } let(:stream_from) { "room_" + room.id.to_s } let(:current_user) { user } before { stub_connection current_user: current_user, ip_address: "0.0.0.0" } @@ -103,7 +103,7 @@ before { subscribe room_key: room.key } it { expect { subject }.to change(Chat, :count).by(1) } it { expect { subject }.to change { room.online_users.count }.by(-1) } - it { expect { subject }.to change { log.exit_at }.from(nil).to(Time) } + it { expect { subject }.to change { subscriber.exit_at }.from(nil).to(Time) } context "without login" do let(:current_user) { nil } @@ -113,7 +113,7 @@ to change(Chat, :count).by(0). and change { room.online_users.count }.by(0) } - it { expect { subject }.to change { log.exit_at }.from(nil).to(Time) } + it { expect { subject }.to change { subscriber.exit_at }.from(nil).to(Time) } end context "of duplicate subscription" do @@ -124,7 +124,7 @@ to change(Chat, :count).by(0). and change { room.online_users.count }.by(0) } - it { expect { subject }.to change { log.exit_at }.from(nil).to(Time) } + it { expect { subject }.to change { subscriber.exit_at }.from(nil).to(Time) } end end From 40c77f4c90dfcdb0395ed8ee0cf6965a8511372f Mon Sep 17 00:00:00 2001 From: Mori Atsushi Date: Sat, 13 Apr 2019 19:38:32 +0900 Subject: [PATCH 2/4] =?UTF-8?q?=E9=80=9A=E4=BF=A1=E6=99=82=E3=81=ABupdated?= =?UTF-8?q?=5Fat=E3=82=92=E6=9B=B4=E6=96=B0=E3=81=99=E3=82=8B=E3=82=88?= =?UTF-8?q?=E3=81=86=E3=81=AB=E3=81=97=E3=81=9F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/channels/room_channel.rb | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/app/channels/room_channel.rb b/app/channels/room_channel.rb index d9874ae..cb41ae9 100644 --- a/app/channels/room_channel.rb +++ b/app/channels/room_channel.rb @@ -20,21 +20,25 @@ def unsubscribed end def now_playing_video + @subscriber.touch # rubocop:disable Rails/SkipsModelValidations RoomChannel.broadcast_to @subscriber.uuid, render_now_playing_video_json(@subscriber.room) end def play_list + @subscriber.touch # rubocop:disable Rails/SkipsModelValidations RoomChannel.broadcast_to @subscriber.uuid, render_play_list_json(@subscriber.room) end def past_chats + @subscriber.touch # rubocop:disable Rails/SkipsModelValidations RoomChannel.broadcast_to @subscriber.uuid, render_past_chats_json(@subscriber.room) end def add_video(data) + @subscriber.touch # rubocop:disable Rails/SkipsModelValidations return if @subscriber.user.blank? video = @subscriber.room.add_video(data["youtube_video_id"], @subscriber.user) @@ -48,6 +52,7 @@ def add_video(data) end def exit_force(data) + @subscriber.touch # rubocop:disable Rails/SkipsModelValidations return if @subscriber.user.blank? target = User.find(data["user_id"]) @@ -65,6 +70,7 @@ def exit_force(data) end def message(data) + @subscriber.touch # rubocop:disable Rails/SkipsModelValidations return if @subscriber.user.blank? Chat.create! room: @subscriber.room, From 2641f75b0abbd925703413fba7f0b41b8fc0f637 Mon Sep 17 00:00:00 2001 From: Mori Atsushi Date: Sat, 13 Apr 2019 19:40:04 +0900 Subject: [PATCH 3/4] =?UTF-8?q?updated=5Fat=E3=81=AB=E3=82=88=E3=81=A3?= =?UTF-8?q?=E3=81=A6online=E3=82=92=E5=A4=89=E6=9B=B4=E3=81=99=E3=82=8B?= =?UTF-8?q?=E3=82=88=E3=81=86=E3=81=AB=E3=81=97=E3=81=9F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/models/user_room_log.rb | 2 +- spec/models/user_room_log_spec.rb | 33 +++++++++++++++++++++++++++++++ 2 files changed, 34 insertions(+), 1 deletion(-) diff --git a/app/models/user_room_log.rb b/app/models/user_room_log.rb index 180b9f2..9b4e3f6 100644 --- a/app/models/user_room_log.rb +++ b/app/models/user_room_log.rb @@ -7,7 +7,7 @@ class UserRoomLog < ApplicationRecord after_create :send_enter_message after_update :send_exit_message, if: proc { |log| log.exit_at_before_last_save.blank? && log.exit_at.present? } - scope :online, -> { where exit_at: nil } + scope :online, -> { where(exit_at: nil).where("updated_at > ?", Time.now.utc - 60 * 60) } def exit update! exit_at: Time.now.utc diff --git a/spec/models/user_room_log_spec.rb b/spec/models/user_room_log_spec.rb index 212b76d..7f521f4 100644 --- a/spec/models/user_room_log_spec.rb +++ b/spec/models/user_room_log_spec.rb @@ -5,4 +5,37 @@ log = build(:user_room_log) expect(log).to be_valid end + + describe "#online" do + subject { UserRoomLog.online } + + let(:updated_at) { Time.now.utc } + let(:log) { create(:user_room_log, exit_at: exit_at, updated_at: updated_at) } + + before { log.save! } + + context "when exit_at is nil" do + let(:exit_at) { nil } + + it "returns a log" do + expect(subject.size).to eq 1 + end + + context "and updated_at is out of date" do + let(:updated_at) { Time.now.utc - 60 * 60 - 10 } + + it "did not returns a log" do + expect(subject.size).to eq 0 + end + end + end + + context "when exit_at exsit" do + let(:exit_at) { Time.now.utc - 10 } + + it "did not returns a log" do + expect(subject.size).to eq 0 + end + end + end end From e2aa83c67c320256d8353406374d0f88abb1ddd8 Mon Sep 17 00:00:00 2001 From: Mori Atsushi Date: Thu, 2 May 2019 09:02:41 +0900 Subject: [PATCH 4/4] Fix review points --- app/models/user_room_log.rb | 2 +- spec/models/user_room_log_spec.rb | 5 ++--- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/app/models/user_room_log.rb b/app/models/user_room_log.rb index 9b4e3f6..33ef66b 100644 --- a/app/models/user_room_log.rb +++ b/app/models/user_room_log.rb @@ -7,7 +7,7 @@ class UserRoomLog < ApplicationRecord after_create :send_enter_message after_update :send_exit_message, if: proc { |log| log.exit_at_before_last_save.blank? && log.exit_at.present? } - scope :online, -> { where(exit_at: nil).where("updated_at > ?", Time.now.utc - 60 * 60) } + scope :online, -> { where(exit_at: nil).where(updated_at: 1.hour.ago..Time.current) } def exit update! exit_at: Time.now.utc diff --git a/spec/models/user_room_log_spec.rb b/spec/models/user_room_log_spec.rb index 7f521f4..2aed68e 100644 --- a/spec/models/user_room_log_spec.rb +++ b/spec/models/user_room_log_spec.rb @@ -10,9 +10,8 @@ subject { UserRoomLog.online } let(:updated_at) { Time.now.utc } - let(:log) { create(:user_room_log, exit_at: exit_at, updated_at: updated_at) } - before { log.save! } + before { create(:user_room_log, exit_at: exit_at, updated_at: updated_at) } context "when exit_at is nil" do let(:exit_at) { nil } @@ -30,7 +29,7 @@ end end - context "when exit_at exsit" do + context "when exit_at exist" do let(:exit_at) { Time.now.utc - 10 } it "did not returns a log" do