Authorization based on soft_token
This commit is contained in:
parent
7af48a92a3
commit
441242a044
@ -14,7 +14,7 @@ var Player = React.createClass({
|
||||
: null }
|
||||
|
||||
{/* Show player controls if player is owned by current_user */}
|
||||
{(this.props.user_id == this.props.game.current_user_id) && (this.props.game.is_started == true)
|
||||
{(this.props.soft_token == this.props.game.current_user_soft_token) && (this.props.game.is_started == true)
|
||||
? (<PlayerControls
|
||||
key={this.props.id}
|
||||
onPlayHandSubmit={this.props.onPlayHandSubmit}
|
||||
|
||||
@ -24,7 +24,7 @@ class GamesController < ApplicationController
|
||||
# TODO: move this logic out of controller maybe to model(s) ?
|
||||
|
||||
# validate player's turn
|
||||
if current_user == @game.controlling_player.user
|
||||
if current_user.soft_token == @game.controlling_player.soft_token
|
||||
|
||||
# Player action: pass
|
||||
# TODO: wtf do we need game params for? And why nest hand_type in it?
|
||||
@ -97,7 +97,7 @@ class GamesController < ApplicationController
|
||||
|
||||
def play_now
|
||||
# First joinable game or create new game
|
||||
@game = Game.where(status:nil).joins("LEFT OUTER JOIN players ON players.game_id = games.id").group("games.id").having("count(players) < 4").first || Game.create(title: "Game " + current_user.soft_token[0..4])
|
||||
@game = Game.play_now(current_user)
|
||||
@game.add_player_from_user current_user
|
||||
redirect_to @game
|
||||
end
|
||||
|
||||
@ -10,6 +10,10 @@ class Game < ActiveRecord::Base
|
||||
accepts_nested_attributes_for :players
|
||||
validates :title, presence: true
|
||||
|
||||
scope :play_now, lambda { |user|
|
||||
where(status:nil).joins("LEFT OUTER JOIN players ON players.game_id = games.id").group("games.id").having("count(players) < 4").first || Game.create(title: "Game " + user.soft_token[0..4])
|
||||
}
|
||||
|
||||
def start
|
||||
validate_startable
|
||||
return false unless startable?
|
||||
|
||||
@ -1,6 +1,8 @@
|
||||
class User < ActiveRecord::Base
|
||||
enum role: [:user, :vip, :admin]
|
||||
after_initialize :set_default_role, if: :new_record?
|
||||
validates :email, presence: true, uniqueness: true
|
||||
validates :soft_token, presence: true, uniqueness: true
|
||||
|
||||
def set_default_role
|
||||
self.role ||= :user
|
||||
|
||||
@ -11,6 +11,7 @@ json.is_joinable @game.joinable?(current_user)
|
||||
json.is_started !@game.status.nil?
|
||||
json.is_startable @game.startable?
|
||||
json.current_user_id current_user.try(:id)
|
||||
json.current_user_soft_token current_user.try(:soft_token)
|
||||
|
||||
json.players @game.players do |player|
|
||||
json.id player.id
|
||||
@ -19,7 +20,7 @@ json.players @game.players do |player|
|
||||
json.user_id player.user.try(:id)
|
||||
json.soft_token player.soft_token
|
||||
|
||||
if player.user == current_user
|
||||
if player.soft_token == current_user.soft_token
|
||||
json.inventory player.inventory
|
||||
end
|
||||
end
|
||||
|
||||
@ -2,5 +2,6 @@ FactoryGirl.define do
|
||||
factory :player do
|
||||
game nil
|
||||
user nil
|
||||
sequence(:soft_token) { |n| "soft_token#{n}" }
|
||||
end
|
||||
end
|
||||
|
||||
36
spec/features/visitor_plays_spec.rb
Normal file
36
spec/features/visitor_plays_spec.rb
Normal file
@ -0,0 +1,36 @@
|
||||
require 'rails_helper'
|
||||
include Warden::Test::Helpers
|
||||
Warden.test_mode!
|
||||
|
||||
feature 'Play a hand', type: :feature, js: true do
|
||||
before(:each) do
|
||||
@game = setup_visitor_game
|
||||
visit game_path @game
|
||||
click_button "Join"
|
||||
visit game_path @game
|
||||
click_button "Start"
|
||||
@game.reload
|
||||
end
|
||||
|
||||
after(:each) do
|
||||
Warden.test_reset!
|
||||
end
|
||||
|
||||
scenario 'player can see their own 13 card faces' do
|
||||
#TODO: Remove race condition
|
||||
sleep 3
|
||||
@player = @game.players.last
|
||||
expect(page.find_all("#player-#{@player.id} #inventory img").length).to eq(13)
|
||||
end
|
||||
|
||||
scenario 'player can see other players 13 card backs' do
|
||||
#TODO: Remove race condition
|
||||
sleep 3
|
||||
inventories = page.find_all(".inventory")
|
||||
inventories.each do |inventory|
|
||||
#TODO: This test should verify that other players card fronts are NOT seen
|
||||
expect(inventory.find_all("img").length).to eq(13)
|
||||
end
|
||||
end
|
||||
|
||||
end
|
||||
@ -14,6 +14,15 @@ module Features
|
||||
game.start
|
||||
return game
|
||||
end
|
||||
|
||||
def setup_visitor_game
|
||||
# Default game has 3 players
|
||||
game = FactoryGirl.create :game
|
||||
player1 = FactoryGirl.create :player, game: game
|
||||
player2 = FactoryGirl.create :player, game: game
|
||||
player3 = FactoryGirl.create :player, game: game
|
||||
return game
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user