Commit 6b9d32ebb18b6cf482b1bd7cf42e2c0e25168d7e
1 parent
ad416827
Exists in
master
and in
29 other branches
api: scope to fetch visible products for person
Showing
2 changed files
with
83 additions
and
0 deletions
Show diff stats
app/models/product.rb
... | ... | @@ -51,6 +51,25 @@ class Product < ActiveRecord::Base |
51 | 51 | {:joins => :product_category, :conditions => ['categories.path LIKE ?', "%#{category.slug}%"]} if category |
52 | 52 | } |
53 | 53 | |
54 | + scope :visible_for_person, lambda { |person| | |
55 | + joins('INNER JOIN "profiles" enterprises ON enterprises."id" = "products"."profile_id"') | |
56 | + .joins('LEFT JOIN "role_assignments" ON ("role_assignments"."resource_id" = enterprises."id" | |
57 | + AND "role_assignments"."resource_type" = \'Profile\') OR ( | |
58 | + "role_assignments"."resource_id" = enterprises."environment_id" AND | |
59 | + "role_assignments"."resource_type" = \'Environment\' )') | |
60 | + .joins('LEFT JOIN "roles" ON "role_assignments"."role_id" = "roles"."id"') | |
61 | + .where( | |
62 | + ['( (roles.key = ? OR roles.key = ?) AND role_assignments.accessor_type = \'Profile\' AND role_assignments.accessor_id = ? ) | |
63 | + OR | |
64 | + ( ( ( role_assignments.accessor_type = \'Profile\' AND | |
65 | + role_assignments.accessor_id = ? ) OR | |
66 | + ( enterprises.public_profile = ? AND enterprises.enabled = ? ) ) AND | |
67 | + ( enterprises.visible = ? ) )', | |
68 | + 'profile_admin', 'environment_administrator', person.id, person.id, | |
69 | + true, true, true] | |
70 | + ).uniq | |
71 | + } | |
72 | + | |
54 | 73 | after_update :save_image |
55 | 74 | |
56 | 75 | def lat | ... | ... |
test/unit/product_test.rb
... | ... | @@ -577,4 +577,68 @@ class ProductTest < ActiveSupport::TestCase |
577 | 577 | assert_includes products, p3 |
578 | 578 | end |
579 | 579 | |
580 | + should 'fetch products from organizations that are visible for a user' do | |
581 | + person = create_user('some-person').person | |
582 | + admin = create_user('some-admin').person | |
583 | + env_admin = create_user('env-admin').person | |
584 | + env = Environment.default | |
585 | + | |
586 | + e1 = fast_create(Enterprise, :public_profile => true , :visible => true) | |
587 | + p1 = fast_create(Product, :profile_id => e1.id) | |
588 | + e1.affiliate(admin, Profile::Roles.admin(env.id)) | |
589 | + e1.affiliate(person, Profile::Roles.member(env.id)) | |
590 | + | |
591 | + e2 = fast_create(Enterprise, :public_profile => true , :visible => true) | |
592 | + p2 = fast_create(Product, :profile_id => e2.id) | |
593 | + e3 = fast_create(Enterprise, :public_profile => false, :visible => true) | |
594 | + p3 = fast_create(Product, :profile_id => e3.id) | |
595 | + | |
596 | + e4 = fast_create(Enterprise, :public_profile => false, :visible => true) | |
597 | + p4 = fast_create(Product, :profile_id => e4.id) | |
598 | + e4.affiliate(admin, Profile::Roles.admin(env.id)) | |
599 | + e4.affiliate(person, Profile::Roles.member(env.id)) | |
600 | + | |
601 | + e5 = fast_create(Enterprise, :public_profile => true, :visible => false) | |
602 | + p5 = fast_create(Product, :profile_id => e5.id) | |
603 | + e5.affiliate(admin, Profile::Roles.admin(env.id)) | |
604 | + e5.affiliate(person, Profile::Roles.member(env.id)) | |
605 | + | |
606 | + e6 = fast_create(Enterprise, :enabled => false, :visible => true) | |
607 | + p6 = fast_create(Product, :profile_id => e6.id) | |
608 | + e6.affiliate(admin, Profile::Roles.admin(env.id)) | |
609 | + | |
610 | + e7 = fast_create(Enterprise, :public_profile => false, :visible => false) | |
611 | + p7 = fast_create(Product, :profile_id => e7.id) | |
612 | + | |
613 | + Environment.default.add_admin(env_admin) | |
614 | + | |
615 | + products_person = Product.visible_for_person(person) | |
616 | + products_admin = Product.visible_for_person(admin) | |
617 | + products_env_admin = Product.visible_for_person(env_admin) | |
618 | + | |
619 | + assert_includes products_person, p1 | |
620 | + assert_includes products_admin, p1 | |
621 | + assert_includes products_env_admin, p1 | |
622 | + | |
623 | + assert_includes products_person, p2 | |
624 | + assert_includes products_env_admin, p2 | |
625 | + assert_not_includes products_person, p3 | |
626 | + assert_includes products_env_admin, p3 | |
627 | + | |
628 | + assert_includes products_person, p4 | |
629 | + assert_includes products_admin, p4 | |
630 | + assert_includes products_env_admin, p4 | |
631 | + | |
632 | + assert_not_includes products_person, p5 | |
633 | + assert_includes products_admin, p5 | |
634 | + assert_includes products_env_admin, p5 | |
635 | + | |
636 | + assert_not_includes products_person, p6 | |
637 | + assert_includes products_admin, p6 | |
638 | + assert_includes products_env_admin, p6 | |
639 | + | |
640 | + assert_not_includes products_person, p7 | |
641 | + assert_includes products_env_admin, p7 | |
642 | + end | |
643 | + | |
580 | 644 | end | ... | ... |