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 @@ |
| 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 | 4 | def follow(profile, circles) |
| 5 | 5 | circles = [circles] unless circles.is_a?(Array) |
| 6 | 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 | 8 | ProfileFollower.create(profile: profile, circle: new_circle) |
| 9 | 9 | end |
| 10 | 10 | end |
| 11 | 11 | |
| 12 | 12 | def follows?(profile) |
| 13 | 13 | return false if profile.nil? |
| 14 | - p profile.followed_by?(self) | |
| 14 | + profile.followed_by?(self) | |
| 15 | 15 | end |
| 16 | 16 | |
| 17 | 17 | def unfollow(profile) |
| ... | ... | @@ -19,7 +19,10 @@ module Follower |
| 19 | 19 | end |
| 20 | 20 | |
| 21 | 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 | 26 | end |
| 24 | 27 | |
| 25 | 28 | def update_profile_circles(profile, new_circles) |
| ... | ... | @@ -37,4 +40,8 @@ module Follower |
| 37 | 40 | ProfileFollower.with_profile(profile).with_circle(circle).destroy_all |
| 38 | 41 | end |
| 39 | 42 | |
| 43 | + def in_circle?(circle) | |
| 44 | + circle.in? self.circles | |
| 45 | + end | |
| 46 | + | |
| 40 | 47 | end | ... | ... |
app/models/external_person.rb
| ... | ... | @@ -4,9 +4,10 @@ class ExternalPerson < ActiveRecord::Base |
| 4 | 4 | include Human |
| 5 | 5 | include ProfileEntity |
| 6 | 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 | 11 | has_many :owned_circles, as: :owner, :class_name => "Circle" |
| 11 | 12 | |
| 12 | 13 | validates_uniqueness_of :identifier, scope: :source |
| ... | ... | @@ -204,7 +205,7 @@ class ExternalPerson < ActiveRecord::Base |
| 204 | 205 | each_friend: nil, is_last_admin?: false, is_last_admin_leaving?: false, |
| 205 | 206 | leave: nil, last_notification: nil, notification_time: 0, notifier: nil, |
| 206 | 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 | 211 | derivated_methods = generate_derivated_methods(methods_and_responses) |
| ... | ... | @@ -258,7 +259,7 @@ class ExternalPerson < ActiveRecord::Base |
| 258 | 259 | more_popular_label: _('no members'), profile_custom_image: nil, |
| 259 | 260 | is_on_homepage?: false, activities: ProfileActivity.none, |
| 260 | 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 | 263 | true, remove_from_suggestion_list: nil, layout_template: 'default', |
| 263 | 264 | is_admin?: false, add_friend: false, is_a_friend?: false, |
| 264 | 265 | already_request_friendship?: false, tracked_actions: ActionTracker::Record.none |
| ... | ... | @@ -275,6 +276,7 @@ class ExternalPerson < ActiveRecord::Base |
| 275 | 276 | if profile_instance_methods.keys.include? method |
| 276 | 277 | return profile_instance_methods[method] |
| 277 | 278 | end |
| 279 | + super | |
| 278 | 280 | end |
| 279 | 281 | |
| 280 | 282 | def respond_to_missing?(method_name, include_private = false) |
| ... | ... | @@ -283,6 +285,10 @@ class ExternalPerson < ActiveRecord::Base |
| 283 | 285 | super |
| 284 | 286 | end |
| 285 | 287 | |
| 288 | + def kind_of?(klass) | |
| 289 | + (klass == Person) ? true : super | |
| 290 | + end | |
| 291 | + | |
| 286 | 292 | private |
| 287 | 293 | |
| 288 | 294 | def generate_derivated_methods(methods) | ... | ... |
app/models/person.rb
app/models/profile.rb
| ... | ... | @@ -4,6 +4,7 @@ |
| 4 | 4 | class Profile < ApplicationRecord |
| 5 | 5 | |
| 6 | 6 | include ProfileEntity |
| 7 | + include Followable | |
| 7 | 8 | |
| 8 | 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 | 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 | 220 | scope :more_active, -> { order 'activities_count DESC' } |
| 220 | 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 | 223 | settings_items :allow_followers, :type => :boolean, :default => true |
| 230 | 224 | alias_method :allow_followers?, :allow_followers |
| 231 | 225 | |
| ... | ... | @@ -241,15 +235,8 @@ class Profile < ApplicationRecord |
| 241 | 235 | |
| 242 | 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 | 241 | # has_many :followers, -> { uniq }, :through => :profile_followers, :source => :person |
| 255 | 242 | |
| ... | ... | @@ -1010,10 +997,6 @@ private :generate_url, :url_options |
| 1010 | 997 | self.active_fields |
| 1011 | 998 | end |
| 1012 | 999 | |
| 1013 | - def followed_by?(person) | |
| 1014 | - (person == self) || (person.in? self.followers) | |
| 1015 | - end | |
| 1016 | - | |
| 1017 | 1000 | def in_social_circle?(person) |
| 1018 | 1001 | (person == self) || (person.is_member_of?(self)) |
| 1019 | 1002 | end |
| ... | ... | @@ -1057,7 +1040,4 @@ private :generate_url, :url_options |
| 1057 | 1040 | person.kind_of?(Profile) && person.has_permission?('destroy_profile', self) |
| 1058 | 1041 | end |
| 1059 | 1042 | |
| 1060 | - def in_circle?(circle) | |
| 1061 | - circle.in? self.circles | |
| 1062 | - end | |
| 1063 | 1043 | end | ... | ... |
db/schema.rb
| ... | ... | @@ -11,7 +11,7 @@ |
| 11 | 11 | # |
| 12 | 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 | 16 | # These are extensions that must be enabled in order to support this database |
| 17 | 17 | enable_extension "plpgsql" |
| ... | ... | @@ -277,11 +277,13 @@ ActiveRecord::Schema.define(version: 20160608123748) do |
| 277 | 277 | |
| 278 | 278 | create_table "circles", force: :cascade do |t| |
| 279 | 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 | 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 | 288 | create_table "comments", force: :cascade do |t| |
| 287 | 289 | t.string "title" |
| ... | ... | @@ -553,6 +555,11 @@ ActiveRecord::Schema.define(version: 20160608123748) do |
| 553 | 555 | t.datetime "updated_at" |
| 554 | 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 | 563 | create_table "product_qualifiers", force: :cascade do |t| |
| 557 | 564 | t.integer "product_id" |
| 558 | 565 | t.integer "qualifier_id" |
| ... | ... | @@ -681,9 +688,11 @@ ActiveRecord::Schema.define(version: 20160608123748) do |
| 681 | 688 | t.integer "circle_id" |
| 682 | 689 | t.datetime "created_at" |
| 683 | 690 | t.datetime "updated_at" |
| 691 | + t.string "profile_type", default: "Person" | |
| 684 | 692 | end |
| 685 | 693 | |
| 686 | 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 | 697 | create_table "qualifier_certifiers", force: :cascade do |t| |
| 689 | 698 | t.integer "qualifier_id" | ... | ... |
test/unit/follower_test.rb
| ... | ... | @@ -150,14 +150,10 @@ class FollowerTest < ActiveSupport::TestCase |
| 150 | 150 | assert_equivalent [@circle1, @circle2], @person2.circles |
| 151 | 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 | 158 | end |
| 163 | 159 | end | ... | ... |