Browse Source

Initial stab at check-in feature

eperez-timeinput
Jason Denney 11 years ago
parent
commit
d7755f00ed
  1. 43
      app/assets/javascripts/login.js
  2. 23
      app/controllers/api/v1/base_controller.rb
  3. 20
      app/controllers/api/v1/logs_controller.rb
  4. 33
      app/models/user.rb
  5. 9
      app/views/devise/sessions/new.html.erb
  6. 6
      config/initializers/devise.rb
  7. 9
      config/routes.rb
  8. 5
      db/seed/fixtures/acts_as_loggable/user_actions.yml

43
app/assets/javascripts/login.js

@ -0,0 +1,43 @@
$("#checkin_menu").show();
$("#checkin").click( function(e){
var username = $("#user_email").val();
var password = $("#user_password").val();
$.ajax({
type: 'POST',
url: '/api/v1/checkin',
dataType: 'json',
contentType: 'application/json',
processData: false,
data: JSON.stringify({"username": username, "password": password }),
complete: function() { },
success: function(data) {
alert("Checked IN!");
$("#user_email").val('');
$("#user_password").val('');
},
error: function(data,textStatus) {
alert( "Error: " + JSON.parse(data.responseText)["error"]);
}
})
});
$("#checkout").click( function(e){
var username = $("#user_email").val();
var password = $("#user_password").val();
$.ajax({
type: 'POST',
url: '/api/v1/checkout',
dataType: 'json',
contentType: 'application/json',
processData: false,
data: JSON.stringify({"username": username, "password": password }),
complete: function() { },
success: function(data) {
alert("Checked OUT!");
$("#user_email").val('');
$("#user_password").val('');
},
error: function(data,textStatus) {
alert( "Error: " + JSON.parse(data.responseText)["error"]);
}
})
});

23
app/controllers/api/v1/base_controller.rb

@ -0,0 +1,23 @@
class Api::V1::BaseController < ActionController::Base
respond_to :json
before_filter :authenticate_user
private
def authenticate_user
if params[:token]
@current_user = User.find_by_authentication_token(params[:token])
else
user = User.find_for_database_authentication( :email => params[:username] )
@current_user = user if user && user.valid_password?( params[:password] )
end
unless @current_user
render :json => {:error => "Username/Password/Token invalid" }, :status => 403
end
end
def current_user
@current_user
end
end

20
app/controllers/api/v1/logs_controller.rb

@ -0,0 +1,20 @@
class Api::V1::LogsController < Api::V1::BaseController
def checkin
if @current_user.checked_in?
render :json => { "error" => "You are already checked in."}, :status => 404 and return
else
@current_user.checkin
render :nothing => true, :status => 204 and return
end
end
def checkout
if !@current_user.checked_in?
render :json => { "error" => "You were not even checked in."}, :status => 404 and return
else
@current_user.checkout
render :nothing => true, :status => 204 and return
end
end
end

33
app/models/user.rb

@ -36,6 +36,8 @@ class User < ActiveRecord::Base
user_role.to_s == role.to_s
end
### TODO methods below probably belong somewhere else
def total_hours
ActsAsLoggable::Log.where( :loggable_type => self.class.to_s, :loggable_id => self.id).sum { |l| (l.end_date - l.start_date)/3600 }.round(2)
end
@ -49,4 +51,35 @@ class User < ActiveRecord::Base
.sum { |l| (l.end_date - l.start_date)/3600 }
.round(2)
end
def checked_in?
log_action = ::ActsAsLoggable::UserAction.find_by_action("CHECKIN")
checked = logs.where( log_action_id: log_action.id).
where("start_date >= ?", Time.zone.now.beginning_of_day).
where("start_date = end_date")
!checked.empty?
end
def checkin
log_action = ::ActsAsLoggable::UserAction.find_by_action("CHECKIN")
time = Time.now
logs.create( logger_id: self.id,
logger_type: self.class.to_s,
start_date: time,
end_date: time,
log_action_id: log_action.id,
log_action_type: log_action.class.to_s)
save
puts logs.inspect
end
def checkout
log_action = ::ActsAsLoggable::UserAction.find_by_action("CHECKIN")
checked = logs.where( log_action_id: log_action.id).
where("start_date >= ?", Time.zone.now.beginning_of_day).
where("start_date = end_date").first
checked.end_date = Time.now
checked.save
puts logs.inspect
end
end

9
app/views/devise/sessions/new.html.erb

@ -1,6 +1,6 @@
<%= stylesheet_link_tag "bootstrap_and_overrides", :media => "all" %>
<h2>Sign in</h2>
<h2>Velocipede</h2>
<%= form_for(resource, :as => resource_name, :url => session_path(resource_name)) do |f| %>
<div><%= f.label :email %><br />
@ -14,8 +14,15 @@
<% end -%>
<div><%= f.submit "Sign in" %></div>
<div id="checkin_menu"style="display:none;">
<input id="checkin" name="checkin" type="button" value="CHECK IN">
<input id="checkout" name="checkout" type="button" value="CHECK OUT">
</div>
<% end %>
<%= render "links" %>
<% if Rails.env.development? %>

6
config/initializers/devise.rb

@ -221,3 +221,9 @@ Devise.setup do |config|
# manager.default_strategies(:scope => :user).unshift :some_external_strategy
# end
end
#Check in the user if they sign in. (Devise uses Warden)
Warden::Manager.after_authentication do |user,auth,opts|
user.checkin unless user.checked_in?
end

9
config/routes.rb

@ -4,4 +4,13 @@ Velocipede::Application.routes.draw do
netzke
root :to => 'site#index'
###########################
# API Routes
scope 'api', :module => :api do
scope 'v1', :module => :v1 do
post 'checkin' => "logs#checkin", :as => "api_checkin"
post 'checkout' => "logs#checkout", :as => "api_checkout"
end
end
end

5
db/seed/fixtures/acts_as_loggable/user_actions.yml

@ -13,3 +13,8 @@ staff:
action: STAFF
created_at: <%= Time.now %>
updated_at: <%= Time.now %>
checkin:
id: 4
action: CHECKIN
created_at: <%= Time.now %>
updated_at: <%= Time.now %>

Loading…
Cancel
Save