diff --git a/.pg_migrate b/.pg_migrate new file mode 100644 index 000000000..e6afc2e53 --- /dev/null +++ b/.pg_migrate @@ -0,0 +1 @@ +up.connopts=dbname:jam_ruby diff --git a/.rspec b/.rspec new file mode 100644 index 000000000..5f1647637 --- /dev/null +++ b/.rspec @@ -0,0 +1,2 @@ +--color +--format progress diff --git a/.rvmrc b/.rvmrc new file mode 100644 index 000000000..566deff03 --- /dev/null +++ b/.rvmrc @@ -0,0 +1 @@ +rvm use ruby-1.9.3@jamruby --create diff --git a/Gemfile b/Gemfile index e6075ba88..b0e1c8d00 100644 --- a/Gemfile +++ b/Gemfile @@ -6,9 +6,11 @@ workspace = ENV["WORKSPACE"] || "~/workspace" gem 'pg', '0.14.0' gem 'jam_db', :path=> "#{workspace}/jam-db/target/ruby_package" +gem 'jampb', :path => '~/workspace/jam-pb/target/ruby/jampb' gem 'activerecord', '3.2.7' gem 'uuidtools', '2.1.2' gem 'bcrypt-ruby', '3.0.1' +gem 'ruby-protocol-buffers', '1.2.2' group :test do gem "factory_girl" diff --git a/lib/jam_ruby.rb b/lib/jam_ruby.rb index df2937c53..cc3109991 100644 --- a/lib/jam_ruby.rb +++ b/lib/jam_ruby.rb @@ -1,9 +1,11 @@ require "pg" require "active_record" require "jam_db" +require "jampb" require 'uuidtools' require "jam_ruby/version" -require "jam_ruby/models/extensions/uuid" +require "jam_ruby/message_factory" +require "jam_ruby/models/jam_session_member" require "jam_ruby/models/user" require "jam_ruby/models/jam_session" diff --git a/lib/jam_ruby/message_factory.rb b/lib/jam_ruby/message_factory.rb new file mode 100644 index 000000000..8ab61c786 --- /dev/null +++ b/lib/jam_ruby/message_factory.rb @@ -0,0 +1,93 @@ +module JamRuby + # creates messages (implementation: protocol buffer) objects cleanly + class MessageFactory + + CLIENT_TARGET = "client" + SERVER_TARGET = "server" + SESSION_TARGET_PREFIX = "session:" + USER_TARGET_PREFIX = "user:" + + + def initialize() + + end + + # create a login message using user/pass + def login_with_user_pass(username, password) + login = Jampb::Login.new(:username => username, :password => password) + return Jampb::ClientMessage.new(:type => ClientMessage::Type::LOGIN, :target => SERVER_TARGET, :login => login) + end + + # create a login message using token (a cookie or similiar) + def login_with_token(token) + login = Jampb::Login.new(:token => token) + return Jampb::ClientMessage.new(:type => ClientMessage::Type::LOGIN, :target => SERVER_TARGET, :login => login) + end + + # create a login ack (login was successful) + def login_ack(public_ip) + login_ack = Jampb::LoginAck.new(:public_ip => public_ip) + return Jampb::ClientMessage.new(:type => ClientMessage::Type::LOGIN_ACK, :target => CLIENT_TARGET, :login_ack => login_ack) + end + + # create a jam session login message + def login_jam_session(jam_session) + login_jam_session = Jampb::LoginJamSession.new(:jam_session => jam_session) + return Jampb::ClientMessage.new(:type => ClientMessage::Type::LOGIN_JAM_SESSION, :target => SESSION_TARGET_PREFIX + jam_session_id, :login_jam_session => login_jam_session) + end + + # create a jam session login message ack (success or on failure) + def login_jam_session_ack(error, error_reason) + login_jam_session_ack = Jampb::LoginJamSessionAck.new(:error => error, :error_reason => error_reason) + return Jampb::ClientMessage.new(:type => ClientMessage::Type::LOGIN_JAM_SESSION_ACK, :target => CLIENT_TARGET, :login_jam_session_ack => login_jam_session_ack) + end + + # create a jam session 'leave session' message + def leave_jam_session(jam_session) + leave_jam_session = Jampb::LeaveJamSession.new(:jam_session => jam_session) + return Jampb::ClientMessage.new(:type => ClientMessage::Type::LEAVE_JAM_SESSION, :target => SERVER_TARGET, :leave_jam_session => leave_jam_session) + end + + # create a jam session leave message ack (success or on failure) + def leave_jam_session_ack(error, error_reason) + leave_jam_session_ack = Jampb::LeaveJamSessionAck.new(:error => error, :error_reason => error_reason) + return Jampb::ClientMessage.new(:type => ClientMessage::Type::LEAVE_JAM_SESSION_ACK, :target => CLIENT_TARGET, :leave_jam_session_ack => leave_jam_session_ack) + end + + # create a server error + def server_generic_error(error_msg) + error = Jampb::ServerGenericError.new(:error_msg => error_msg) + return Jampb::ClientMessage.new(:type => ClientMessage::Type::SERVER_GENERIC_ERROR, :target => CLIENT_TARGET, :server_generic_error => error) + end + + # create a user-joined session message + def user_joined_jam_session(user_id, username) + error = Jampb::UserJoinedJamSession.new(:user_id => user_id, :username => username) + return Jampb::ClientMessage.new(:type => ClientMessage::Type::USER_JOINED_JAM_SESSION, :target => CLIENT_TARGET, :server_generic_error => error) + end + + # is this message directed to the server? + def server_directed? msg + return msg.target == MessageFactory::SERVER_TARGET + end + + # is this message directed to the client? + def client_directed? msg + return msg.target == MessageFactory::CLIENT_TARGET + end + + # is this message directed to a (jam) session? + def session_directed? msg + return msg.start_with? MessageFactory::SESSION_PREFIX_TARGET + end + + # is this message directed to a user? + def user_directed? msg + return msg.start_with? MessageFactory::USER_PREFIX_TARGET + end + + def extract_session(msg) + return + end + end +end \ No newline at end of file diff --git a/lib/jam_ruby/models/extensions/uuid.rb b/lib/jam_ruby/models/extensions/uuid.rb deleted file mode 100644 index 406e0c567..000000000 --- a/lib/jam_ruby/models/extensions/uuid.rb +++ /dev/null @@ -1,13 +0,0 @@ -module JamRuby - module UUID - extend ActiveSupport::Concern - - included do - before_create :generate_uuid - - def generate_uuid - self.id = UUIDTools::UUID.random_create.to_s - end - end - end -end \ No newline at end of file diff --git a/lib/jam_ruby/models/jam_session.rb b/lib/jam_ruby/models/jam_session.rb index 639f699d7..472e605b7 100644 --- a/lib/jam_ruby/models/jam_session.rb +++ b/lib/jam_ruby/models/jam_session.rb @@ -1,12 +1,14 @@ module JamRuby class JamSession < ActiveRecord::Base - include JamRuby::UUID - - # Verifies that the specified user (user_session_id ) can join the jam_sessin_id - # returns true/false - def access?(jam_session_id, user_session_id) + belongs_to :user, :inverse_of => :jam_sessions + has_many :jam_session_members + has_many :users, :through => :jam_session_members + + # Verifies that the specified user can join this jam session + def access?(user) + return self.users.exists? user end end diff --git a/lib/jam_ruby/models/jam_session_member.rb b/lib/jam_ruby/models/jam_session_member.rb new file mode 100644 index 000000000..ec0c99ae7 --- /dev/null +++ b/lib/jam_ruby/models/jam_session_member.rb @@ -0,0 +1,9 @@ +module JamRuby + class JamSessionMember < ActiveRecord::Base + + belongs_to :user + belongs_to :jam_session + + + end +end \ No newline at end of file diff --git a/lib/jam_ruby/models/user.rb b/lib/jam_ruby/models/user.rb index d219f5bda..8c2fee21c 100644 --- a/lib/jam_ruby/models/user.rb +++ b/lib/jam_ruby/models/user.rb @@ -2,6 +2,10 @@ module JamRuby class User < ActiveRecord::Base attr_accessible :name, :email, :password, :password_confirmation + + has_many :jam_session_members + has_many :created_jam_sessions, :foreign_key => "user_id", :inverse_of => :user # sessions *created* by the user + has_many :jam_sessions, :through => :jam_session_members has_secure_password diff --git a/spec/factories.rb b/spec/factories.rb index d71d480d4..4e3d71480 100644 --- a/spec/factories.rb +++ b/spec/factories.rb @@ -1,5 +1,5 @@ FactoryGirl.define do - factory :user do + factory :user, :class => JamRuby::User do sequence(:name) { |n| "Person #{n}" } sequence(:email) { |n| "person_#{n}@example.com"} password "foobar" @@ -9,4 +9,12 @@ FactoryGirl.define do admin true end end + + factory :jam_session, :class => JamRuby::JamSession do + sequence(:name) { |n| "Jam Session #{n}" } + end + + factory :jam_session_member, :class => JamRuby::JamSessionMember do + + end end \ No newline at end of file diff --git a/spec/jam_ruby/models/jam_session_spec.rb b/spec/jam_ruby/models/jam_session_spec.rb index 5470417c8..d80ef9cd7 100644 --- a/spec/jam_ruby/models/jam_session_spec.rb +++ b/spec/jam_ruby/models/jam_session_spec.rb @@ -3,6 +3,18 @@ require 'spec_helper' describe JamSession do it 'can grant access to valid user' do - + + user1 = FactoryGirl.create(:user) # in the jam session + user2 = FactoryGirl.create(:user) # in the jam session + user3 = FactoryGirl.create(:user) # not in the jam session + + jam_session = FactoryGirl.create(:jam_session, :user => user1) + + jam_session_member1 = FactoryGirl.create(:jam_session_member, :user => user1, :jam_session => jam_session) + jam_session_member2 = FactoryGirl.create(:jam_session_member, :user => user2, :jam_session => jam_session) + + jam_session.access?(user1).should == true + jam_session.access?(user2).should == true + jam_session.access?(user3).should == false end end \ No newline at end of file diff --git a/spec/jam_ruby/models/user_spec.rb b/spec/jam_ruby/models/user_spec.rb index 4d5103226..8250064f8 100644 --- a/spec/jam_ruby/models/user_spec.rb +++ b/spec/jam_ruby/models/user_spec.rb @@ -23,10 +23,9 @@ describe User do describe "accessible attributes" do it "should not allow access to admin" do - userish = User.new(admin: true, name: "george") - userish.admin.should == false - userish.name.should == "george" - userish.admin = true + userish = User.new(admin: true) + userish.admin.should == false # the .new style above will be ignored + userish.admin = true # but deliberate property setting will work userish.admin.should == true end end diff --git a/spec/spec_helper.rb b/spec/spec_helper.rb index 490c13840..b794c7707 100644 --- a/spec/spec_helper.rb +++ b/spec/spec_helper.rb @@ -13,6 +13,7 @@ require 'factory_girl' require 'rubygems' require 'spork' require 'database_cleaner' +require 'factories' include JamRuby