eventifier 0.1.2 → 0.1.3
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/Gemfile +5 -0
- data/README.textile +13 -0
- data/app/assets/javascripts/eventifier/notifications.coffee +19 -12
- data/app/assets/stylesheets/eventifier/notifications.scss +1 -0
- data/app/views/eventifier/notifications/index.jbuilder +3 -3
- data/config/routes.rb +1 -5
- data/eventifier.gemspec +3 -2
- data/lib/eventifier.rb +2 -1
- data/lib/eventifier/api.rb +19 -0
- data/lib/eventifier/api/base.rb +36 -0
- data/lib/eventifier/api/get_notifications.rb +37 -0
- data/lib/eventifier/api/get_preferences.rb +7 -0
- data/lib/eventifier/api/put_preferences.rb +9 -0
- data/lib/eventifier/api/touch_notifications.rb +9 -0
- data/lib/eventifier/api/view.rb +13 -0
- data/spec/eventifier/api_spec.rb +109 -0
- data/spec/internal/config/locales/events.en.yml +2 -0
- data/spec/spec_helper.rb +4 -1
- metadata +27 -11
- data/app/controllers/eventifier/application_controller.rb +0 -4
- data/app/controllers/eventifier/notifications_controller.rb +0 -36
- data/app/controllers/eventifier/preferences_controller.rb +0 -17
- data/spec/controllers/eventifier/notifications_controller_spec.rb +0 -26
- data/spec/controllers/eventifier/preferences_controller_spec.rb +0 -38
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: aaf9b70e8194f8a8d0b9bbb3c1f47a66ce567924
|
4
|
+
data.tar.gz: b5cfd42aac01fc16b8c3c6f1958c3f7000ccb61e
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: f33025942a2d0648a150905772630b8f5ffdf322529f3d03f4122c1d1799a6fcb159e3cedd83d9022dff49e92383db461647a33ca9719500572b22fb5781d56e
|
7
|
+
data.tar.gz: 2027a96019a98283036f41efa293c77140e1144c30c8bb41b05046e5786c851df26221c9fa0b98825ca16fba8bc6c4f8520cc17fff702adc8512b6620fba55f6
|
data/Gemfile
CHANGED
data/README.textile
CHANGED
@@ -138,6 +138,19 @@ h2. Requirements
|
|
138
138
|
|
139
139
|
* ActiveRecord
|
140
140
|
|
141
|
+
h2. Turbolinks
|
142
|
+
|
143
|
+
Turbolinks removes the body of the page, which is where our dropdown notifications box sits. We'll need to re-render it and point it at the holding element when the page changes.
|
144
|
+
|
145
|
+
```
|
146
|
+
$ ->
|
147
|
+
window.notifications = new NotificationDropdown el: $('.notifications'), pollTime: 60
|
148
|
+
|
149
|
+
$(document).on "page:change", ->
|
150
|
+
notifications.el = $('.notifications')
|
151
|
+
notifications.render()
|
152
|
+
```
|
153
|
+
|
141
154
|
h2. Testing
|
142
155
|
|
143
156
|
Creating the database:
|
@@ -1,6 +1,6 @@
|
|
1
1
|
#= require hamlcoffee
|
2
|
-
#= require
|
3
|
-
#= require
|
2
|
+
#= require eventifier/templates/dropdown
|
3
|
+
#= require eventifier/templates/settings
|
4
4
|
# Usage
|
5
5
|
# window.notifications = new NotificationDropdown el: $('.notifications'), limit: 5
|
6
6
|
|
@@ -19,14 +19,18 @@ class window.NotificationDropdown
|
|
19
19
|
|
20
20
|
@render()
|
21
21
|
@loadMore(limit: 14)
|
22
|
+
setTimeout =>
|
23
|
+
@el.trigger 'poll'
|
24
|
+
, @pollTime*1000
|
22
25
|
|
23
26
|
render: =>
|
27
|
+
@unsetEvents()
|
28
|
+
@renderedNotifications = []
|
24
29
|
@el.html(@template(@)).attr('tabindex', 0)
|
25
|
-
|
30
|
+
@renderNotifications()
|
26
31
|
# @checkVisibility()
|
27
32
|
|
28
33
|
@setEvents()
|
29
|
-
@poll()
|
30
34
|
|
31
35
|
checkVisibility: =>
|
32
36
|
@el.addClass("notifications_active").find('#notification_dropdown').attr('opacity': 0)
|
@@ -57,6 +61,9 @@ class window.NotificationDropdown
|
|
57
61
|
|
58
62
|
@
|
59
63
|
|
64
|
+
unsetEvents: =>
|
65
|
+
@el.off()
|
66
|
+
|
60
67
|
pushUrl: (e)=>
|
61
68
|
location = $(e.currentTarget).attr('href')
|
62
69
|
location = $('<a />').attr(href: location).get(0).pathname if location.match /^https?\:\/\//
|
@@ -72,16 +79,16 @@ class window.NotificationDropdown
|
|
72
79
|
unless $.inArray(notification.id, @renderedNotifications) >= 0
|
73
80
|
if new Date(notification.created_at) > @lastReadAt
|
74
81
|
if @lastInserted?
|
75
|
-
@lastInserted.after @lastInserted = $("<li />")
|
82
|
+
@lastInserted.after( @lastInserted = $("<li />")
|
76
83
|
.addClass('unread')
|
77
84
|
.html(notification.html)
|
85
|
+
)
|
78
86
|
else
|
79
87
|
@el
|
80
88
|
.find('ol')
|
81
|
-
.prepend(
|
89
|
+
.prepend(@lastInserted = $("<li />")
|
82
90
|
.addClass('unread')
|
83
|
-
.html(notification.html)
|
84
|
-
)
|
91
|
+
.html(notification.html))
|
85
92
|
else
|
86
93
|
@el
|
87
94
|
.find('ol')
|
@@ -105,7 +112,7 @@ class window.NotificationDropdown
|
|
105
112
|
toggleSettings: (event)=>
|
106
113
|
event.preventDefault() if event?
|
107
114
|
$.ajax
|
108
|
-
url: "/preferences"
|
115
|
+
url: "/eventifier/preferences"
|
109
116
|
success: (data)=>
|
110
117
|
@el.find("#settings_pane").html(@settingsTemplate(data))
|
111
118
|
@defaultSettings() if @arrayFromObject($.makeArray(data)).default
|
@@ -124,7 +131,7 @@ class window.NotificationDropdown
|
|
124
131
|
serializedSettings[@name] = @value
|
125
132
|
|
126
133
|
$.ajax
|
127
|
-
url: "/preferences"
|
134
|
+
url: "/eventifier/preferences"
|
128
135
|
type: "PUT"
|
129
136
|
data: preferences: serializedSettings
|
130
137
|
success: (data)=> @el.toggleClass('show_settings')
|
@@ -140,7 +147,7 @@ class window.NotificationDropdown
|
|
140
147
|
|
141
148
|
loadMore: (params = {})=>
|
142
149
|
$.ajax
|
143
|
-
url: "/notifications"
|
150
|
+
url: "/eventifier/notifications"
|
144
151
|
dataType: 'json'
|
145
152
|
data: params
|
146
153
|
success: @addNotifications
|
@@ -189,7 +196,7 @@ class window.NotificationDropdown
|
|
189
196
|
if @isAlerting()
|
190
197
|
@lastReadAt = new Date()
|
191
198
|
@setUnreadCount()
|
192
|
-
$.post '/notifications/touch'
|
199
|
+
$.post '/eventifier/notifications/touch'
|
193
200
|
|
194
201
|
poll: =>
|
195
202
|
@loadMore(recent: true, since: @lastLookTime())
|
@@ -1,6 +1,6 @@
|
|
1
|
-
json.last_read_at
|
2
|
-
json.notifications
|
1
|
+
json.last_read_at user.notifications_last_read_at.to_i*1000
|
2
|
+
json.notifications notifications do |notification|
|
3
3
|
json.(notification, :id)
|
4
4
|
json.created_at notification.created_at.to_i*1000
|
5
5
|
json.html render_partial_view(notification, :dropdown)
|
6
|
-
end
|
6
|
+
end
|
data/config/routes.rb
CHANGED
data/eventifier.gemspec
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
# -*- encoding: utf-8 -*-
|
2
2
|
Gem::Specification.new do |s|
|
3
3
|
s.name = "eventifier"
|
4
|
-
s.version = '0.1.
|
4
|
+
s.version = '0.1.3'
|
5
5
|
s.authors = ["Nathan Sampimon", "Peter Murray", "Pat Allan"]
|
6
6
|
s.email = ["nathan@inspire9.com"]
|
7
7
|
s.homepage = "http://github.com/inspire9/eventifier"
|
@@ -16,7 +16,7 @@ Gem::Specification.new do |s|
|
|
16
16
|
s.executables = `git ls-files -- bin/*`.split("\n").map { |f| File.basename(f) }
|
17
17
|
s.require_paths = ["lib"]
|
18
18
|
|
19
|
-
s.add_runtime_dependency 'rails', '
|
19
|
+
s.add_runtime_dependency 'rails', '>= 4.0.3'
|
20
20
|
s.add_runtime_dependency "bson_ext"
|
21
21
|
s.add_runtime_dependency 'haml-rails', '~> 0.4'
|
22
22
|
s.add_runtime_dependency 'haml_coffee_assets'
|
@@ -25,6 +25,7 @@ Gem::Specification.new do |s|
|
|
25
25
|
s.add_runtime_dependency 'multi_json', '>= 1.7.4'
|
26
26
|
s.add_runtime_dependency 'jbuilder', '>= 2.0.4'
|
27
27
|
s.add_runtime_dependency 'rails-observers', '~> 0.1.2'
|
28
|
+
s.add_runtime_dependency 'sliver', '~> 0.0.3'
|
28
29
|
|
29
30
|
s.add_development_dependency 'combustion', '~> 0.5.0'
|
30
31
|
s.add_development_dependency 'fabrication', '~> 2.11.0'
|
data/lib/eventifier.rb
CHANGED
@@ -18,6 +18,7 @@ require 'compass-rails'
|
|
18
18
|
require 'haml-rails'
|
19
19
|
require 'haml_coffee_assets'
|
20
20
|
require 'jbuilder'
|
21
|
+
require 'sliver'
|
21
22
|
|
22
23
|
module Eventifier
|
23
24
|
mattr_accessor :mailer_sender
|
@@ -60,7 +61,7 @@ module Eventifier
|
|
60
61
|
end
|
61
62
|
end
|
62
63
|
|
63
|
-
|
64
|
+
require 'eventifier/api'
|
64
65
|
require 'eventifier/delivery'
|
65
66
|
require 'eventifier/event_tracking'
|
66
67
|
require 'eventifier/event_builder'
|
@@ -0,0 +1,19 @@
|
|
1
|
+
class Eventifier::API < Sliver::API
|
2
|
+
def initialize
|
3
|
+
super do |api|
|
4
|
+
api.connect :get, '/notifications', Eventifier::API::GetNotifications
|
5
|
+
api.connect :post, '/notifications/touch',
|
6
|
+
Eventifier::API::TouchNotifications
|
7
|
+
|
8
|
+
api.connect :get, '/preferences', Eventifier::API::GetPreferences
|
9
|
+
api.connect :put, '/preferences', Eventifier::API::PutPreferences
|
10
|
+
end
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
require 'eventifier/api/base'
|
15
|
+
require 'eventifier/api/view'
|
16
|
+
require 'eventifier/api/get_notifications'
|
17
|
+
require 'eventifier/api/touch_notifications'
|
18
|
+
require 'eventifier/api/get_preferences'
|
19
|
+
require 'eventifier/api/put_preferences'
|
@@ -0,0 +1,36 @@
|
|
1
|
+
class Eventifier::API::Base
|
2
|
+
include Sliver::Action
|
3
|
+
|
4
|
+
def skip?
|
5
|
+
return false if user
|
6
|
+
|
7
|
+
response.status = 403
|
8
|
+
response.body = ['Forbidden']
|
9
|
+
|
10
|
+
true
|
11
|
+
end
|
12
|
+
|
13
|
+
def call
|
14
|
+
response.status ||= 200
|
15
|
+
response.body ||= {}
|
16
|
+
response.headers['Content-Type'] ||= 'application/json'
|
17
|
+
|
18
|
+
if response.body.is_a?(String)
|
19
|
+
response.body = [response.body]
|
20
|
+
else
|
21
|
+
response.body = [JSON.generate(response.body)]
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
private
|
26
|
+
|
27
|
+
def user
|
28
|
+
return nil unless warden && warden.authenticated?(:user)
|
29
|
+
|
30
|
+
warden.user(:user)
|
31
|
+
end
|
32
|
+
|
33
|
+
def warden
|
34
|
+
environment['warden']
|
35
|
+
end
|
36
|
+
end
|
@@ -0,0 +1,37 @@
|
|
1
|
+
class Eventifier::API::GetNotifications < Eventifier::API::Base
|
2
|
+
include Eventifier::API::View
|
3
|
+
|
4
|
+
def call
|
5
|
+
render 'eventifier/notifications/index',
|
6
|
+
notifications: notifications, user: user
|
7
|
+
|
8
|
+
super
|
9
|
+
end
|
10
|
+
|
11
|
+
private
|
12
|
+
|
13
|
+
delegate :params, to: :request
|
14
|
+
|
15
|
+
def notifications
|
16
|
+
scope = user.notifications.order("eventifier_notifications.created_at DESC").limit(per_page)
|
17
|
+
scope = scope.where("eventifier_notifications.created_at < ?", after) if params['after']
|
18
|
+
scope = scope.where("eventifier_notifications.created_at > ?", since) if params['since']
|
19
|
+
scope = scope.where(
|
20
|
+
"eventifier_notifications.created_at > ?", user.notifications_last_read_at
|
21
|
+
) if params['recent']
|
22
|
+
|
23
|
+
scope
|
24
|
+
end
|
25
|
+
|
26
|
+
def after
|
27
|
+
Time.zone.at params['after'].to_i
|
28
|
+
end
|
29
|
+
|
30
|
+
def per_page
|
31
|
+
(params['limit'] || 5).to_i
|
32
|
+
end
|
33
|
+
|
34
|
+
def since
|
35
|
+
Time.zone.at params['since'].to_i
|
36
|
+
end
|
37
|
+
end
|
@@ -0,0 +1,13 @@
|
|
1
|
+
module Eventifier::API::View
|
2
|
+
private
|
3
|
+
|
4
|
+
def render(template, locals = {})
|
5
|
+
response.body = renderer.render template: template, locals: locals
|
6
|
+
end
|
7
|
+
|
8
|
+
def renderer
|
9
|
+
ApplicationController.view_context_class.new(
|
10
|
+
ApplicationController.view_paths
|
11
|
+
)
|
12
|
+
end
|
13
|
+
end
|
@@ -0,0 +1,109 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Eventifier::API do
|
4
|
+
include Rack::Test::Methods
|
5
|
+
|
6
|
+
let(:app) { Eventifier::API.new }
|
7
|
+
let(:user) { double 'User' }
|
8
|
+
let(:warden) { double 'Warden', authenticated?: true, user: user }
|
9
|
+
|
10
|
+
describe 'GET /notifications' do
|
11
|
+
let(:event) { double 'Event', eventable_type: 'User', eventable: double, user: User.create!(name: 'Pat'), verb: :create }
|
12
|
+
let(:notifications) { [double('Notification', id: 84, created_at: created_at, event: event)] }
|
13
|
+
let(:created_at) { 1.minute.ago }
|
14
|
+
|
15
|
+
before :each do
|
16
|
+
Rails.application.default_url_options = {host: 'eventifier.dev'}
|
17
|
+
|
18
|
+
allow(user).to receive(:notifications_last_read_at).and_return(1)
|
19
|
+
allow(notifications).to receive(:order).and_return(notifications)
|
20
|
+
allow(notifications).to receive(:limit).and_return(notifications)
|
21
|
+
end
|
22
|
+
|
23
|
+
it 'returns 403 if there is no authenticated user' do
|
24
|
+
allow(warden).to receive(:authenticated?).and_return(false)
|
25
|
+
allow(warden).to receive(:user).and_return(nil)
|
26
|
+
|
27
|
+
get '/notifications', {}, {'warden' => warden}
|
28
|
+
|
29
|
+
expect(last_response.status).to eq(403)
|
30
|
+
end
|
31
|
+
|
32
|
+
it 'returns notifications as JSON' do
|
33
|
+
allow(user).to receive(:notifications).and_return(notifications)
|
34
|
+
|
35
|
+
get '/notifications', {}, {'warden' => warden}
|
36
|
+
|
37
|
+
json = JSON.parse(last_response.body)
|
38
|
+
expect(json['last_read_at']).to eq(1000)
|
39
|
+
expect(json['notifications'].first['id']).to eq(84)
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
describe 'POST /notifications/touch' do
|
44
|
+
before :each do
|
45
|
+
allow(user).to receive(:update_attribute).and_return(true)
|
46
|
+
end
|
47
|
+
|
48
|
+
it "updates the current user's notifications last read at" do
|
49
|
+
expect(user).to receive(:update_attribute).
|
50
|
+
with(:notifications_last_read_at, anything)
|
51
|
+
|
52
|
+
post '/notifications/touch', {}, {'warden' => warden}
|
53
|
+
end
|
54
|
+
|
55
|
+
it "responds with JSON OK status" do
|
56
|
+
post '/notifications/touch', {}, {'warden' => warden}
|
57
|
+
|
58
|
+
expect(last_response.body).to eq ({'status' => 'OK'}.to_json)
|
59
|
+
end
|
60
|
+
end
|
61
|
+
|
62
|
+
describe 'GET /preferences' do
|
63
|
+
let(:preferences) { double :to_hashes => [{'foo' => 'bar'}] }
|
64
|
+
|
65
|
+
before :each do
|
66
|
+
allow(Eventifier::Preferences).to receive(:new).and_return(preferences)
|
67
|
+
end
|
68
|
+
|
69
|
+
it 'initializes the preferences with the logged in user' do
|
70
|
+
expect(Eventifier::Preferences).to receive(:new).with(user).
|
71
|
+
and_return(preferences)
|
72
|
+
|
73
|
+
get '/preferences', {}, {'warden' => warden}
|
74
|
+
end
|
75
|
+
|
76
|
+
it "returns the settings hashes" do
|
77
|
+
get '/preferences', {}, {'warden' => warden}
|
78
|
+
|
79
|
+
expect(last_response.body).to eq ([{'foo' => 'bar'}].to_json)
|
80
|
+
end
|
81
|
+
end
|
82
|
+
|
83
|
+
describe 'PUT /preferences' do
|
84
|
+
let(:preferences) { double update: true }
|
85
|
+
|
86
|
+
before :each do
|
87
|
+
allow(Eventifier::Preferences).to receive(:new).and_return(preferences)
|
88
|
+
end
|
89
|
+
|
90
|
+
it 'initializes the preferences with the logged in user' do
|
91
|
+
expect(Eventifier::Preferences).to receive(:new).with(user).
|
92
|
+
and_return(preferences)
|
93
|
+
|
94
|
+
put '/preferences', {preferences: {'foo' => ''}}, {'warden' => warden}
|
95
|
+
end
|
96
|
+
|
97
|
+
it 'saves the settings changes' do
|
98
|
+
expect(preferences).to receive(:update).with('foo' => '')
|
99
|
+
|
100
|
+
put '/preferences', {preferences: {'foo' => ''}}, {'warden' => warden}
|
101
|
+
end
|
102
|
+
|
103
|
+
it "renders a JSON OK status" do
|
104
|
+
put '/preferences', {preferences: {'foo' => ''}}, {'warden' => warden}
|
105
|
+
|
106
|
+
expect(last_response.body).to eq ({'status' => 'OK'}.to_json)
|
107
|
+
end
|
108
|
+
end
|
109
|
+
end
|
data/spec/spec_helper.rb
CHANGED
@@ -5,6 +5,8 @@ Bundler.setup :default, :development
|
|
5
5
|
require 'fabrication'
|
6
6
|
require 'combustion'
|
7
7
|
require 'active_record'
|
8
|
+
require 'action_view'
|
9
|
+
require 'haml'
|
8
10
|
require 'eventifier'
|
9
11
|
|
10
12
|
Fabrication.configure do |config|
|
@@ -12,7 +14,8 @@ Fabrication.configure do |config|
|
|
12
14
|
config.path_prefix = '.'
|
13
15
|
end
|
14
16
|
|
15
|
-
Combustion.initialize! :action_controller, :
|
17
|
+
Combustion.initialize! :action_controller, :action_view, :active_record,
|
18
|
+
:action_mailer
|
16
19
|
|
17
20
|
require 'rspec/rails'
|
18
21
|
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: eventifier
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Nathan Sampimon
|
@@ -10,20 +10,20 @@ authors:
|
|
10
10
|
autorequire:
|
11
11
|
bindir: bin
|
12
12
|
cert_chain: []
|
13
|
-
date: 2014-
|
13
|
+
date: 2014-09-18 00:00:00.000000000 Z
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
16
16
|
name: rails
|
17
17
|
requirement: !ruby/object:Gem::Requirement
|
18
18
|
requirements:
|
19
|
-
- - "
|
19
|
+
- - ">="
|
20
20
|
- !ruby/object:Gem::Version
|
21
21
|
version: 4.0.3
|
22
22
|
type: :runtime
|
23
23
|
prerelease: false
|
24
24
|
version_requirements: !ruby/object:Gem::Requirement
|
25
25
|
requirements:
|
26
|
-
- - "
|
26
|
+
- - ">="
|
27
27
|
- !ruby/object:Gem::Version
|
28
28
|
version: 4.0.3
|
29
29
|
- !ruby/object:Gem::Dependency
|
@@ -138,6 +138,20 @@ dependencies:
|
|
138
138
|
- - "~>"
|
139
139
|
- !ruby/object:Gem::Version
|
140
140
|
version: 0.1.2
|
141
|
+
- !ruby/object:Gem::Dependency
|
142
|
+
name: sliver
|
143
|
+
requirement: !ruby/object:Gem::Requirement
|
144
|
+
requirements:
|
145
|
+
- - "~>"
|
146
|
+
- !ruby/object:Gem::Version
|
147
|
+
version: 0.0.3
|
148
|
+
type: :runtime
|
149
|
+
prerelease: false
|
150
|
+
version_requirements: !ruby/object:Gem::Requirement
|
151
|
+
requirements:
|
152
|
+
- - "~>"
|
153
|
+
- !ruby/object:Gem::Version
|
154
|
+
version: 0.0.3
|
141
155
|
- !ruby/object:Gem::Dependency
|
142
156
|
name: combustion
|
143
157
|
requirement: !ruby/object:Gem::Requirement
|
@@ -213,9 +227,6 @@ files:
|
|
213
227
|
- app/assets/javascripts/eventifier/templates/dropdown.hamlc
|
214
228
|
- app/assets/javascripts/eventifier/templates/settings.hamlc
|
215
229
|
- app/assets/stylesheets/eventifier/notifications.scss
|
216
|
-
- app/controllers/eventifier/application_controller.rb
|
217
|
-
- app/controllers/eventifier/notifications_controller.rb
|
218
|
-
- app/controllers/eventifier/preferences_controller.rb
|
219
230
|
- app/helpers/eventifier/notification_helper.rb
|
220
231
|
- app/helpers/eventifier/path_helper.rb
|
221
232
|
- app/mailers/eventifier/mailer.rb
|
@@ -238,6 +249,13 @@ files:
|
|
238
249
|
- db/migrate/5_system_events.rb
|
239
250
|
- eventifier.gemspec
|
240
251
|
- lib/eventifier.rb
|
252
|
+
- lib/eventifier/api.rb
|
253
|
+
- lib/eventifier/api/base.rb
|
254
|
+
- lib/eventifier/api/get_notifications.rb
|
255
|
+
- lib/eventifier/api/get_preferences.rb
|
256
|
+
- lib/eventifier/api/put_preferences.rb
|
257
|
+
- lib/eventifier/api/touch_notifications.rb
|
258
|
+
- lib/eventifier/api/view.rb
|
241
259
|
- lib/eventifier/delivery.rb
|
242
260
|
- lib/eventifier/engine.rb
|
243
261
|
- lib/eventifier/event_builder.rb
|
@@ -258,9 +276,8 @@ files:
|
|
258
276
|
- lib/generators/eventifier/install/templates/event_tracking.rb
|
259
277
|
- lib/generators/eventifier/install/templates/events.en.yml
|
260
278
|
- lib/tasks/email.rake
|
261
|
-
- spec/controllers/eventifier/notifications_controller_spec.rb
|
262
|
-
- spec/controllers/eventifier/preferences_controller_spec.rb
|
263
279
|
- spec/event_tracking_spec.rb
|
280
|
+
- spec/eventifier/api_spec.rb
|
264
281
|
- spec/eventifier/delivery_spec.rb
|
265
282
|
- spec/eventifier/event_translator_spec.rb
|
266
283
|
- spec/eventifier/notification_translator_spec.rb
|
@@ -321,9 +338,8 @@ signing_key:
|
|
321
338
|
specification_version: 4
|
322
339
|
summary: Event tracking and notifying for active record models
|
323
340
|
test_files:
|
324
|
-
- spec/controllers/eventifier/notifications_controller_spec.rb
|
325
|
-
- spec/controllers/eventifier/preferences_controller_spec.rb
|
326
341
|
- spec/event_tracking_spec.rb
|
342
|
+
- spec/eventifier/api_spec.rb
|
327
343
|
- spec/eventifier/delivery_spec.rb
|
328
344
|
- spec/eventifier/event_translator_spec.rb
|
329
345
|
- spec/eventifier/notification_translator_spec.rb
|
@@ -1,36 +0,0 @@
|
|
1
|
-
class Eventifier::NotificationsController < Eventifier::ApplicationController
|
2
|
-
def index
|
3
|
-
@notifications = notifications
|
4
|
-
end
|
5
|
-
|
6
|
-
def touch
|
7
|
-
current_user.update_attribute :notifications_last_read_at, Time.zone.now
|
8
|
-
|
9
|
-
render :json => {'status' => 'OK'}
|
10
|
-
end
|
11
|
-
|
12
|
-
private
|
13
|
-
|
14
|
-
def notifications
|
15
|
-
scope = current_user.notifications.order("eventifier_notifications.created_at DESC").limit(per_page)
|
16
|
-
scope = scope.where("eventifier_notifications.created_at < ?", after) if params[:after]
|
17
|
-
scope = scope.where("eventifier_notifications.created_at > ?", since) if params[:since]
|
18
|
-
scope = scope.where(
|
19
|
-
"eventifier_notifications.created_at > ?", current_user.notifications_last_read_at
|
20
|
-
) if params[:recent]
|
21
|
-
|
22
|
-
scope
|
23
|
-
end
|
24
|
-
|
25
|
-
def after
|
26
|
-
Time.zone.at params[:after].to_i
|
27
|
-
end
|
28
|
-
|
29
|
-
def per_page
|
30
|
-
(params[:limit] || 5).to_i
|
31
|
-
end
|
32
|
-
|
33
|
-
def since
|
34
|
-
Time.zone.at params[:since].to_i
|
35
|
-
end
|
36
|
-
end
|
@@ -1,17 +0,0 @@
|
|
1
|
-
class Eventifier::PreferencesController < Eventifier::ApplicationController
|
2
|
-
def show
|
3
|
-
render :json => preferences.to_hashes
|
4
|
-
end
|
5
|
-
|
6
|
-
def update
|
7
|
-
preferences.update params[:preferences] || {}
|
8
|
-
|
9
|
-
render :json => {'status' => 'OK'}
|
10
|
-
end
|
11
|
-
|
12
|
-
private
|
13
|
-
|
14
|
-
def preferences
|
15
|
-
Eventifier::Preferences.new(current_user)
|
16
|
-
end
|
17
|
-
end
|
@@ -1,26 +0,0 @@
|
|
1
|
-
require 'spec_helper'
|
2
|
-
|
3
|
-
describe Eventifier::NotificationsController do
|
4
|
-
routes { Eventifier::Engine.routes }
|
5
|
-
|
6
|
-
describe '#touch' do
|
7
|
-
let(:user) { double 'User', :update_attribute => true }
|
8
|
-
|
9
|
-
before :each do
|
10
|
-
sign_in user
|
11
|
-
end
|
12
|
-
|
13
|
-
it "updates the current user's notifications last read at" do
|
14
|
-
user.should_receive(:update_attribute).
|
15
|
-
with(:notifications_last_read_at, anything)
|
16
|
-
|
17
|
-
post :touch
|
18
|
-
end
|
19
|
-
|
20
|
-
it "responds with JSON OK status" do
|
21
|
-
post :touch
|
22
|
-
|
23
|
-
expect(response.body).to eq ({'status' => 'OK'}.to_json)
|
24
|
-
end
|
25
|
-
end
|
26
|
-
end
|
@@ -1,38 +0,0 @@
|
|
1
|
-
require 'spec_helper'
|
2
|
-
|
3
|
-
describe Eventifier::PreferencesController do
|
4
|
-
routes { Eventifier::Engine.routes }
|
5
|
-
let(:user) { double 'User' }
|
6
|
-
|
7
|
-
before :each do
|
8
|
-
sign_in user
|
9
|
-
|
10
|
-
Eventifier::Preferences.stub :new => preferences
|
11
|
-
end
|
12
|
-
|
13
|
-
describe '#show' do
|
14
|
-
let(:preferences) { double :to_hashes => [{'foo' => 'bar'}] }
|
15
|
-
|
16
|
-
it "returns the settings hashes" do
|
17
|
-
get :show
|
18
|
-
|
19
|
-
expect(response.body).to eq ([{'foo' => 'bar'}].to_json)
|
20
|
-
end
|
21
|
-
end
|
22
|
-
|
23
|
-
describe '#update' do
|
24
|
-
let(:preferences) { double update: true }
|
25
|
-
|
26
|
-
it 'saves the settings changes' do
|
27
|
-
preferences.should_receive(:update).with('foo' => '')
|
28
|
-
|
29
|
-
put :update, :preferences => {'foo' => ''}
|
30
|
-
end
|
31
|
-
|
32
|
-
it "renders a JSON OK status" do
|
33
|
-
put :update, :preferences => {'foo' => ''}
|
34
|
-
|
35
|
-
expect(response.body).to eq ({'status' => 'OK'}.to_json)
|
36
|
-
end
|
37
|
-
end
|
38
|
-
end
|