photon 0.0.1 → 0.1.0
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.
- data/README +104 -0
- data/lib/photon/delivers/core.rb +72 -0
- data/lib/photon/delivers/message.rb +20 -0
- data/lib/photon/delivers.rb +38 -0
- data/lib/photon/delivery_helpers.rb +5 -0
- data/lib/photon/version.rb +1 -1
- data/lib/photon.rb +29 -1
- metadata +8 -3
data/README
ADDED
@@ -0,0 +1,104 @@
|
|
1
|
+
Introducing Photon - the Dead Simple Rails messenger service
|
2
|
+
|
3
|
+
Photon assumes very basic things about your schema. Right now, there is no config (it's coming, and the framework is there for it), and no migrations.
|
4
|
+
|
5
|
+
It assumes you have the following 4 tables:
|
6
|
+
|
7
|
+
Users
|
8
|
+
|
9
|
+
Messages, containing:
|
10
|
+
body
|
11
|
+
subject
|
12
|
+
delivery_id
|
13
|
+
sender_id
|
14
|
+
timestamps
|
15
|
+
|
16
|
+
MessageThreads, containing:
|
17
|
+
id, timestamps
|
18
|
+
|
19
|
+
|
20
|
+
Deliveries, containing:
|
21
|
+
user_id
|
22
|
+
message_id
|
23
|
+
read
|
24
|
+
message_thread_id
|
25
|
+
timestamps
|
26
|
+
|
27
|
+
|
28
|
+
To setup the proper associations, there are the following model methods:
|
29
|
+
|
30
|
+
User: acts_as_sender
|
31
|
+
Delivery: acts_as_deliverable
|
32
|
+
Message: acts_as_message
|
33
|
+
MessageThread: acts_as_threadable
|
34
|
+
|
35
|
+
This provides the following methods at this time:
|
36
|
+
|
37
|
+
|
38
|
+
user#send_message(:to => User<object>, :subject => string, :body => string)
|
39
|
+
|
40
|
+
Sends a message to a user. It starts a thread.
|
41
|
+
|
42
|
+
|
43
|
+
|
44
|
+
user#reply_to(Message<object>, :subject => string, :body => string)
|
45
|
+
|
46
|
+
Replies to one of the user's received messages
|
47
|
+
|
48
|
+
|
49
|
+
|
50
|
+
user#sent_messages
|
51
|
+
|
52
|
+
Array of sent messages
|
53
|
+
|
54
|
+
|
55
|
+
user#unread_messages
|
56
|
+
|
57
|
+
Array of unread messages
|
58
|
+
|
59
|
+
|
60
|
+
user#read_messages
|
61
|
+
|
62
|
+
Array of read messages
|
63
|
+
|
64
|
+
|
65
|
+
user#read(Message<Object>)
|
66
|
+
|
67
|
+
Marks the specified message object as read
|
68
|
+
|
69
|
+
|
70
|
+
user#unread(Message<Object>)
|
71
|
+
|
72
|
+
Marks the specified message object as unread
|
73
|
+
|
74
|
+
|
75
|
+
Message#find_thread(User<Object>, Message<Object>)
|
76
|
+
|
77
|
+
Finds the thread that the message and user belong to.
|
78
|
+
|
79
|
+
|
80
|
+
|
81
|
+
EXAMPLE USAGE:
|
82
|
+
|
83
|
+
user1 = User.create
|
84
|
+
user2 = User.create
|
85
|
+
|
86
|
+
user1.send_message(:to => user2, :subject => "Hello!", :body => "Hello world!")
|
87
|
+
user1.sent_messages # => [#<Message id: 30, subject: "Hello!", body: "Hello world!", sender_id: 1>]
|
88
|
+
unread_messages = user2.unread_messages # => [#<Message id: 30, subject: "Hello!", body: "Hello world!", sender_id: 1>]
|
89
|
+
user2.read(unread_messages[0])
|
90
|
+
user2.read_messages # => [#<Message id: 30, subject: "Hello!", body: "Hello world!", sender_id: 1>]
|
91
|
+
user2.reply_to(unread_messages[0], :subject => "Goodbye!", :body => "Hello again!")
|
92
|
+
user1.unread_messages # => [#<Message id: 31, subject: "Goodbye!", body: "Hello again!", sender_id: 2>]
|
93
|
+
Message.find_thread(user1, user1.unread_messages[0]) # => [#<Message id: 30, subject: "Hello!", body: "Hello world!", sender_id: 1>, #<Message id: 31, subject: "Goodbye!", body: "Hello again!", sender_id: 2>]
|
94
|
+
|
95
|
+
|
96
|
+
TODO:
|
97
|
+
|
98
|
+
Add configuration files
|
99
|
+
Implement attachment support
|
100
|
+
Make methods chainable - sending and replying should return the delivery object.
|
101
|
+
Support external ActiveRecord databases - involving creating a lookup table on an external database based on current user ids.
|
102
|
+
|
103
|
+
|
104
|
+
An extremely robust Riak version is coming soon.
|
@@ -0,0 +1,72 @@
|
|
1
|
+
module Photon
|
2
|
+
module Delivers
|
3
|
+
module Core
|
4
|
+
def self.included(base)
|
5
|
+
base.send :include, Photon::Delivers::Core::InstanceMethods
|
6
|
+
base.extend Photon::Delivers::Core::ClassMethods
|
7
|
+
end
|
8
|
+
|
9
|
+
module ClassMethods
|
10
|
+
end
|
11
|
+
|
12
|
+
module InstanceMethods
|
13
|
+
def send_message(opts={})
|
14
|
+
if opts[:to].nil? || opts[:subject].nil? || opts[:body].nil?
|
15
|
+
false
|
16
|
+
else
|
17
|
+
opts[:message_thread_id] = opts[:message_thread_id] || constantize_model(Photon.thread).create.id
|
18
|
+
message = constantize_model(Photon.using).create!(:sender => self,
|
19
|
+
:users => [opts[:to]].flatten,
|
20
|
+
:subject => opts[:subject],
|
21
|
+
:body => opts[:body]
|
22
|
+
)
|
23
|
+
|
24
|
+
message.deliveries.update_all({:message_thread_id => opts[:message_thread_id], :scope_id => opts[:scope_id], :scope_type => opts[:scope_type]})
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
def sent_messages
|
29
|
+
constantize_model(Photon.using).where(:sender_id => self.id)
|
30
|
+
end
|
31
|
+
|
32
|
+
def unread_messages
|
33
|
+
through_string = Photon.through.to_s
|
34
|
+
constantize_model(Photon.using).where("#{through_string}.#{self.class.to_s.downcase}_id = ? AND #{through_string}.read IS NOT ?", self.id, true).joins(Photon.through)
|
35
|
+
end
|
36
|
+
|
37
|
+
def read_messages
|
38
|
+
through_string = Photon.through.to_s
|
39
|
+
constantize_model(Photon.using).where("#{through_string}.#{self.class.to_s.downcase}_id = ? AND #{through_string}.read IS ?", self.id, true).joins(Photon.through)
|
40
|
+
end
|
41
|
+
|
42
|
+
def read(message)
|
43
|
+
change_read_status(message, true)
|
44
|
+
end
|
45
|
+
|
46
|
+
def unread(message)
|
47
|
+
change_read_status(message, false)
|
48
|
+
end
|
49
|
+
|
50
|
+
def reply_to(message, opts = {})
|
51
|
+
if message.nil? || opts[:body].nil? || opts[:subject].nil?
|
52
|
+
false
|
53
|
+
else
|
54
|
+
delivery_object = constantize_model(Photon.through).where("#{self.class.to_s.downcase}_id = ? AND #{Photon.using.to_s.singularize}_id = ?", self.id, message.id).first
|
55
|
+
self.send_message(:to => message.sender, :message_thread_id => delivery_object.message_thread_id, :subject => opts[:subject], :body => opts[:body])
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
59
|
+
|
60
|
+
private
|
61
|
+
def change_read_status(message, status)
|
62
|
+
constantize_model(Photon.through).where("#{self.class.to_s.downcase}_id = ? AND #{Photon.using.to_s.singularize}_id = ?", self.id, message.id).update_all({:read => status})
|
63
|
+
end
|
64
|
+
|
65
|
+
def constantize_model(model_string)
|
66
|
+
model_string.to_s.singularize.classify.constantize
|
67
|
+
end
|
68
|
+
end
|
69
|
+
|
70
|
+
end
|
71
|
+
end
|
72
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
module Photon
|
2
|
+
module Delivers
|
3
|
+
module Message
|
4
|
+
def self.included(base)
|
5
|
+
base.send :include, Photon::Delivers::Message::InstanceMethods
|
6
|
+
base.extend Photon::Delivers::Message::ClassMethods
|
7
|
+
end
|
8
|
+
|
9
|
+
module ClassMethods
|
10
|
+
def find_thread(user, message)
|
11
|
+
delivery_string = Photon.through.to_s
|
12
|
+
Photon.using.to_s.singularize.classify.constantize.joins(Photon.through).where("#{delivery_string}.#{Photon.thread.to_s.singularize}_id = (SELECT #{Photon.thread.to_s.singularize}_id FROM #{delivery_string} WHERE #{delivery_string}.#{Photon.to.to_s.singularize}_id = ? AND #{delivery_string}.#{Photon.using.to_s.singularize}_id = ?)", Photon.to.to_s.singularize.classify.constantize.first, Photon.using.to_s.singularize.classify.constantize.last)
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
module InstanceMethods
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
@@ -0,0 +1,38 @@
|
|
1
|
+
module Photon
|
2
|
+
module Delivers
|
3
|
+
def acts_as_sender
|
4
|
+
class_eval do
|
5
|
+
|
6
|
+
has_many Photon.through
|
7
|
+
has_many Photon.using, :through => Photon.through
|
8
|
+
|
9
|
+
include Photon::Delivers::Core
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
def acts_as_deliverable
|
14
|
+
class_eval do
|
15
|
+
belongs_to Photon.to.to_s.singularize.to_sym
|
16
|
+
belongs_to Photon.using.to_s.singularize.to_sym
|
17
|
+
belongs_to Photon.thread.to_s.singularize.to_sym
|
18
|
+
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
def acts_as_message
|
23
|
+
class_eval do
|
24
|
+
has_many Photon.through
|
25
|
+
has_many Photon.to, :through => Photon.through
|
26
|
+
belongs_to :sender, :class_name => Photon.to.to_s.singularize.classify
|
27
|
+
|
28
|
+
include Photon::Delivers::Message
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
def acts_as_threadable
|
33
|
+
class_eval do
|
34
|
+
has_many Photon.through
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
data/lib/photon/version.rb
CHANGED
data/lib/photon.rb
CHANGED
@@ -1,3 +1,31 @@
|
|
1
1
|
module Photon
|
2
|
-
|
2
|
+
require "active_record"
|
3
|
+
require "action_view"
|
4
|
+
|
5
|
+
require 'photon/delivers'
|
6
|
+
require 'photon/delivery_helpers'
|
7
|
+
require 'photon/delivers/message'
|
8
|
+
require 'photon/delivers/core'
|
9
|
+
|
10
|
+
mattr_accessor :using
|
11
|
+
@@using = :messages
|
12
|
+
|
13
|
+
mattr_accessor :through
|
14
|
+
@@through = :deliveries
|
15
|
+
|
16
|
+
mattr_accessor :to
|
17
|
+
@@to = :users
|
18
|
+
|
19
|
+
mattr_accessor :thread
|
20
|
+
@@thread = :message_threads
|
21
|
+
|
22
|
+
if defined?(ActiveRecord::Base)
|
23
|
+
ActiveRecord::Base.extend Photon::Delivers
|
24
|
+
end
|
25
|
+
|
26
|
+
if defined?(ActionView::Base)
|
27
|
+
ActionView::Base.send :include, Photon::DeliveryHelpers
|
28
|
+
end
|
29
|
+
|
30
|
+
|
3
31
|
end
|
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: photon
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: 27
|
5
5
|
prerelease: false
|
6
6
|
segments:
|
7
7
|
- 0
|
8
|
-
- 0
|
9
8
|
- 1
|
10
|
-
|
9
|
+
- 0
|
10
|
+
version: 0.1.0
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- Gerred Dillon
|
@@ -31,8 +31,13 @@ extra_rdoc_files: []
|
|
31
31
|
files:
|
32
32
|
- .gitignore
|
33
33
|
- Gemfile
|
34
|
+
- README
|
34
35
|
- Rakefile
|
35
36
|
- lib/photon.rb
|
37
|
+
- lib/photon/delivers.rb
|
38
|
+
- lib/photon/delivers/core.rb
|
39
|
+
- lib/photon/delivers/message.rb
|
40
|
+
- lib/photon/delivery_helpers.rb
|
36
41
|
- lib/photon/version.rb
|
37
42
|
- photon.gemspec
|
38
43
|
has_rdoc: true
|