eventifier 0.1.2 → 0.1.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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
|