Authorization based on soft_token

This commit is contained in:
Jesse C. Fisher 2016-01-30 15:54:47 -08:00
parent 7af48a92a3
commit 441242a044
8 changed files with 58 additions and 5 deletions

View File

@ -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}

View File

@ -22,9 +22,9 @@ class GamesController < ApplicationController
def play_hand
# 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

View File

@ -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?

View File

@ -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

View File

@ -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

View File

@ -2,5 +2,6 @@ FactoryGirl.define do
factory :player do
game nil
user nil
sequence(:soft_token) { |n| "soft_token#{n}" }
end
end

View 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

View File

@ -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