eventifier 0.0.7 → 0.0.8
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 +7 -0
- data/.gitignore +1 -0
- data/.travis.yml +7 -8
- data/Gemfile +1 -1
- data/README.textile +44 -3
- data/app/assets/images/eventifier/notifications-bell.png +0 -0
- data/app/assets/images/eventifier/notifications-tower.png +0 -0
- data/app/assets/javascripts/eventifier/notifications.coffee +196 -0
- data/app/assets/javascripts/eventifier/templates/dropdown.hamlc +10 -0
- data/app/assets/javascripts/eventifier/templates/settings.hamlc +11 -0
- data/app/assets/stylesheets/eventifier/notifications.scss +167 -0
- data/app/controllers/eventifier/application_controller.rb +4 -0
- data/app/controllers/eventifier/notifications_controller.rb +36 -0
- data/app/controllers/eventifier/preferences_controller.rb +19 -0
- data/app/helpers/eventifier/notification_helper.rb +87 -0
- data/app/helpers/eventifier/path_helper.rb +15 -0
- data/app/mailers/eventifier/mailer.rb +12 -0
- data/app/models/event_tracking.rb +3 -0
- data/app/models/eventifier/event.rb +22 -0
- data/app/models/eventifier/ghost.rb +21 -0
- data/app/models/eventifier/notification.rb +38 -0
- data/app/models/eventifier/notification_setting.rb +14 -0
- data/app/views/eventifier/_notification.haml +1 -0
- data/app/views/eventifier/email/_notification.haml +2 -0
- data/app/views/eventifier/mailer/notifications.haml +5 -0
- data/app/views/eventifier/notifications/index.jbuilder +6 -0
- data/config/routes.rb +7 -0
- data/config.ru +7 -0
- data/{lib/generators/eventifier/install/templates/migration.rb → db/migrate/1_eventifier_setup.rb} +2 -3
- data/db/migrate/2_eventifier_notification_settings.rb +11 -0
- data/db/migrate/3_notification_sent_status.rb +15 -0
- data/db/migrate/4_event_groupable.rb +19 -0
- data/eventifier.gemspec +12 -15
- data/lib/eventifier/delivery.rb +59 -0
- data/lib/eventifier/{railtie.rb → engine.rb} +4 -2
- data/lib/eventifier/event_subscriber.rb +44 -0
- data/lib/eventifier/event_tracking.rb +5 -58
- data/lib/eventifier/mailers/helpers.rb +70 -0
- data/lib/eventifier/notifier/notification_mapping.rb +34 -0
- data/lib/eventifier/notifier/notification_subscriber.rb +23 -0
- data/lib/eventifier/notifier/notifier.rb +21 -0
- data/lib/eventifier/preferences.rb +44 -0
- data/lib/eventifier/relationship.rb +36 -0
- data/lib/eventifier/trackable_class.rb +74 -0
- data/lib/eventifier/tracker.rb +18 -0
- data/lib/eventifier.rb +35 -11
- data/lib/generators/eventifier/install/install_generator.rb +2 -5
- data/lib/generators/eventifier/install/templates/events.en.yaml +1 -0
- data/lib/tasks/email.rake +8 -0
- data/spec/controllers/eventifier/notifications_controller_spec.rb +24 -0
- data/spec/controllers/eventifier/preferences_controller_spec.rb +56 -0
- data/spec/eventifier/delivery_spec.rb +110 -0
- data/spec/eventifier/preferences_spec.rb +69 -0
- data/spec/eventifier/relationship_spec.rb +33 -0
- data/spec/eventifier_spec.rb +6 -48
- data/spec/fabricators/fabricator.rb +11 -11
- data/spec/helpers/eventifier/notification_helper_spec.rb +169 -0
- data/spec/helpers/eventifier/path_helper_spec.rb +19 -0
- data/spec/integration/eventifier_spec.rb +113 -70
- data/spec/integration/internationalisation_spec.rb +39 -0
- data/spec/internal/app/controllers/application_controller.rb +3 -0
- data/spec/internal/app/lib/event_tracking.rb +12 -0
- data/spec/internal/app/models/category.rb +3 -0
- data/spec/internal/app/models/post.rb +8 -0
- data/spec/internal/app/models/subscription.rb +4 -0
- data/spec/internal/app/models/user.rb +4 -0
- data/spec/internal/app/views/eventifier/dropdown/_awesome_object.haml +0 -0
- data/spec/internal/config/database.yml +4 -0
- data/spec/internal/config/initializers/eventifier.rb +1 -0
- data/spec/internal/config/locales/events.en.yml +20 -0
- data/spec/internal/config/routes.rb +5 -0
- data/spec/internal/db/schema.rb +31 -0
- data/spec/internal/log/.gitignore +1 -0
- data/spec/internal/public/favicon.ico +0 -0
- data/spec/models/eventifier/event_spec.rb +23 -0
- data/spec/{ghost_spec.rb → models/eventifier/ghost_spec.rb} +3 -3
- data/spec/{notification_spec.rb → models/eventifier/notification_spec.rb} +1 -9
- data/spec/notification_mailer_spec.rb +8 -4
- data/spec/notifier/notification_mapping_spec.rb +28 -0
- data/spec/spec_helper.rb +14 -8
- data/spec/support/controller_helpers.rb +14 -0
- metadata +205 -128
- data/Gemfile.lock +0 -97
- data/lib/eventifier/active_record/event.rb +0 -10
- data/lib/eventifier/active_record/event_observer.rb +0 -8
- data/lib/eventifier/active_record/event_tracking.rb +0 -11
- data/lib/eventifier/active_record/ghost.rb +0 -9
- data/lib/eventifier/active_record/notification.rb +0 -13
- data/lib/eventifier/active_record_support.rb +0 -5
- data/lib/eventifier/event_helper.rb +0 -40
- data/lib/eventifier/event_mixin.rb +0 -45
- data/lib/eventifier/event_observer_mixin.rb +0 -44
- data/lib/eventifier/ghost_mixin.rb +0 -27
- data/lib/eventifier/helper_methods.rb +0 -36
- data/lib/eventifier/mongoid/event.rb +0 -16
- data/lib/eventifier/mongoid/event_observer.rb +0 -7
- data/lib/eventifier/mongoid/event_tracking.rb +0 -13
- data/lib/eventifier/mongoid/ghost.rb +0 -15
- data/lib/eventifier/mongoid/notification.rb +0 -19
- data/lib/eventifier/mongoid/user_patch.rb +0 -3
- data/lib/eventifier/mongoid_support.rb +0 -6
- data/lib/eventifier/notification_helper.rb +0 -42
- data/lib/eventifier/notification_mailer.rb +0 -18
- data/lib/eventifier/notification_mixin.rb +0 -50
- data/lib/eventifier/version.rb +0 -3
- data/spec/event_helper_spec.rb +0 -67
- data/spec/event_observer_spec.rb +0 -20
- data/spec/event_spec.rb +0 -39
- data/spec/helper_methods_spec.rb +0 -36
- data/spec/notification_helper_spec.rb +0 -65
- data/spec/support/action_mailer.rb +0 -3
- data/spec/support/database_cleaner.rb +0 -3
- data/spec/test_classes/active_record_support.rb +0 -72
- data/spec/test_classes/mongoid_support.rb +0 -34
|
@@ -1,13 +0,0 @@
|
|
|
1
|
-
require 'eventifier/notification_mixin'
|
|
2
|
-
|
|
3
|
-
module Eventifier
|
|
4
|
-
class Notification < ActiveRecord::Base
|
|
5
|
-
include Eventifier::NotificationMixin
|
|
6
|
-
|
|
7
|
-
default_scope order("notifications.created_at DESC")
|
|
8
|
-
scope :for_events, -> ids { where(event_id: ids) }
|
|
9
|
-
scope :for_user, -> user { where(user_id: user.id) }
|
|
10
|
-
scope :since, -> date { where("created_at > ?", date) }
|
|
11
|
-
scope :latest, order('notifications.created_at DESC').limit(5)
|
|
12
|
-
end
|
|
13
|
-
end
|
|
@@ -1,40 +0,0 @@
|
|
|
1
|
-
module Eventifier
|
|
2
|
-
module EventHelper
|
|
3
|
-
include Eventifier::HelperMethods
|
|
4
|
-
|
|
5
|
-
# A helper for outputting an event message.
|
|
6
|
-
#
|
|
7
|
-
# Uses I18n messages from config/locales/events.en.yml to generate these messages, or defaults to a standard.
|
|
8
|
-
#
|
|
9
|
-
# Example:
|
|
10
|
-
#
|
|
11
|
-
# %ul#events
|
|
12
|
-
# - post.events.each do |event|
|
|
13
|
-
# %li= event_message event
|
|
14
|
-
|
|
15
|
-
def event_message event
|
|
16
|
-
if event.verb.to_sym == :update
|
|
17
|
-
if event.change_data.keys.count == 1
|
|
18
|
-
key = "events.#{event.eventable_type.downcase}.#{event.verb}.single"
|
|
19
|
-
else
|
|
20
|
-
key = "events.#{event.eventable_type.downcase}.#{event.verb}.multiple"
|
|
21
|
-
end
|
|
22
|
-
else
|
|
23
|
-
key = "events.#{event.eventable_type.downcase}.#{event.verb}"
|
|
24
|
-
end
|
|
25
|
-
message = I18n.translate key, :default => :"events.default.#{event.verb}", "user.name" => event.user.name, :"event.type" => event.eventable_type
|
|
26
|
-
|
|
27
|
-
replace_vars(message, event).html_safe
|
|
28
|
-
end
|
|
29
|
-
|
|
30
|
-
def self.included(base)
|
|
31
|
-
base.helper_method :event_message
|
|
32
|
-
end
|
|
33
|
-
end
|
|
34
|
-
end
|
|
35
|
-
|
|
36
|
-
if defined? ActionController::Base
|
|
37
|
-
ActionController::Base.class_eval do
|
|
38
|
-
include Eventifier::EventHelper
|
|
39
|
-
end
|
|
40
|
-
end
|
|
@@ -1,45 +0,0 @@
|
|
|
1
|
-
require 'active_support/concern'
|
|
2
|
-
|
|
3
|
-
module Eventifier
|
|
4
|
-
module EventMixin
|
|
5
|
-
|
|
6
|
-
extend ActiveSupport::Concern
|
|
7
|
-
|
|
8
|
-
included do
|
|
9
|
-
belongs_to :user
|
|
10
|
-
belongs_to :eventable, polymorphic: true
|
|
11
|
-
has_many :notifications, class_name: 'Eventifier::Notification', dependent: :destroy
|
|
12
|
-
|
|
13
|
-
validates :user, presence: true
|
|
14
|
-
validates :eventable, presence: true
|
|
15
|
-
validates :verb, presence: true
|
|
16
|
-
end
|
|
17
|
-
|
|
18
|
-
module ClassMethods
|
|
19
|
-
|
|
20
|
-
def add_notification(*arg)
|
|
21
|
-
observer_instances.each { |observer| observer.add_notification(*arg) }
|
|
22
|
-
end
|
|
23
|
-
|
|
24
|
-
def add_url(*arg)
|
|
25
|
-
observer_instances.each { |observer| observer.add_url(*arg) }
|
|
26
|
-
end
|
|
27
|
-
|
|
28
|
-
def create_event(verb, object, options = { })
|
|
29
|
-
changed_data = object.changes.stringify_keys
|
|
30
|
-
changed_data = changed_data.reject { |attribute, value| options[:except].include?(attribute) } if options[:except]
|
|
31
|
-
changed_data = changed_data.select { |attribute, value| options[:only].include?(attribute) } if options[:only]
|
|
32
|
-
self.create(
|
|
33
|
-
:user => object.user,
|
|
34
|
-
:eventable => object,
|
|
35
|
-
:verb => verb,
|
|
36
|
-
:change_data => changed_data.symbolize_keys
|
|
37
|
-
)
|
|
38
|
-
end
|
|
39
|
-
|
|
40
|
-
def find_all_by_eventable object
|
|
41
|
-
where :eventable_id => object.id, :eventable_type => object.class.name
|
|
42
|
-
end
|
|
43
|
-
end
|
|
44
|
-
end
|
|
45
|
-
end
|
|
@@ -1,44 +0,0 @@
|
|
|
1
|
-
require 'active_support/concern'
|
|
2
|
-
|
|
3
|
-
module Eventifier
|
|
4
|
-
module EventObserverMixin
|
|
5
|
-
extend ActiveSupport::Concern
|
|
6
|
-
|
|
7
|
-
include do
|
|
8
|
-
observe Eventifier::Event
|
|
9
|
-
end
|
|
10
|
-
|
|
11
|
-
module InstanceMethods
|
|
12
|
-
def add_notification klass_name, relation, method
|
|
13
|
-
observed_classes.each do |observed_class|
|
|
14
|
-
notification_mappings[klass_name.name] ||= { }
|
|
15
|
-
notification_mappings[klass_name.name][method] = relation
|
|
16
|
-
end
|
|
17
|
-
end
|
|
18
|
-
|
|
19
|
-
def after_create event
|
|
20
|
-
Rails.logger.info "Firing #{event.eventable_type}##{event.verb} - #{notification_mappings[event.eventable_type][event.verb]}" if notification_mappings.has_key?(event.eventable_type) and notification_mappings[event.eventable_type].has_key?(event.verb) and defined?(Rails)
|
|
21
|
-
|
|
22
|
-
method_from_relation(event.eventable, notification_mappings[event.eventable_type][event.verb]).each do |user|
|
|
23
|
-
next if user == event.user
|
|
24
|
-
Eventifier::Notification.create event: event, user: user
|
|
25
|
-
end if notification_mappings.has_key?(event.eventable_type) and notification_mappings[event.eventable_type].has_key?(event.verb)
|
|
26
|
-
end
|
|
27
|
-
|
|
28
|
-
def method_from_relation object, relation
|
|
29
|
-
if relation.kind_of?(Hash)
|
|
30
|
-
method_from_relation(proc { |object, method| object.send(method) }.call(object, relation.keys.first), relation.values.first)
|
|
31
|
-
else
|
|
32
|
-
send_to = proc { |object, method| object.send(method) }.call(object, relation)
|
|
33
|
-
send_to = send_to.kind_of?(Array) ? send_to : [send_to]
|
|
34
|
-
end
|
|
35
|
-
end
|
|
36
|
-
|
|
37
|
-
private
|
|
38
|
-
|
|
39
|
-
def notification_mappings
|
|
40
|
-
@notification_mapppings ||= { }
|
|
41
|
-
end
|
|
42
|
-
end
|
|
43
|
-
end
|
|
44
|
-
end
|
|
@@ -1,27 +0,0 @@
|
|
|
1
|
-
module Eventifier
|
|
2
|
-
module GhostMixin
|
|
3
|
-
|
|
4
|
-
extend ActiveSupport::Concern
|
|
5
|
-
|
|
6
|
-
included do
|
|
7
|
-
|
|
8
|
-
validates :ghost_class, :presence => true
|
|
9
|
-
validates :ghost_id, :presence => true
|
|
10
|
-
validates :data_hash, :presence => true
|
|
11
|
-
end
|
|
12
|
-
|
|
13
|
-
module ClassMethods
|
|
14
|
-
def create_from_object object
|
|
15
|
-
create :ghost_class => object.class.name, :ghost_id => object.id, :data_hash => object.serializable_hash
|
|
16
|
-
end
|
|
17
|
-
end
|
|
18
|
-
|
|
19
|
-
def ghost
|
|
20
|
-
klass = Object.const_get(ghost_class)
|
|
21
|
-
ghost_object = klass.new data_hash
|
|
22
|
-
ghost_object.id = ghost_id
|
|
23
|
-
|
|
24
|
-
ghost_object
|
|
25
|
-
end
|
|
26
|
-
end
|
|
27
|
-
end
|
|
@@ -1,36 +0,0 @@
|
|
|
1
|
-
module Eventifier
|
|
2
|
-
module HelperMethods
|
|
3
|
-
# Used to replace {{variables}} in I18n messages
|
|
4
|
-
|
|
5
|
-
def replace_vars message, event
|
|
6
|
-
event = load_event_for_template event
|
|
7
|
-
message.scan(/{{[^}]*}}/) do |replaceable|
|
|
8
|
-
method = "event."+replaceable.to_s.gsub(/[{|}]/, '').to_s
|
|
9
|
-
replace_text = eval(method) rescue ""
|
|
10
|
-
|
|
11
|
-
case replaceable.to_s
|
|
12
|
-
when "{{object.name}}"
|
|
13
|
-
replace_text = "<strong class='target'>#{replace_text}</strong>"
|
|
14
|
-
when "{{object.title}}"
|
|
15
|
-
replace_text = "<strong class='target'>#{replace_text}</strong>"
|
|
16
|
-
when "{{user.name}}"
|
|
17
|
-
replace_text = "<strong class='user'>#{replace_text}</strong>"
|
|
18
|
-
else
|
|
19
|
-
replace_text = "<strong>#{replace_text}</strong>"
|
|
20
|
-
end
|
|
21
|
-
|
|
22
|
-
message = message.gsub(replaceable.to_s, replace_text.to_s.gsub("_", " "))
|
|
23
|
-
end
|
|
24
|
-
message
|
|
25
|
-
end
|
|
26
|
-
|
|
27
|
-
# Make is so you can include object in the I18n descriptions and it refers to the eventable object the event is referring to.
|
|
28
|
-
|
|
29
|
-
def load_event_for_template event
|
|
30
|
-
def event.object; eventable; end
|
|
31
|
-
def event.object_type; eventable_type; end
|
|
32
|
-
|
|
33
|
-
event
|
|
34
|
-
end
|
|
35
|
-
end
|
|
36
|
-
end
|
|
@@ -1,16 +0,0 @@
|
|
|
1
|
-
require 'eventifier/event_mixin'
|
|
2
|
-
|
|
3
|
-
module Eventifier
|
|
4
|
-
class Event
|
|
5
|
-
include Mongoid::Document
|
|
6
|
-
include Mongoid::Timestamps
|
|
7
|
-
include Eventifier::EventMixin
|
|
8
|
-
|
|
9
|
-
field :change_data, :type => Hash
|
|
10
|
-
field :eventable_type, :type => String
|
|
11
|
-
field :verb, :type => Symbol
|
|
12
|
-
|
|
13
|
-
index({ user_id: 1 })
|
|
14
|
-
index({ eventable_id: 1, eventable_type: 1 })
|
|
15
|
-
end
|
|
16
|
-
end
|
|
@@ -1,13 +0,0 @@
|
|
|
1
|
-
module Eventifier
|
|
2
|
-
module EventTracking
|
|
3
|
-
OBSERVER_CLASS = Mongoid::Observer
|
|
4
|
-
|
|
5
|
-
def add_notification_association target_klass
|
|
6
|
-
target_klass.class_eval do
|
|
7
|
-
define_method :notifications do
|
|
8
|
-
events.map(&:notifications).flatten.compact
|
|
9
|
-
end
|
|
10
|
-
end
|
|
11
|
-
end
|
|
12
|
-
end
|
|
13
|
-
end
|
|
@@ -1,15 +0,0 @@
|
|
|
1
|
-
require 'eventifier/ghost_mixin'
|
|
2
|
-
|
|
3
|
-
module Eventifier
|
|
4
|
-
class Ghost
|
|
5
|
-
include Mongoid::Document
|
|
6
|
-
include Mongoid::Timestamps
|
|
7
|
-
include Eventifier::GhostMixin
|
|
8
|
-
|
|
9
|
-
field :ghost_id, :type => BSON::ObjectId
|
|
10
|
-
field :ghost_class, :type => String
|
|
11
|
-
field :data_hash, :type => Hash
|
|
12
|
-
|
|
13
|
-
index({ ghost_class: 1, ghost_id: 1 })
|
|
14
|
-
end
|
|
15
|
-
end
|
|
@@ -1,19 +0,0 @@
|
|
|
1
|
-
require 'eventifier/notification_mixin'
|
|
2
|
-
|
|
3
|
-
module Eventifier
|
|
4
|
-
class Notification
|
|
5
|
-
include Mongoid::Document
|
|
6
|
-
include Mongoid::Timestamps
|
|
7
|
-
include Eventifier::NotificationMixin
|
|
8
|
-
|
|
9
|
-
default_scope order_by([:created_at, :desc])
|
|
10
|
-
scope :for_events, ->(ids) { where(event_id: ids) }
|
|
11
|
-
scope :for_user, ->(user) { where(user_id: user.id) }
|
|
12
|
-
scope :since, ->(date) { where(:created_at.gt => date) }
|
|
13
|
-
scope :latest, order_by([:created_at, :desc]).limit(5)
|
|
14
|
-
|
|
15
|
-
index({ user_id: 1 })
|
|
16
|
-
index({ event_id: 1 })
|
|
17
|
-
#index({ parent_id: 1})
|
|
18
|
-
end
|
|
19
|
-
end
|
|
@@ -1,42 +0,0 @@
|
|
|
1
|
-
module Eventifier
|
|
2
|
-
module NotificationHelper
|
|
3
|
-
include Eventifier::HelperMethods
|
|
4
|
-
|
|
5
|
-
# A helper for outputting a notification message.
|
|
6
|
-
#
|
|
7
|
-
# Uses I18n messages from config/locales/events.en.yml to generate these messages, or defaults to a standard.
|
|
8
|
-
#
|
|
9
|
-
# Example:
|
|
10
|
-
#
|
|
11
|
-
# %ul#recent_notifications
|
|
12
|
-
# - current_user.notifications.each do |notification|
|
|
13
|
-
# %li= notification_message notification.event
|
|
14
|
-
|
|
15
|
-
def notification_message event
|
|
16
|
-
default = "notifications.default.#{event.verb}".to_sym
|
|
17
|
-
if event.verb.to_sym == :update
|
|
18
|
-
if event.change_data.keys.count == 1
|
|
19
|
-
key = "notifications.#{event.eventable_type.downcase}.#{event.verb}.attributes.#{event.change_data.keys.first}"
|
|
20
|
-
default = ["notifications.#{event.eventable_type.downcase}.#{event.verb}.single".to_sym, default]
|
|
21
|
-
else
|
|
22
|
-
key = "notifications.#{event.eventable_type.downcase}.#{event.verb}.multiple"
|
|
23
|
-
end
|
|
24
|
-
else
|
|
25
|
-
key = "notifications.#{event.eventable_type.downcase}.#{event.verb}"
|
|
26
|
-
end
|
|
27
|
-
message = I18n.translate key, :default => default, "user.name" => event.user.name, :"event.type" => event.eventable_type
|
|
28
|
-
|
|
29
|
-
replace_vars(message, event).html_safe
|
|
30
|
-
end
|
|
31
|
-
|
|
32
|
-
def self.included(base)
|
|
33
|
-
base.helper_method :notification_message, :notification_url
|
|
34
|
-
end
|
|
35
|
-
end
|
|
36
|
-
end
|
|
37
|
-
|
|
38
|
-
if defined? ActionController::Base
|
|
39
|
-
ActionController::Base.class_eval do
|
|
40
|
-
include Eventifier::NotificationHelper
|
|
41
|
-
end
|
|
42
|
-
end
|
|
@@ -1,18 +0,0 @@
|
|
|
1
|
-
require 'eventifier/notification_helper'
|
|
2
|
-
|
|
3
|
-
module Eventifier
|
|
4
|
-
class NotificationMailer < ActionMailer::Base
|
|
5
|
-
include Eventifier::NotificationHelper
|
|
6
|
-
layout 'email'
|
|
7
|
-
|
|
8
|
-
def notification_email(notification)
|
|
9
|
-
@notification = notification
|
|
10
|
-
@notification_url = main_app.url_for notification.url
|
|
11
|
-
@notification_message = notification_message(notification.event)
|
|
12
|
-
|
|
13
|
-
mail :to => notification.user.email,
|
|
14
|
-
:subject => "You have new notifications"
|
|
15
|
-
|
|
16
|
-
end
|
|
17
|
-
end
|
|
18
|
-
end
|
|
@@ -1,50 +0,0 @@
|
|
|
1
|
-
require 'active_support/concern'
|
|
2
|
-
|
|
3
|
-
module Eventifier
|
|
4
|
-
|
|
5
|
-
module NotificationMixin
|
|
6
|
-
extend ActiveSupport::Concern
|
|
7
|
-
|
|
8
|
-
included do
|
|
9
|
-
belongs_to :event, :class_name => 'Eventifier::Event'
|
|
10
|
-
belongs_to :user
|
|
11
|
-
|
|
12
|
-
validates :event, :presence => true
|
|
13
|
-
validates :user, :presence => true
|
|
14
|
-
validates :event_id, :uniqueness => { :scope => :user_id }
|
|
15
|
-
|
|
16
|
-
after_create :send_email
|
|
17
|
-
end
|
|
18
|
-
|
|
19
|
-
module ClassMethods
|
|
20
|
-
def expire_for_past_events!(time_limit = 1.day.ago)
|
|
21
|
-
self.for_events(Event.expired_ids(time_limit)).each &:expire!
|
|
22
|
-
end
|
|
23
|
-
|
|
24
|
-
def unread_for(user)
|
|
25
|
-
if user.notifications_last_read_at
|
|
26
|
-
for_user(user).since(user.notifications_last_read_at)
|
|
27
|
-
else
|
|
28
|
-
for_user(user)
|
|
29
|
-
end
|
|
30
|
-
end
|
|
31
|
-
end
|
|
32
|
-
|
|
33
|
-
def url
|
|
34
|
-
if Eventifier::EventTracking.url_mappings[event.eventable_type.underscore.to_sym]
|
|
35
|
-
Eventifier::EventTracking.url_mappings[event.eventable_type.underscore.to_sym].call(event.eventable)
|
|
36
|
-
else
|
|
37
|
-
event.eventable
|
|
38
|
-
end
|
|
39
|
-
end
|
|
40
|
-
|
|
41
|
-
def unread_for?(user)
|
|
42
|
-
return true if user.notifications_last_read_at.nil?
|
|
43
|
-
created_at > user.notifications_last_read_at
|
|
44
|
-
end
|
|
45
|
-
|
|
46
|
-
def send_email
|
|
47
|
-
Eventifier::NotificationMailer.notification_email(self).deliver
|
|
48
|
-
end
|
|
49
|
-
end
|
|
50
|
-
end
|
data/lib/eventifier/version.rb
DELETED
data/spec/event_helper_spec.rb
DELETED
|
@@ -1,67 +0,0 @@
|
|
|
1
|
-
require 'spec_helper'
|
|
2
|
-
|
|
3
|
-
describe Eventifier::EventHelper do
|
|
4
|
-
|
|
5
|
-
class TestClass
|
|
6
|
-
def self.helper_method(*args)
|
|
7
|
-
end
|
|
8
|
-
|
|
9
|
-
include Eventifier::EventHelper
|
|
10
|
-
end
|
|
11
|
-
|
|
12
|
-
let(:verb) { "update" }
|
|
13
|
-
let(:change_data) { { } }
|
|
14
|
-
let(:event) { double("Event", :verb => verb, :eventable_type => "Object", :change_data => change_data, :user => double("user", :name => "Willy")) }
|
|
15
|
-
let!(:helper) { TestClass.new }
|
|
16
|
-
|
|
17
|
-
before do
|
|
18
|
-
helper.stub :replace_vars => double("String", :html_safe => true)
|
|
19
|
-
end
|
|
20
|
-
|
|
21
|
-
describe ".event_message" do
|
|
22
|
-
subject { helper.event_message event }
|
|
23
|
-
|
|
24
|
-
context "with event verb create" do
|
|
25
|
-
let(:verb) { "create" }
|
|
26
|
-
|
|
27
|
-
it "should hit the I18n verb definition for create & destroy" do
|
|
28
|
-
I18n.should_receive(:translate).with("events.object.create", :default => :"events.default.create", "user.name" => "Willy", :"event.type" => "Object")
|
|
29
|
-
|
|
30
|
-
subject
|
|
31
|
-
end
|
|
32
|
-
|
|
33
|
-
it "should pass the I18n translation to the replace_vars method" do
|
|
34
|
-
I18n.should_receive(:translate).with("events.object.create", :default => :"events.default.create", "user.name" => "Willy", :"event.type" => "Object").and_return("A message")
|
|
35
|
-
helper.should_receive(:replace_vars).with "A message", event
|
|
36
|
-
|
|
37
|
-
subject
|
|
38
|
-
end
|
|
39
|
-
end
|
|
40
|
-
|
|
41
|
-
context "with event verb update" do
|
|
42
|
-
let(:verb) { "update" }
|
|
43
|
-
|
|
44
|
-
context "multiple updates" do
|
|
45
|
-
let(:change_data) { { :name => ["Lol", "Omg Lol"] } }
|
|
46
|
-
|
|
47
|
-
it "should specify single on the verb for the I18n definition on update when there are just a single change" do
|
|
48
|
-
I18n.should_receive(:translate).with("events.object.update.single", :default => :"events.default.update", "user.name" => "Willy", :"event.type" => "Object")
|
|
49
|
-
|
|
50
|
-
subject
|
|
51
|
-
end
|
|
52
|
-
end
|
|
53
|
-
|
|
54
|
-
context "multiple updates" do
|
|
55
|
-
let(:change_data) { { :name => ["Lol", "Omg Lol"], :address => ["old", "new"] } }
|
|
56
|
-
|
|
57
|
-
it "should specify single on the verb for the I18n definition on update when there are just a single change" do
|
|
58
|
-
I18n.should_receive(:translate).with("events.object.update.multiple", :default => :"events.default.update", "user.name" => "Willy", :"event.type" => "Object")
|
|
59
|
-
|
|
60
|
-
subject
|
|
61
|
-
end
|
|
62
|
-
|
|
63
|
-
end
|
|
64
|
-
end
|
|
65
|
-
|
|
66
|
-
end
|
|
67
|
-
end
|
data/spec/event_observer_spec.rb
DELETED
|
@@ -1,20 +0,0 @@
|
|
|
1
|
-
require 'spec_helper'
|
|
2
|
-
|
|
3
|
-
describe Eventifier::EventObserver do
|
|
4
|
-
subject { Eventifier::EventObserver.instance }
|
|
5
|
-
|
|
6
|
-
describe "#method_from_relation" do
|
|
7
|
-
it "should call the string as a method when passed a string" do
|
|
8
|
-
object = double('object', :mouse => 5)
|
|
9
|
-
|
|
10
|
-
subject.method_from_relation(object, :mouse).should == [5]
|
|
11
|
-
end
|
|
12
|
-
|
|
13
|
-
it "should string the methods when passed a hash" do
|
|
14
|
-
object = double('object', :cat => (cat = double('cat', :mouse => 5)))
|
|
15
|
-
|
|
16
|
-
subject.method_from_relation(object, :cat => :mouse).should == [5]
|
|
17
|
-
end
|
|
18
|
-
end
|
|
19
|
-
|
|
20
|
-
end
|
data/spec/event_spec.rb
DELETED
|
@@ -1,39 +0,0 @@
|
|
|
1
|
-
require 'spec_helper'
|
|
2
|
-
|
|
3
|
-
describe Eventifier::Event do
|
|
4
|
-
let(:event) { Fabricate(:event) }
|
|
5
|
-
|
|
6
|
-
describe "#valid?" do
|
|
7
|
-
pending
|
|
8
|
-
#it_requires_a :user
|
|
9
|
-
#it_requires_an :eventable
|
|
10
|
-
#it_requires_a :verb
|
|
11
|
-
end
|
|
12
|
-
|
|
13
|
-
describe '.add_url' do
|
|
14
|
-
it "should send add_url to each of it's observers with params" do
|
|
15
|
-
url_proc = -> activity { [activity.group, activity] }
|
|
16
|
-
observer = double('Observer')
|
|
17
|
-
Eventifier::Event.stub :observer_instances => [observer]
|
|
18
|
-
|
|
19
|
-
observer.should_receive(:add_url).with(Object, url_proc)
|
|
20
|
-
|
|
21
|
-
Eventifier::Event.add_url Object, url_proc
|
|
22
|
-
end
|
|
23
|
-
end
|
|
24
|
-
|
|
25
|
-
describe ".find_all_by_eventable" do
|
|
26
|
-
let!(:eventable) { Fabricate(:post) }
|
|
27
|
-
let(:event) { Fabricate(:event, :eventable => eventable) }
|
|
28
|
-
|
|
29
|
-
it "should find the associated polymorphic eventable object" do
|
|
30
|
-
lambda do
|
|
31
|
-
Fabricate(:event, :eventable => Fabricate(:post))
|
|
32
|
-
event
|
|
33
|
-
end.should change(Eventifier::Event, :count).by(2)
|
|
34
|
-
|
|
35
|
-
Eventifier::Event.find_all_by_eventable(eventable).length.should == 1
|
|
36
|
-
end
|
|
37
|
-
end
|
|
38
|
-
|
|
39
|
-
end
|
data/spec/helper_methods_spec.rb
DELETED
|
@@ -1,36 +0,0 @@
|
|
|
1
|
-
require 'spec_helper'
|
|
2
|
-
|
|
3
|
-
describe Eventifier::EventHelper do
|
|
4
|
-
|
|
5
|
-
class TestClass
|
|
6
|
-
def self.helper_method(*args); end
|
|
7
|
-
include Eventifier::HelperMethods
|
|
8
|
-
end
|
|
9
|
-
|
|
10
|
-
let!(:helper) { TestClass.new }
|
|
11
|
-
|
|
12
|
-
describe ".replace_vars" do
|
|
13
|
-
let(:event) { Fabricate.build(:event)}
|
|
14
|
-
|
|
15
|
-
it "should replace {{stuff}} with awesome" do
|
|
16
|
-
message = "I'm really loving {{eventable.title}}"
|
|
17
|
-
helper.replace_vars(message, event).should == "I'm really loving <strong>#{event.eventable.title}</strong>"
|
|
18
|
-
end
|
|
19
|
-
|
|
20
|
-
it "should replace multiple {{stuff}} with multiple awesome" do
|
|
21
|
-
message = "I'm really loving {{eventable.title}} and all {{eventable.class.name}}s"
|
|
22
|
-
helper.replace_vars(message, event).should == "I'm really loving <strong>#{event.eventable.title}</strong> and all <strong>Post</strong>s"
|
|
23
|
-
end
|
|
24
|
-
end
|
|
25
|
-
|
|
26
|
-
describe ".load_event_for_template" do
|
|
27
|
-
|
|
28
|
-
it "should add some handy methods to an event instance" do
|
|
29
|
-
event = Fabricate(:event)
|
|
30
|
-
event = helper.load_event_for_template event
|
|
31
|
-
event.object.should == event.eventable
|
|
32
|
-
event.object_type.should == event.eventable_type
|
|
33
|
-
end
|
|
34
|
-
|
|
35
|
-
end
|
|
36
|
-
end
|
|
@@ -1,65 +0,0 @@
|
|
|
1
|
-
require 'spec_helper'
|
|
2
|
-
|
|
3
|
-
describe Eventifier::NotificationHelper do
|
|
4
|
-
|
|
5
|
-
class TestClass
|
|
6
|
-
def self.helper_method(*args); end
|
|
7
|
-
include Eventifier::NotificationHelper
|
|
8
|
-
end
|
|
9
|
-
|
|
10
|
-
let!(:helper) {TestClass.new}
|
|
11
|
-
|
|
12
|
-
before do
|
|
13
|
-
@notification_strings = {
|
|
14
|
-
:post => {
|
|
15
|
-
:create => "{{user.name}} just created an Post - you should check it out",
|
|
16
|
-
:destroy => "{{user.name}} just deleted an Post",
|
|
17
|
-
:update => {
|
|
18
|
-
:single => "{{user.name}} made a change to their Post",
|
|
19
|
-
:multiple => "{{user.name}} made some changes to their Post",
|
|
20
|
-
:attributes => {
|
|
21
|
-
:deleted_at => "{{user.name}} deleted their Post"
|
|
22
|
-
}
|
|
23
|
-
}
|
|
24
|
-
}
|
|
25
|
-
}
|
|
26
|
-
I18n.backend.store_translations :en, :notifications => @notification_strings
|
|
27
|
-
end
|
|
28
|
-
|
|
29
|
-
describe "#notification_message" do
|
|
30
|
-
it "should return the I18n message for that event" do
|
|
31
|
-
|
|
32
|
-
event = Fabricate(:event, :eventable => Fabricate(:post), :verb => :create)
|
|
33
|
-
helper.notification_message(event).should == "<strong class='user'>#{event.user.name}</strong> just created an Post - you should check it out"
|
|
34
|
-
end
|
|
35
|
-
|
|
36
|
-
it "should return a message specific to a single change if only 1 change has been made" do
|
|
37
|
-
event = Fabricate(:event, :eventable => Fabricate(:post), :verb => :update, :change_data => { :name => ["Fred", "Mike"] })
|
|
38
|
-
helper.notification_message(event).should == "<strong class='user'>#{event.user.name}</strong> made a change to their Post"
|
|
39
|
-
end
|
|
40
|
-
it "should return a message specific to a particular field change if configuration is present" do
|
|
41
|
-
event = Fabricate(:event, :eventable => Fabricate(:post), :verb => :update, :change_data => { :deleted_at => [nil, Time.now] })
|
|
42
|
-
helper.notification_message(event).should == "<strong class='user'>#{event.user.name}</strong> deleted their Post"
|
|
43
|
-
end
|
|
44
|
-
|
|
45
|
-
it "should return a message specific to multiple changes if more than 1 change has been made" do
|
|
46
|
-
event = Fabricate(:event, :eventable => Fabricate(:post), :verb => :update, :change_data => { :name => ["Fred", "Mike"], :age => [55, 65] })
|
|
47
|
-
helper.notification_message(event).should == "<strong class='user'>#{event.user.name}</strong> made some changes to their Post"
|
|
48
|
-
end
|
|
49
|
-
|
|
50
|
-
it "should return the default I18n message if one doesn't exist" do
|
|
51
|
-
I18n.backend.reload!
|
|
52
|
-
@notification_strings = {
|
|
53
|
-
:default => {
|
|
54
|
-
:create => "{{user.name}} created a {{eventable_type}}",
|
|
55
|
-
:update => "{{user.name}} updated a {{eventable_type}}"
|
|
56
|
-
}
|
|
57
|
-
}
|
|
58
|
-
I18n.backend.store_translations :test, :notifications => @notification_strings
|
|
59
|
-
I18n.with_locale("test") do
|
|
60
|
-
event = Fabricate(:event, :eventable => Fabricate(:post), :verb => :create)
|
|
61
|
-
helper.notification_message(event).should == "<strong class='user'>#{event.user.name}</strong> created a <strong>Post</strong>"
|
|
62
|
-
end
|
|
63
|
-
end
|
|
64
|
-
end
|
|
65
|
-
end
|