Commit 1d80389
Changed files (4)
app
models
spec
models
services
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