socialization-cassandra 0.0.1.pre.alpha
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.gitignore +13 -0
- data/.travis.yml +7 -0
- data/CHANGELOG.md +0 -0
- data/Gemfile +9 -0
- data/LICENSE.txt +22 -0
- data/README.md +144 -0
- data/Rakefile +10 -0
- data/init.rb +1 -0
- data/lib/generators/socialization/socialization_generator.rb +17 -0
- data/lib/generators/socialization/templates/cassandra/model_comment.rb +2 -0
- data/lib/generators/socialization/templates/cassandra/model_follow.rb +2 -0
- data/lib/generators/socialization/templates/cassandra/model_like.rb +2 -0
- data/lib/generators/socialization/templates/cassandra/model_share.rb +2 -0
- data/lib/generators/socialization/templates/socialization_cassandra_migrations.rake +141 -0
- data/lib/socialization/actors/commenter.rb +79 -0
- data/lib/socialization/actors/follower.rb +79 -0
- data/lib/socialization/actors/liker.rb +79 -0
- data/lib/socialization/actors/mentioner.rb +79 -0
- data/lib/socialization/actors/sharer.rb +79 -0
- data/lib/socialization/config/config.rb +51 -0
- data/lib/socialization/helpers/acts_as_helpers.rb +49 -0
- data/lib/socialization/helpers/string.rb +17 -0
- data/lib/socialization/lib/exceptions.rb +3 -0
- data/lib/socialization/stores/cassandra/base.rb +149 -0
- data/lib/socialization/stores/cassandra/comment.rb +28 -0
- data/lib/socialization/stores/cassandra/config.rb +29 -0
- data/lib/socialization/stores/cassandra/follow.rb +36 -0
- data/lib/socialization/stores/cassandra/like.rb +35 -0
- data/lib/socialization/stores/cassandra/mixins/base.rb +8 -0
- data/lib/socialization/stores/cassandra/share.rb +28 -0
- data/lib/socialization/stores/mixins/base.rb +22 -0
- data/lib/socialization/stores/mixins/follow.rb +39 -0
- data/lib/socialization/stores/mixins/like.rb +40 -0
- data/lib/socialization/stores/mixins/mention.rb +40 -0
- data/lib/socialization/version.rb +3 -0
- data/lib/socialization/victims/commentable.rb +51 -0
- data/lib/socialization/victims/followable.rb +50 -0
- data/lib/socialization/victims/likeable.rb +51 -0
- data/lib/socialization/victims/shareable.rb +51 -0
- data/lib/socialization.rb +17 -0
- data/socialization-cassandra.gemspec +30 -0
- data/test/actors/follower_test.rb +129 -0
- data/test/actors/liker_test.rb +121 -0
- data/test/stores/cassandra/base_test.rb +186 -0
- data/test/stores/cassandra/config_test.rb +36 -0
- data/test/stores/cassandra/follow_store_test.rb +28 -0
- data/test/stores/cassandra/like_store_test.rb +26 -0
- data/test/string_test.rb +13 -0
- data/test/test_helper.rb +259 -0
- data/test/victims/followable_test.rb +65 -0
- data/test/victims/likeable_test.rb +67 -0
- data/test/world_test.rb +107 -0
- metadata +209 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: fa470f9302a13641ec885b36e01fd7fc4f99b1e3
|
4
|
+
data.tar.gz: e236cad8edaa6d361a2bab6fa813b86f06fc19af
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 1bb3d0d4e8e2dde12d7f76f260dfed526bb8c6bfcb279f9218fcaaa2619dba0752a93a2a65f4cc4d8464e66510fc77e15ba31df213e7fd3febd046bc7240d973
|
7
|
+
data.tar.gz: 3aa917f4743fc690e0b8cc5e6fe452077e123ca41528ef6e7e6a1c40a568471aa262799cb05aeb4bb4eb1d9465c0c943df9e7a9d5830b1a34f2a2e82873a4004
|
data/.gitignore
ADDED
data/.travis.yml
ADDED
data/CHANGELOG.md
ADDED
File without changes
|
data/Gemfile
ADDED
data/LICENSE.txt
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
Copyright (c) 2015 Amrit Singh
|
2
|
+
|
3
|
+
MIT License
|
4
|
+
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
6
|
+
a copy of this software and associated documentation files (the
|
7
|
+
"Software"), to deal in the Software without restriction, including
|
8
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
9
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
10
|
+
permit persons to whom the Software is furnished to do so, subject to
|
11
|
+
the following conditions:
|
12
|
+
|
13
|
+
The above copyright notice and this permission notice shall be
|
14
|
+
included in all copies or substantial portions of the Software.
|
15
|
+
|
16
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
17
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
18
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
19
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
20
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
21
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
22
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/README.md
ADDED
@@ -0,0 +1,144 @@
|
|
1
|
+
# Socialization-Cassandra
|
2
|
+
|
3
|
+
Socialization is a Ruby Gem that allows any ActiveRecord model to `Follow`, `Like`, 'Comment' and/or `Share` any other model. Cassandra is used as a data store.
|
4
|
+
|
5
|
+
## Installation
|
6
|
+
|
7
|
+
### Rails 3/4
|
8
|
+
|
9
|
+
Add the gem to the gemfile:
|
10
|
+
`gem "socialization-cassandra"`
|
11
|
+
|
12
|
+
Run the generator:
|
13
|
+
`rails generate socialization -s`
|
14
|
+
|
15
|
+
Run:
|
16
|
+
`rake socialization:migrate`
|
17
|
+
|
18
|
+
### Rails 2.3.x Support
|
19
|
+
|
20
|
+
This gem requires Rails 3 or better. Sorry!
|
21
|
+
|
22
|
+
## Usage
|
23
|
+
|
24
|
+
### Setup
|
25
|
+
|
26
|
+
Allow a model to be followed:
|
27
|
+
|
28
|
+
class Celebrity < ActiveRecord::Base
|
29
|
+
...
|
30
|
+
acts_as_followable
|
31
|
+
...
|
32
|
+
end
|
33
|
+
|
34
|
+
Allow a model to be a follower:
|
35
|
+
|
36
|
+
class User < ActiveRecord::Base
|
37
|
+
...
|
38
|
+
acts_as_follower
|
39
|
+
...
|
40
|
+
end
|
41
|
+
|
42
|
+
|
43
|
+
Allow a model to be liked:
|
44
|
+
|
45
|
+
class Movie < ActiveRecord::Base
|
46
|
+
...
|
47
|
+
acts_as_likeable
|
48
|
+
...
|
49
|
+
end
|
50
|
+
|
51
|
+
Allow a model to like:
|
52
|
+
|
53
|
+
class User < ActiveRecord::Base
|
54
|
+
...
|
55
|
+
acts_as_liker
|
56
|
+
...
|
57
|
+
end
|
58
|
+
|
59
|
+
***
|
60
|
+
|
61
|
+
|
62
|
+
### acts_as_follower Methods
|
63
|
+
|
64
|
+
Follow something
|
65
|
+
|
66
|
+
user.follow!(celebrity)
|
67
|
+
|
68
|
+
Stop following
|
69
|
+
|
70
|
+
user.unfollow!(celebrity)
|
71
|
+
|
72
|
+
Toggle
|
73
|
+
|
74
|
+
user.toggle_follow!(celebrity)
|
75
|
+
|
76
|
+
Is following?
|
77
|
+
|
78
|
+
user.follows?(celebrity)
|
79
|
+
|
80
|
+
What items are you following (given that an Item model is followed)?
|
81
|
+
|
82
|
+
user.followees(Item)
|
83
|
+
|
84
|
+
|
85
|
+
***
|
86
|
+
|
87
|
+
|
88
|
+
### acts_as_followable Methods
|
89
|
+
|
90
|
+
Find out if an objects follows
|
91
|
+
|
92
|
+
celebrity.followed_by?(user)
|
93
|
+
|
94
|
+
All followers
|
95
|
+
|
96
|
+
celebrity.followers(User)
|
97
|
+
|
98
|
+
|
99
|
+
***
|
100
|
+
|
101
|
+
|
102
|
+
### acts_as_liker Methods
|
103
|
+
|
104
|
+
Like something
|
105
|
+
|
106
|
+
user.like!(movie)
|
107
|
+
|
108
|
+
Stop liking
|
109
|
+
|
110
|
+
user.unlike!(movie)
|
111
|
+
|
112
|
+
Toggle
|
113
|
+
|
114
|
+
user.toggle_like!(celebrity)
|
115
|
+
|
116
|
+
Likes?
|
117
|
+
|
118
|
+
user.likes?(movie)
|
119
|
+
|
120
|
+
***
|
121
|
+
|
122
|
+
|
123
|
+
### acts_as_likeable Methods
|
124
|
+
|
125
|
+
Find out if an objects likes
|
126
|
+
|
127
|
+
movie.liked_by?(user)
|
128
|
+
|
129
|
+
All likers
|
130
|
+
|
131
|
+
movie.likers(User)
|
132
|
+
|
133
|
+
***
|
134
|
+
|
135
|
+
## Note on Patches/Pull Requests
|
136
|
+
|
137
|
+
* Fork the project.
|
138
|
+
* Make your feature addition or bug fix.
|
139
|
+
* Add tests for it. This is important so I don't break it in a future version unintentionally.
|
140
|
+
* Send me a pull request. Bonus points for topic branches.
|
141
|
+
|
142
|
+
## Copyright
|
143
|
+
|
144
|
+
Copyright (c) 2015-2016 Amrit Singh-- Released under the MIT license.
|
data/Rakefile
ADDED
data/init.rb
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
require 'socialization'
|
@@ -0,0 +1,17 @@
|
|
1
|
+
require 'rails/generators'
|
2
|
+
require 'rails/generators/migration'
|
3
|
+
|
4
|
+
class SocializationGenerator < Rails::Generators::Base
|
5
|
+
include Rails::Generators::Migration
|
6
|
+
source_root File.expand_path(File.join('templates'), File.dirname(__FILE__))
|
7
|
+
|
8
|
+
def create_migration_file
|
9
|
+
copy_file "cassandra/model_follow.rb", 'app/models/follow.rb'
|
10
|
+
copy_file "cassandra/model_like.rb", 'app/models/like.rb'
|
11
|
+
copy_file "cassandra/model_comment.rb", 'app/models/comment.rb'
|
12
|
+
copy_file "cassandra/model_share.rb", 'app/models/share.rb'
|
13
|
+
|
14
|
+
migration_template 'socialization_cassandra_migrations.rake', 'lib/tasks/socialization_cassandra_migrations.rake'
|
15
|
+
|
16
|
+
end
|
17
|
+
end
|
@@ -0,0 +1,141 @@
|
|
1
|
+
class SocializationCassandraMigrations
|
2
|
+
|
3
|
+
MIGRATIONS = [
|
4
|
+
|
5
|
+
# likes
|
6
|
+
|
7
|
+
"CREATE TABLE likes (
|
8
|
+
actor_type varchar,
|
9
|
+
actor_id bigint,
|
10
|
+
victim_id bigint,
|
11
|
+
victim_type varchar,
|
12
|
+
created_at bigint,
|
13
|
+
PRIMARY KEY ((actor_type, actor_id), created_at)
|
14
|
+
);",
|
15
|
+
|
16
|
+
"CREATE INDEX ON likes (victim_type)",
|
17
|
+
"CREATE INDEX ON likes (victim_id)",
|
18
|
+
|
19
|
+
"CREATE TABLE likers (
|
20
|
+
actor_type varchar,
|
21
|
+
actor_id bigint,
|
22
|
+
victim_id bigint,
|
23
|
+
victim_type varchar,
|
24
|
+
created_at bigint,
|
25
|
+
PRIMARY KEY ((victim_type, victim_id), created_at)
|
26
|
+
);",
|
27
|
+
|
28
|
+
"CREATE INDEX ON likers (actor_type)",
|
29
|
+
"CREATE INDEX ON likers (actor_id)",
|
30
|
+
|
31
|
+
"CREATE TABLE liker_counter (
|
32
|
+
victim_id bigint,
|
33
|
+
victim_type varchar,
|
34
|
+
cnt counter,
|
35
|
+
PRIMARY KEY (victim_type, victim_id)
|
36
|
+
);",
|
37
|
+
|
38
|
+
# follow
|
39
|
+
|
40
|
+
"CREATE TABLE followings (
|
41
|
+
actor_type varchar,
|
42
|
+
actor_id bigint,
|
43
|
+
victim_id bigint,
|
44
|
+
victim_type varchar,
|
45
|
+
created_at bigint,
|
46
|
+
PRIMARY KEY ((actor_type, actor_id), created_at)
|
47
|
+
);",
|
48
|
+
|
49
|
+
"CREATE INDEX ON followings (victim_type)",
|
50
|
+
"CREATE INDEX ON followings (victim_id)",
|
51
|
+
|
52
|
+
"CREATE TABLE followers (
|
53
|
+
actor_type varchar,
|
54
|
+
actor_id bigint,
|
55
|
+
victim_id bigint,
|
56
|
+
victim_type varchar,
|
57
|
+
created_at bigint,
|
58
|
+
PRIMARY KEY ((victim_type, victim_id), created_at)
|
59
|
+
);",
|
60
|
+
|
61
|
+
"CREATE INDEX ON followers (actor_type)",
|
62
|
+
"CREATE INDEX ON followers (actor_id)",
|
63
|
+
|
64
|
+
"CREATE TABLE following_counter (
|
65
|
+
actor_id bigint,
|
66
|
+
actor_type varchar,
|
67
|
+
cnt counter,
|
68
|
+
PRIMARY KEY (actor_type, actor_id)
|
69
|
+
);",
|
70
|
+
|
71
|
+
"CREATE TABLE follower_counter (
|
72
|
+
victim_id bigint,
|
73
|
+
victim_type varchar,
|
74
|
+
cnt counter,
|
75
|
+
PRIMARY KEY (victim_type, victim_id)
|
76
|
+
);",
|
77
|
+
|
78
|
+
# Comments
|
79
|
+
|
80
|
+
"CREATE TABLE comments (
|
81
|
+
actor_type varchar,
|
82
|
+
actor_id bigint,
|
83
|
+
victim_id bigint,
|
84
|
+
victim_type varchar,
|
85
|
+
created_at bigint,
|
86
|
+
txt text,
|
87
|
+
PRIMARY KEY ((victim_type, victim_id), created_at)
|
88
|
+
);",
|
89
|
+
|
90
|
+
"CREATE TABLE comment_counter (
|
91
|
+
victim_id bigint,
|
92
|
+
victim_type varchar,
|
93
|
+
cnt counter,
|
94
|
+
PRIMARY KEY (victim_type, victim_id)
|
95
|
+
);",
|
96
|
+
|
97
|
+
# Share
|
98
|
+
|
99
|
+
"CREATE TABLE shares (
|
100
|
+
actor_type varchar,
|
101
|
+
actor_id bigint,
|
102
|
+
victim_id bigint,
|
103
|
+
victim_type varchar,
|
104
|
+
networks set<text>,
|
105
|
+
created_at bigint,
|
106
|
+
txt text,
|
107
|
+
PRIMARY KEY ((victim_type, victim_id), created_at)
|
108
|
+
);",
|
109
|
+
|
110
|
+
"CREATE TABLE share_counter (
|
111
|
+
victim_id bigint,
|
112
|
+
victim_type varchar,
|
113
|
+
cnt counter,
|
114
|
+
PRIMARY KEY (victim_type, victim_id)
|
115
|
+
);"
|
116
|
+
|
117
|
+
]
|
118
|
+
|
119
|
+
end
|
120
|
+
|
121
|
+
|
122
|
+
namespace :socialization do
|
123
|
+
desc "Socialization Cassandra Migrations"
|
124
|
+
task(:migrate => :environment) do
|
125
|
+
begin
|
126
|
+
session = Socialization.cassandra.connect('system')
|
127
|
+
session.execute("CREATE KEYSPACE #{Socialization.keyspace} WITH replication = {'class': 'NetworkTopologyStrategy'}")
|
128
|
+
rescue Cassandra::Errors::AlreadyExistsError => e
|
129
|
+
next
|
130
|
+
end
|
131
|
+
session = Socialization.cassandra.connect(Socialization.keyspace)
|
132
|
+
|
133
|
+
SocializationCassandraMigrations::MIGRATIONS.each do |m|
|
134
|
+
begin
|
135
|
+
Socialization.cassandra_session.execute(m)
|
136
|
+
rescue Cassandra::Errors::AlreadyExistsError => e
|
137
|
+
next
|
138
|
+
end
|
139
|
+
end
|
140
|
+
end
|
141
|
+
end
|
@@ -0,0 +1,79 @@
|
|
1
|
+
module Socialization
|
2
|
+
module Commenter
|
3
|
+
extend ActiveSupport::Concern
|
4
|
+
|
5
|
+
included do
|
6
|
+
after_destroy { Socialization.comment_model.remove_commentables(self) }
|
7
|
+
|
8
|
+
# Specifies if self can comment {Commentable} objects.
|
9
|
+
#
|
10
|
+
# @return [Boolean]
|
11
|
+
def is_commenter?
|
12
|
+
true
|
13
|
+
end
|
14
|
+
alias commenter? is_commenter?
|
15
|
+
|
16
|
+
# Create a new {Comment comment} relationship.
|
17
|
+
#
|
18
|
+
# @param [Commentable] commentable the object to be commented.
|
19
|
+
# @return [Boolean]
|
20
|
+
def comment!(commentable)
|
21
|
+
raise Socialization::ArgumentError, "#{commentable} is not commentable!" unless commentable.respond_to?(:is_commentable?) && commentable.is_commentable?
|
22
|
+
Socialization.comment_model.comment!(self, commentable)
|
23
|
+
end
|
24
|
+
|
25
|
+
# Delete a {Comment comment} relationship.
|
26
|
+
#
|
27
|
+
# @param [Commentable] commentable the object to uncomment.
|
28
|
+
# @return [Boolean]
|
29
|
+
def uncomment!(commentable)
|
30
|
+
raise Socialization::ArgumentError, "#{commentable} is not commentable!" unless commentable.respond_to?(:is_commentable?) && commentable.is_commentable?
|
31
|
+
Socialization.comment_model.uncomment!(self, commentable)
|
32
|
+
end
|
33
|
+
|
34
|
+
# Toggles a {Comment comment} relationship.
|
35
|
+
#
|
36
|
+
# @param [Commentable] commentable the object to comment/uncomment.
|
37
|
+
# @return [Boolean]
|
38
|
+
def toggle_comment!(commentable)
|
39
|
+
raise Socialization::ArgumentError, "#{commentable} is not commentable!" unless commentable.respond_to?(:is_commentable?) && commentable.is_commentable?
|
40
|
+
if comments?(commentable)
|
41
|
+
uncomment!(commentable)
|
42
|
+
false
|
43
|
+
else
|
44
|
+
comment!(commentable)
|
45
|
+
true
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
# Specifies if self comments a {Commentable} object.
|
50
|
+
#
|
51
|
+
# @param [Commentable] commentable the {Commentable} object to test against.
|
52
|
+
# @return [Boolean]
|
53
|
+
def comments?(commentable)
|
54
|
+
raise Socialization::ArgumentError, "#{commentable} is not commentable!" unless commentable.respond_to?(:is_commentable?) && commentable.is_commentable?
|
55
|
+
Socialization.comment_model.comments?(self, commentable)
|
56
|
+
end
|
57
|
+
|
58
|
+
# Returns all the commentables of a certain type that are commented by self
|
59
|
+
#
|
60
|
+
# @params [Commentable] klass the type of {Commentable} you want
|
61
|
+
# @params [Hash] opts a hash of options
|
62
|
+
# @return [Array<Commentable, Numeric>] An array of Commentable objects or IDs
|
63
|
+
def commentables(klass, opts = {})
|
64
|
+
Socialization.comment_model.commentables(self, klass, opts)
|
65
|
+
end
|
66
|
+
alias :commentees :commentables
|
67
|
+
|
68
|
+
# Returns a relation for all the commentables of a certain type that are commented by self
|
69
|
+
#
|
70
|
+
# @params [Commentable] klass the type of {Commentable} you want
|
71
|
+
# @params [Hash] opts a hash of options
|
72
|
+
# @return ActiveRecord::Relation
|
73
|
+
def commentables_relation(klass, opts = {})
|
74
|
+
Socialization.comment_model.commentables_relation(self, klass, opts)
|
75
|
+
end
|
76
|
+
alias :commentees_relation :commentables_relation
|
77
|
+
end
|
78
|
+
end
|
79
|
+
end
|
@@ -0,0 +1,79 @@
|
|
1
|
+
module Socialization
|
2
|
+
module Follower
|
3
|
+
extend ActiveSupport::Concern
|
4
|
+
|
5
|
+
included do
|
6
|
+
after_destroy { Socialization.follow_model.remove_followables(self) }
|
7
|
+
|
8
|
+
# Specifies if self can follow {Followable} objects.
|
9
|
+
#
|
10
|
+
# @return [Boolean]
|
11
|
+
def is_follower?
|
12
|
+
true
|
13
|
+
end
|
14
|
+
alias follower? is_follower?
|
15
|
+
|
16
|
+
# Create a new {Follow follow} relationship.
|
17
|
+
#
|
18
|
+
# @param [Followable] followable the object to be followed.
|
19
|
+
# @return [Boolean]
|
20
|
+
def follow!(followable)
|
21
|
+
raise Socialization::ArgumentError, "#{followable} is not followable!" unless followable.respond_to?(:is_followable?) && followable.is_followable?
|
22
|
+
Socialization.follow_model.follow!(self, followable)
|
23
|
+
end
|
24
|
+
|
25
|
+
# Delete a {Follow follow} relationship.
|
26
|
+
#
|
27
|
+
# @param [Followable] followable the object to unfollow.
|
28
|
+
# @return [Boolean]
|
29
|
+
def unfollow!(followable)
|
30
|
+
raise Socialization::ArgumentError, "#{followable} is not followable!" unless followable.respond_to?(:is_followable?) && followable.is_followable?
|
31
|
+
Socialization.follow_model.unfollow!(self, followable)
|
32
|
+
end
|
33
|
+
|
34
|
+
# Toggles a {Follow follow} relationship.
|
35
|
+
#
|
36
|
+
# @param [Followable] followable the object to follow/unfollow.
|
37
|
+
# @return [Boolean]
|
38
|
+
def toggle_follow!(followable)
|
39
|
+
raise Socialization::ArgumentError, "#{followable} is not followable!" unless followable.respond_to?(:is_followable?) && followable.is_followable?
|
40
|
+
if follows?(followable)
|
41
|
+
unfollow!(followable)
|
42
|
+
false
|
43
|
+
else
|
44
|
+
follow!(followable)
|
45
|
+
true
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
# Specifies if self follows a {Followable} object.
|
50
|
+
#
|
51
|
+
# @param [Followable] followable the {Followable} object to test against.
|
52
|
+
# @return [Boolean]
|
53
|
+
def follows?(followable)
|
54
|
+
raise Socialization::ArgumentError, "#{followable} is not followable!" unless followable.respond_to?(:is_followable?) && followable.is_followable?
|
55
|
+
Socialization.follow_model.follows?(self, followable)
|
56
|
+
end
|
57
|
+
|
58
|
+
# Returns all the followables of a certain type that are followed by self
|
59
|
+
#
|
60
|
+
# @params [Followable] klass the type of {Followable} you want
|
61
|
+
# @params [Hash] opts a hash of options
|
62
|
+
# @return [Array<Followable, Numeric>] An array of Followable objects or IDs
|
63
|
+
def followables(klass, opts = {})
|
64
|
+
Socialization.follow_model.followables(self, klass, opts)
|
65
|
+
end
|
66
|
+
alias :followees :followables
|
67
|
+
|
68
|
+
# Returns a relation for all the followables of a certain type that are followed by self
|
69
|
+
#
|
70
|
+
# @params [Followable] klass the type of {Followable} you want
|
71
|
+
# @params [Hash] opts a hash of options
|
72
|
+
# @return ActiveRecord::Relation
|
73
|
+
def followables_relation(klass, opts = {})
|
74
|
+
Socialization.follow_model.followables_relation(self, klass, opts)
|
75
|
+
end
|
76
|
+
alias :followees_relation :followables_relation
|
77
|
+
end
|
78
|
+
end
|
79
|
+
end
|
@@ -0,0 +1,79 @@
|
|
1
|
+
module Socialization
|
2
|
+
module Liker
|
3
|
+
extend ActiveSupport::Concern
|
4
|
+
|
5
|
+
included do
|
6
|
+
after_destroy { Socialization.like_model.remove_likeables(self) }
|
7
|
+
|
8
|
+
# Specifies if self can like {Likeable} objects.
|
9
|
+
#
|
10
|
+
# @return [Boolean]
|
11
|
+
def is_liker?
|
12
|
+
true
|
13
|
+
end
|
14
|
+
alias liker? is_liker?
|
15
|
+
|
16
|
+
# Create a new {Like like} relationship.
|
17
|
+
#
|
18
|
+
# @param [Likeable] likeable the object to be liked.
|
19
|
+
# @return [Boolean]
|
20
|
+
def like!(likeable)
|
21
|
+
raise Socialization::ArgumentError, "#{likeable} is not likeable!" unless likeable.respond_to?(:is_likeable?) && likeable.is_likeable?
|
22
|
+
Socialization.like_model.like!(self, likeable)
|
23
|
+
end
|
24
|
+
|
25
|
+
# Delete a {Like like} relationship.
|
26
|
+
#
|
27
|
+
# @param [Likeable] likeable the object to unlike.
|
28
|
+
# @return [Boolean]
|
29
|
+
def unlike!(likeable)
|
30
|
+
raise Socialization::ArgumentError, "#{likeable} is not likeable!" unless likeable.respond_to?(:is_likeable?) && likeable.is_likeable?
|
31
|
+
Socialization.like_model.unlike!(self, likeable)
|
32
|
+
end
|
33
|
+
|
34
|
+
# Toggles a {Like like} relationship.
|
35
|
+
#
|
36
|
+
# @param [Likeable] likeable the object to like/unlike.
|
37
|
+
# @return [Boolean]
|
38
|
+
def toggle_like!(likeable)
|
39
|
+
raise Socialization::ArgumentError, "#{likeable} is not likeable!" unless likeable.respond_to?(:is_likeable?) && likeable.is_likeable?
|
40
|
+
if likes?(likeable)
|
41
|
+
unlike!(likeable)
|
42
|
+
false
|
43
|
+
else
|
44
|
+
like!(likeable)
|
45
|
+
true
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
# Specifies if self likes a {Likeable} object.
|
50
|
+
#
|
51
|
+
# @param [Likeable] likeable the {Likeable} object to test against.
|
52
|
+
# @return [Boolean]
|
53
|
+
def likes?(likeable)
|
54
|
+
raise Socialization::ArgumentError, "#{likeable} is not likeable!" unless likeable.respond_to?(:is_likeable?) && likeable.is_likeable?
|
55
|
+
Socialization.like_model.likes?(self, likeable)
|
56
|
+
end
|
57
|
+
|
58
|
+
# Returns all the likeables of a certain type that are liked by self
|
59
|
+
#
|
60
|
+
# @params [Likeable] klass the type of {Likeable} you want
|
61
|
+
# @params [Hash] opts a hash of options
|
62
|
+
# @return [Array<Likeable, Numeric>] An array of Likeable objects or IDs
|
63
|
+
def likeables(klass, opts = {})
|
64
|
+
Socialization.like_model.likeables(self, klass, opts)
|
65
|
+
end
|
66
|
+
alias :likees :likeables
|
67
|
+
|
68
|
+
# Returns a relation for all the likeables of a certain type that are liked by self
|
69
|
+
#
|
70
|
+
# @params [Likeable] klass the type of {Likeable} you want
|
71
|
+
# @params [Hash] opts a hash of options
|
72
|
+
# @return ActiveRecord::Relation
|
73
|
+
def likeables_relation(klass, opts = {})
|
74
|
+
Socialization.like_model.likeables_relation(self, klass, opts)
|
75
|
+
end
|
76
|
+
alias :likees_relation :likeables_relation
|
77
|
+
end
|
78
|
+
end
|
79
|
+
end
|