cover granular permissions

This commit is contained in:
Connor Turland 2017-03-06 13:06:44 -05:00
parent df2d203596
commit cb4e736a51
2 changed files with 78 additions and 4 deletions

View file

@ -11,6 +11,9 @@ class MapActivityService
since = until_moment - 24.hours since = until_moment - 24.hours
scoped_topic_ids = TopicPolicy::Scope.new(user, map.topics).resolve.map(&:id)
scoped_synapse_ids = SynapsePolicy::Scope.new(user, map.synapses).resolve.map(&:id)
message_count = Message.where(resource: map) message_count = Message.where(resource: map)
.where("created_at > ? AND created_at < ?", since, until_moment) .where("created_at > ? AND created_at < ?", since, until_moment)
.where.not(user: user).count .where.not(user: user).count
@ -20,6 +23,7 @@ class MapActivityService
moved_count = Event.where(kind: 'topic_moved_on_map', map: map) moved_count = Event.where(kind: 'topic_moved_on_map', map: map)
.where("created_at > ? AND created_at < ?", since, until_moment) .where("created_at > ? AND created_at < ?", since, until_moment)
.where(eventable_id: scoped_topic_ids)
.where.not(user: user).group(:eventable_id).count .where.not(user: user).group(:eventable_id).count
if moved_count.keys.length > 0 if moved_count.keys.length > 0
results[:stats][:topics_moved] = moved_count.keys.length results[:stats][:topics_moved] = moved_count.keys.length
@ -39,7 +43,7 @@ class MapActivityService
topics_added_events.each do |ta| topics_added_events.each do |ta|
num_adds = topics_added_events.where(eventable_id: ta.eventable_id).count num_adds = topics_added_events.where(eventable_id: ta.eventable_id).count
num_removes = topics_removed_events.where(eventable_id: ta.eventable_id).count num_removes = topics_removed_events.where(eventable_id: ta.eventable_id).count
topics_added_to_include[ta.eventable_id] = ta if num_adds > num_removes topics_added_to_include[ta.eventable_id] = ta if num_adds > num_removes && scoped_topic_ids.include?(ta.eventable.id)
end end
if topics_added_to_include.keys.length > 0 if topics_added_to_include.keys.length > 0
results[:stats][:topics_added] = topics_added_to_include.keys.length results[:stats][:topics_added] = topics_added_to_include.keys.length
@ -50,7 +54,7 @@ class MapActivityService
topics_removed_events.each do |ta| topics_removed_events.each do |ta|
num_adds = topics_added_events.where(eventable_id: ta.eventable_id).count num_adds = topics_added_events.where(eventable_id: ta.eventable_id).count
num_removes = topics_removed_events.where(eventable_id: ta.eventable_id).count num_removes = topics_removed_events.where(eventable_id: ta.eventable_id).count
topics_removed_to_include[ta.eventable_id] = ta if num_removes > num_adds topics_removed_to_include[ta.eventable_id] = ta if num_removes > num_adds && TopicPolicy.new(user, ta.eventable).show?
end end
if topics_removed_to_include.keys.length > 0 if topics_removed_to_include.keys.length > 0
results[:stats][:topics_removed] = topics_removed_to_include.keys.length results[:stats][:topics_removed] = topics_removed_to_include.keys.length
@ -71,7 +75,7 @@ class MapActivityService
synapses_added_events.each do |ta| synapses_added_events.each do |ta|
num_adds = synapses_added_events.where(eventable_id: ta.eventable_id).count num_adds = synapses_added_events.where(eventable_id: ta.eventable_id).count
num_removes = synapses_removed_events.where(eventable_id: ta.eventable_id).count num_removes = synapses_removed_events.where(eventable_id: ta.eventable_id).count
synapses_added_to_include[ta.eventable_id] = ta if num_adds > num_removes synapses_added_to_include[ta.eventable_id] = ta if num_adds > num_removes && scoped_synapse_ids.include?(ta.eventable.id)
end end
if synapses_added_to_include.keys.length > 0 if synapses_added_to_include.keys.length > 0
results[:stats][:synapses_added] = synapses_added_to_include.keys.length results[:stats][:synapses_added] = synapses_added_to_include.keys.length
@ -82,7 +86,7 @@ class MapActivityService
synapses_removed_events.each do |ta| synapses_removed_events.each do |ta|
num_adds = synapses_added_events.where(eventable_id: ta.eventable_id).count num_adds = synapses_added_events.where(eventable_id: ta.eventable_id).count
num_removes = synapses_removed_events.where(eventable_id: ta.eventable_id).count num_removes = synapses_removed_events.where(eventable_id: ta.eventable_id).count
synapses_removed_to_include[ta.eventable_id] = ta if num_removes > num_adds synapses_removed_to_include[ta.eventable_id] = ta if num_removes > num_adds && SynapsePolicy.new(user, ta.eventable).show?
end end
if synapses_removed_to_include.keys.length > 0 if synapses_removed_to_include.keys.length > 0
results[:stats][:synapses_removed] = synapses_removed_to_include.keys.length results[:stats][:synapses_removed] = synapses_removed_to_include.keys.length

View file

@ -262,6 +262,76 @@ RSpec.describe MapActivityService do
end end
end end
it 'handles permissions of topics and synapses' do
old_topic = nil
old_private_topic = nil
old_synapse = nil
old_private_synapse = nil
old_topic_mapping = nil
old_synapse_mapping = nil
old_private_topic_mapping = nil
old_private_synapse_mapping = nil
new_topic = nil
new_private_topic = nil
new_synapse = nil
new_private_synapse = nil
Timecop.freeze(2.days.ago) do
old_topic = create(:topic, permission: 'commons', user: other_user)
old_topic_mapping = create(:mapping, map: map, mappable: old_topic, user: other_user)
old_synapse = create(:synapse, permission: 'commons', user: other_user)
old_synapse_mapping = create(:mapping, map: map, mappable: old_synapse, user: other_user)
old_private_topic = create(:topic, permission: 'private', user: other_user)
old_private_topic_mapping = create(:mapping, map: map, mappable: old_private_topic, user: other_user)
old_private_synapse = create(:synapse, permission: 'private', user: other_user)
old_private_synapse_mapping = create(:mapping, map: map, mappable: old_private_synapse, user: other_user)
end
Timecop.return
Timecop.freeze(10.hours.ago) do
# ADDITIONS
# visible
new_topic = create(:topic, permission: 'commons', user: other_user)
create(:mapping, map: map, mappable: new_topic, user: other_user)
new_synapse = create(:synapse, permission: 'commons', user: other_user)
create(:mapping, map: map, mappable: new_synapse, user: other_user)
# not visible
new_private_topic = create(:topic, permission: 'private', user: other_user)
create(:mapping, map: map, mappable: new_private_topic, user: other_user)
new_private_synapse = create(:synapse, permission: 'private', user: other_user)
create(:mapping, map: map, mappable: new_private_synapse, user: other_user)
# REMOVALS
# visible
old_topic_mapping.updated_by = other_user
old_topic_mapping.destroy
old_synapse_mapping.updated_by = other_user
old_synapse_mapping.destroy
# not visible
old_private_topic_mapping.updated_by = other_user
old_private_topic_mapping.destroy
old_private_synapse_mapping.updated_by = other_user
old_private_synapse_mapping.destroy
end
Timecop.return
response = MapActivityService.summarize_data(map, email_user)
expect(response[:stats]).to eq({
topics_added: 1,
synapses_added: 1,
topics_removed: 1,
synapses_removed: 1
})
expect(response[:topics_added].map(&:eventable_id)).to include(new_topic.id)
expect(response[:topics_added].map(&:eventable_id)).to_not include(new_private_topic.id)
expect(response[:synapses_added].map(&:eventable_id)).to include(new_synapse.id)
expect(response[:synapses_added].map(&:eventable_id)).to_not include(new_private_synapse.id)
expect(response[:topics_removed].map(&:eventable_id)).to include(old_topic.id)
expect(response[:topics_removed].map(&:eventable_id)).to_not include(old_private_topic.id)
expect(response[:synapses_removed].map(&:eventable_id)).to include(old_synapse.id)
expect(response[:synapses_removed].map(&:eventable_id)).to_not include(old_private_synapse.id)
end
describe 'messages in the map chat' do describe 'messages in the map chat' do
it 'counts messages within the last 24 hours' do it 'counts messages within the last 24 hours' do
create(:message, resource: map, created_at: 6.hours.ago) create(:message, resource: map, created_at: 6.hours.ago)