Commit 1d80389

mo khan <mo@mokhan.ca>
2014-11-15 16:05:34
return the secure cookie hash from the login command.
1 parent bff28ab
Changed files (4)
app/models/services/login_command.rb
@@ -5,8 +5,10 @@ class LoginCommand
 
   def run(context)
     user = @users.find_by(email: context.params[:email])
-    if user && user.authenticate(context.params[:password])
-      Session.create!(user_id: user.id, ip_address: context.request.remote_ip)
+    if user && (user_session = user.login(context.params[:password]))
+      user_session.access(context.request)
+    else
+      raise "heck"
     end
   end
 end
app/models/session.rb
@@ -2,11 +2,15 @@ class Session < ActiveRecord::Base
   belongs_to :user
 
   def access(request)
-    {
-      value: id,
-      httponly: true,
-      secure: Rails.env.production? || Rails.env.staging?,
-      expires: 2.weeks.from_now
-    }
+    if save
+      {
+        value: self.id,
+        httponly: true,
+        secure: Rails.env.production? || Rails.env.staging?,
+        expires: 2.weeks.from_now
+      }
+    else
+      raise "heck"
+    end
   end
 end
app/models/user.rb
@@ -4,4 +4,12 @@ class User < ActiveRecord::Base
   validates :email, email: true
 
   has_secure_password
+
+  def login(password)
+    if authenticate(password)
+      sessions.build
+    else
+      raise 'heck'
+    end
+  end
 end
spec/models/services/login_command_spec.rb
@@ -0,0 +1,19 @@
+require 'rails_helper'
+
+describe LoginCommand do
+  subject { LoginCommand.new }
+
+  describe "#run" do
+    let(:user) { create(:user) }
+    let(:web_context) { double(params: { email: user.email, password: 'password' }, request: web_request) }
+    let(:web_request) { double(remote_ip: '192.168.0.1') }
+
+    context "when the credentials are valid" do
+      it 'returns a new user session' do
+        result = subject.run(web_context)
+        expect(result[:value]).to_not be_nil
+        expect(result[:httponly]).to eql(true)
+      end
+    end
+  end
+end