Commit 14995a0e735b3461bc92759d538ccfa412a1988a
1 parent
f8e47f31
Introduces the Followable concert
Signed-off-by: Gabriel Silva <gabriel93.silva@gmail.com> Signed-off-by: DylanGuedes <djmgguedes@gmail.com>
Showing
7 changed files
with
59 additions
and
47 deletions
Show diff stats
@@ -0,0 +1,18 @@ | @@ -0,0 +1,18 @@ | ||
1 | +module Followable | ||
2 | + extend ActiveSupport::Concern | ||
3 | + | ||
4 | + def followers | ||
5 | + person_followers = Person.joins(:owned_circles).merge(circles).uniq | ||
6 | + external_person_followers = ExternalPerson.joins(:owned_circles).merge(circles).uniq | ||
7 | + | ||
8 | + person_followers + external_person_followers | ||
9 | + end | ||
10 | + | ||
11 | + def followed_by?(person) | ||
12 | + (person == self) || (person.in? self.followers) | ||
13 | + end | ||
14 | + | ||
15 | + def in_circle?(circle) | ||
16 | + circle.in? self.circles | ||
17 | + end | ||
18 | +end |
app/models/concerns/follower.rb
@@ -4,14 +4,14 @@ module Follower | @@ -4,14 +4,14 @@ module Follower | ||
4 | def follow(profile, circles) | 4 | def follow(profile, circles) |
5 | circles = [circles] unless circles.is_a?(Array) | 5 | circles = [circles] unless circles.is_a?(Array) |
6 | circles.each do |new_circle| | 6 | circles.each do |new_circle| |
7 | - next if new_circle.owner != self || new_circle.profile_type != profile.class.name | 7 | + next if new_circle.owner != self || !profile.kind_of?(new_circle.profile_type.constantize) |
8 | ProfileFollower.create(profile: profile, circle: new_circle) | 8 | ProfileFollower.create(profile: profile, circle: new_circle) |
9 | end | 9 | end |
10 | end | 10 | end |
11 | 11 | ||
12 | def follows?(profile) | 12 | def follows?(profile) |
13 | return false if profile.nil? | 13 | return false if profile.nil? |
14 | - p profile.followed_by?(self) | 14 | + profile.followed_by?(self) |
15 | end | 15 | end |
16 | 16 | ||
17 | def unfollow(profile) | 17 | def unfollow(profile) |
@@ -19,7 +19,10 @@ module Follower | @@ -19,7 +19,10 @@ module Follower | ||
19 | end | 19 | end |
20 | 20 | ||
21 | def followed_profiles | 21 | def followed_profiles |
22 | - Profile.followed_by self | 22 | + external_people = ExternalPerson.joins(:circles).where("circles.owner_id = ?", self.id) |
23 | + profiles = Profile.joins(:circles).where("circles.owner_id = ?", self.id) | ||
24 | + | ||
25 | + external_people.uniq + profiles.uniq | ||
23 | end | 26 | end |
24 | 27 | ||
25 | def update_profile_circles(profile, new_circles) | 28 | def update_profile_circles(profile, new_circles) |
@@ -37,4 +40,8 @@ module Follower | @@ -37,4 +40,8 @@ module Follower | ||
37 | ProfileFollower.with_profile(profile).with_circle(circle).destroy_all | 40 | ProfileFollower.with_profile(profile).with_circle(circle).destroy_all |
38 | end | 41 | end |
39 | 42 | ||
43 | + def in_circle?(circle) | ||
44 | + circle.in? self.circles | ||
45 | + end | ||
46 | + | ||
40 | end | 47 | end |
app/models/external_person.rb
@@ -4,9 +4,10 @@ class ExternalPerson < ActiveRecord::Base | @@ -4,9 +4,10 @@ class ExternalPerson < ActiveRecord::Base | ||
4 | include Human | 4 | include Human |
5 | include ProfileEntity | 5 | include ProfileEntity |
6 | include Follower | 6 | include Follower |
7 | + include Followable | ||
7 | 8 | ||
8 | - has_many :profile_followers | ||
9 | - has_many :circles, :through => :profile_followers, :as => :profile | 9 | + has_many :profile_followers, :as => :profile |
10 | + has_many :circles, :through => :profile_followers | ||
10 | has_many :owned_circles, as: :owner, :class_name => "Circle" | 11 | has_many :owned_circles, as: :owner, :class_name => "Circle" |
11 | 12 | ||
12 | validates_uniqueness_of :identifier, scope: :source | 13 | validates_uniqueness_of :identifier, scope: :source |
@@ -204,7 +205,7 @@ class ExternalPerson < ActiveRecord::Base | @@ -204,7 +205,7 @@ class ExternalPerson < ActiveRecord::Base | ||
204 | each_friend: nil, is_last_admin?: false, is_last_admin_leaving?: false, | 205 | each_friend: nil, is_last_admin?: false, is_last_admin_leaving?: false, |
205 | leave: nil, last_notification: nil, notification_time: 0, notifier: nil, | 206 | leave: nil, last_notification: nil, notification_time: 0, notifier: nil, |
206 | remove_suggestion: nil, allow_invitation_from?: false, in_social_circle?: false, | 207 | remove_suggestion: nil, allow_invitation_from?: false, in_social_circle?: false, |
207 | - allow_followers: false, in_circles: Circle.none, followers: [], in_circle?: false | 208 | + allow_followers: false |
208 | } | 209 | } |
209 | 210 | ||
210 | derivated_methods = generate_derivated_methods(methods_and_responses) | 211 | derivated_methods = generate_derivated_methods(methods_and_responses) |
@@ -258,7 +259,7 @@ class ExternalPerson < ActiveRecord::Base | @@ -258,7 +259,7 @@ class ExternalPerson < ActiveRecord::Base | ||
258 | more_popular_label: _('no members'), profile_custom_image: nil, | 259 | more_popular_label: _('no members'), profile_custom_image: nil, |
259 | is_on_homepage?: false, activities: ProfileActivity.none, | 260 | is_on_homepage?: false, activities: ProfileActivity.none, |
260 | may_display_field_to?: true, may_display_location_to?: true, public_fields: | 261 | may_display_field_to?: true, may_display_location_to?: true, public_fields: |
261 | - {}, followed_by?: false, display_private_info_to?: true, can_view_field?: | 262 | + {}, display_private_info_to?: true, can_view_field?: |
262 | true, remove_from_suggestion_list: nil, layout_template: 'default', | 263 | true, remove_from_suggestion_list: nil, layout_template: 'default', |
263 | is_admin?: false, add_friend: false, is_a_friend?: false, | 264 | is_admin?: false, add_friend: false, is_a_friend?: false, |
264 | already_request_friendship?: false, tracked_actions: ActionTracker::Record.none | 265 | already_request_friendship?: false, tracked_actions: ActionTracker::Record.none |
@@ -275,6 +276,7 @@ class ExternalPerson < ActiveRecord::Base | @@ -275,6 +276,7 @@ class ExternalPerson < ActiveRecord::Base | ||
275 | if profile_instance_methods.keys.include? method | 276 | if profile_instance_methods.keys.include? method |
276 | return profile_instance_methods[method] | 277 | return profile_instance_methods[method] |
277 | end | 278 | end |
279 | + super | ||
278 | end | 280 | end |
279 | 281 | ||
280 | def respond_to_missing?(method_name, include_private = false) | 282 | def respond_to_missing?(method_name, include_private = false) |
@@ -283,6 +285,10 @@ class ExternalPerson < ActiveRecord::Base | @@ -283,6 +285,10 @@ class ExternalPerson < ActiveRecord::Base | ||
283 | super | 285 | super |
284 | end | 286 | end |
285 | 287 | ||
288 | + def kind_of?(klass) | ||
289 | + (klass == Person) ? true : super | ||
290 | + end | ||
291 | + | ||
286 | private | 292 | private |
287 | 293 | ||
288 | def generate_derivated_methods(methods) | 294 | def generate_derivated_methods(methods) |
app/models/person.rb
@@ -570,10 +570,6 @@ class Person < Profile | @@ -570,10 +570,6 @@ class Person < Profile | ||
570 | } | 570 | } |
571 | end | 571 | end |
572 | 572 | ||
573 | - def followed_profiles | ||
574 | - Profile.followed_by self | ||
575 | - end | ||
576 | - | ||
577 | def in_social_circle?(person) | 573 | def in_social_circle?(person) |
578 | self.is_a_friend?(person) || super | 574 | self.is_a_friend?(person) || super |
579 | end | 575 | end |
app/models/profile.rb
@@ -4,6 +4,7 @@ | @@ -4,6 +4,7 @@ | ||
4 | class Profile < ApplicationRecord | 4 | class Profile < ApplicationRecord |
5 | 5 | ||
6 | include ProfileEntity | 6 | include ProfileEntity |
7 | + include Followable | ||
7 | 8 | ||
8 | attr_accessible :public_profile, :nickname, :custom_footer, :custom_header, :address, :zip_code, :contact_phone, :image_builder, :description, :closed, :template_id, :lat, :lng, :is_template, :fields_privacy, :preferred_domain_id, :category_ids, :country, :city, :state, :national_region_code, :email, :contact_email, :redirect_l10n, :notification_time, | 9 | attr_accessible :public_profile, :nickname, :custom_footer, :custom_header, :address, :zip_code, :contact_phone, :image_builder, :description, :closed, :template_id, :lat, :lng, :is_template, :fields_privacy, :preferred_domain_id, :category_ids, :country, :city, :state, :national_region_code, :email, :contact_email, :redirect_l10n, :notification_time, |
9 | :custom_url_redirection, :email_suggestions, :allow_members_to_invite, :invite_friends_only, :secret, :profile_admin_mail_notification, :redirection_after_login, :allow_followers | 10 | :custom_url_redirection, :email_suggestions, :allow_members_to_invite, :invite_friends_only, :secret, :profile_admin_mail_notification, :redirection_after_login, :allow_followers |
@@ -219,13 +220,6 @@ class Profile < ApplicationRecord | @@ -219,13 +220,6 @@ class Profile < ApplicationRecord | ||
219 | scope :more_active, -> { order 'activities_count DESC' } | 220 | scope :more_active, -> { order 'activities_count DESC' } |
220 | scope :more_recent, -> { order "created_at DESC" } | 221 | scope :more_recent, -> { order "created_at DESC" } |
221 | 222 | ||
222 | - scope :followed_by, -> person{ | ||
223 | - distinct.select('profiles.*'). | ||
224 | - joins('left join profiles_circles ON profiles_circles.profile_id = profiles.id'). | ||
225 | - joins('left join circles ON circles.id = profiles_circles.circle_id'). | ||
226 | - where('circles.owner_id = ?', person.id) | ||
227 | - } | ||
228 | - | ||
229 | settings_items :allow_followers, :type => :boolean, :default => true | 223 | settings_items :allow_followers, :type => :boolean, :default => true |
230 | alias_method :allow_followers?, :allow_followers | 224 | alias_method :allow_followers?, :allow_followers |
231 | 225 | ||
@@ -241,15 +235,8 @@ class Profile < ApplicationRecord | @@ -241,15 +235,8 @@ class Profile < ApplicationRecord | ||
241 | 235 | ||
242 | has_many :email_templates, :foreign_key => :owner_id | 236 | has_many :email_templates, :foreign_key => :owner_id |
243 | 237 | ||
244 | - has_many :profile_followers | ||
245 | - has_many :circles, :through => :profile_followers, :as => :profile | ||
246 | - | ||
247 | - def followers | ||
248 | - person_followers = Person.joins(:owned_circles).merge(circles).uniq | ||
249 | - external_person_followers = ExternalPerson.joins(:owned_circles).merge(circles).uniq | ||
250 | - | ||
251 | - person_followers + external_person_followers | ||
252 | - end | 238 | + has_many :profile_followers, :as => :profile |
239 | + has_many :circles, :through => :profile_followers | ||
253 | 240 | ||
254 | # has_many :followers, -> { uniq }, :through => :profile_followers, :source => :person | 241 | # has_many :followers, -> { uniq }, :through => :profile_followers, :source => :person |
255 | 242 | ||
@@ -1010,10 +997,6 @@ private :generate_url, :url_options | @@ -1010,10 +997,6 @@ private :generate_url, :url_options | ||
1010 | self.active_fields | 997 | self.active_fields |
1011 | end | 998 | end |
1012 | 999 | ||
1013 | - def followed_by?(person) | ||
1014 | - (person == self) || (person.in? self.followers) | ||
1015 | - end | ||
1016 | - | ||
1017 | def in_social_circle?(person) | 1000 | def in_social_circle?(person) |
1018 | (person == self) || (person.is_member_of?(self)) | 1001 | (person == self) || (person.is_member_of?(self)) |
1019 | end | 1002 | end |
@@ -1057,7 +1040,4 @@ private :generate_url, :url_options | @@ -1057,7 +1040,4 @@ private :generate_url, :url_options | ||
1057 | person.kind_of?(Profile) && person.has_permission?('destroy_profile', self) | 1040 | person.kind_of?(Profile) && person.has_permission?('destroy_profile', self) |
1058 | end | 1041 | end |
1059 | 1042 | ||
1060 | - def in_circle?(circle) | ||
1061 | - circle.in? self.circles | ||
1062 | - end | ||
1063 | end | 1043 | end |
db/schema.rb
@@ -11,7 +11,7 @@ | @@ -11,7 +11,7 @@ | ||
11 | # | 11 | # |
12 | # It's strongly recommended that you check this file into your version control system. | 12 | # It's strongly recommended that you check this file into your version control system. |
13 | 13 | ||
14 | -ActiveRecord::Schema.define(version: 20160608123748) do | 14 | +ActiveRecord::Schema.define(version: 20160822184703) do |
15 | 15 | ||
16 | # These are extensions that must be enabled in order to support this database | 16 | # These are extensions that must be enabled in order to support this database |
17 | enable_extension "plpgsql" | 17 | enable_extension "plpgsql" |
@@ -277,11 +277,13 @@ ActiveRecord::Schema.define(version: 20160608123748) do | @@ -277,11 +277,13 @@ ActiveRecord::Schema.define(version: 20160608123748) do | ||
277 | 277 | ||
278 | create_table "circles", force: :cascade do |t| | 278 | create_table "circles", force: :cascade do |t| |
279 | t.string "name" | 279 | t.string "name" |
280 | - t.integer "person_id" | ||
281 | - t.string "profile_type", null: false | 280 | + t.integer "owner_id" |
281 | + t.string "profile_type", null: false | ||
282 | + t.string "owner_type", default: "Person" | ||
282 | end | 283 | end |
283 | 284 | ||
284 | - add_index "circles", ["person_id", "name"], name: "circles_composite_key_index", unique: true, using: :btree | 285 | + add_index "circles", ["owner_id", "name"], name: "circles_composite_key_index", unique: true, using: :btree |
286 | + add_index "circles", ["owner_id", "owner_type"], name: "index_circles_on_owner_id_and_owner_type", using: :btree | ||
285 | 287 | ||
286 | create_table "comments", force: :cascade do |t| | 288 | create_table "comments", force: :cascade do |t| |
287 | t.string "title" | 289 | t.string "title" |
@@ -553,6 +555,11 @@ ActiveRecord::Schema.define(version: 20160608123748) do | @@ -553,6 +555,11 @@ ActiveRecord::Schema.define(version: 20160608123748) do | ||
553 | t.datetime "updated_at" | 555 | t.datetime "updated_at" |
554 | end | 556 | end |
555 | 557 | ||
558 | + create_table "private_scraps", force: :cascade do |t| | ||
559 | + t.integer "person_id" | ||
560 | + t.integer "scrap_id" | ||
561 | + end | ||
562 | + | ||
556 | create_table "product_qualifiers", force: :cascade do |t| | 563 | create_table "product_qualifiers", force: :cascade do |t| |
557 | t.integer "product_id" | 564 | t.integer "product_id" |
558 | t.integer "qualifier_id" | 565 | t.integer "qualifier_id" |
@@ -681,9 +688,11 @@ ActiveRecord::Schema.define(version: 20160608123748) do | @@ -681,9 +688,11 @@ ActiveRecord::Schema.define(version: 20160608123748) do | ||
681 | t.integer "circle_id" | 688 | t.integer "circle_id" |
682 | t.datetime "created_at" | 689 | t.datetime "created_at" |
683 | t.datetime "updated_at" | 690 | t.datetime "updated_at" |
691 | + t.string "profile_type", default: "Person" | ||
684 | end | 692 | end |
685 | 693 | ||
686 | add_index "profiles_circles", ["profile_id", "circle_id"], name: "profiles_circles_composite_key_index", unique: true, using: :btree | 694 | add_index "profiles_circles", ["profile_id", "circle_id"], name: "profiles_circles_composite_key_index", unique: true, using: :btree |
695 | + add_index "profiles_circles", ["profile_id", "profile_type"], name: "index_profiles_circles_on_profile_id_and_profile_type", using: :btree | ||
687 | 696 | ||
688 | create_table "qualifier_certifiers", force: :cascade do |t| | 697 | create_table "qualifier_certifiers", force: :cascade do |t| |
689 | t.integer "qualifier_id" | 698 | t.integer "qualifier_id" |
test/unit/follower_test.rb
@@ -150,14 +150,10 @@ class FollowerTest < ActiveSupport::TestCase | @@ -150,14 +150,10 @@ class FollowerTest < ActiveSupport::TestCase | ||
150 | assert_equivalent [@circle1, @circle2], @person2.circles | 150 | assert_equivalent [@circle1, @circle2], @person2.circles |
151 | end | 151 | end |
152 | 152 | ||
153 | - should 'external person be followable' do | ||
154 | - person = fast_create(Person, :environment_id => Environment.default.id) | ||
155 | - circle = Circle.create(owner: @external_person, profile_type: "Person", name: "FRIENDSSS") | ||
156 | - pf = ProfileFollower.create(profile: @external_person, circle: circle) | ||
157 | - assert person.follows? @external_person | ||
158 | - | ||
159 | - # assert_difference 'ProfileFollower.all.count' do | ||
160 | - # person.follow(@external_person, circle) | ||
161 | - # end | 153 | + should 'follow External Person' do |
154 | + assert_difference 'ProfileFollower.count' do | ||
155 | + @person1.follow(@external_person, @circle1) | ||
156 | + end | ||
157 | + assert @person1.follows? @external_person | ||
162 | end | 158 | end |
163 | end | 159 | end |