diff --git a/app/services/map_activity_service.rb b/app/services/map_activity_service.rb index b443099e..51424b68 100644 --- a/app/services/map_activity_service.rb +++ b/app/services/map_activity_service.rb @@ -11,6 +11,9 @@ class MapActivityService 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) .where("created_at > ? AND created_at < ?", since, until_moment) .where.not(user: user).count @@ -20,6 +23,7 @@ class MapActivityService moved_count = Event.where(kind: 'topic_moved_on_map', map: map) .where("created_at > ? AND created_at < ?", since, until_moment) + .where(eventable_id: scoped_topic_ids) .where.not(user: user).group(:eventable_id).count if moved_count.keys.length > 0 results[:stats][:topics_moved] = moved_count.keys.length @@ -39,7 +43,7 @@ class MapActivityService topics_added_events.each do |ta| num_adds = topics_added_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 if topics_added_to_include.keys.length > 0 results[:stats][:topics_added] = topics_added_to_include.keys.length @@ -50,7 +54,7 @@ class MapActivityService topics_removed_events.each do |ta| num_adds = topics_added_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 if topics_removed_to_include.keys.length > 0 results[:stats][:topics_removed] = topics_removed_to_include.keys.length @@ -71,7 +75,7 @@ class MapActivityService synapses_added_events.each do |ta| num_adds = synapses_added_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 if synapses_added_to_include.keys.length > 0 results[:stats][:synapses_added] = synapses_added_to_include.keys.length @@ -82,7 +86,7 @@ class MapActivityService synapses_removed_events.each do |ta| num_adds = synapses_added_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 if synapses_removed_to_include.keys.length > 0 results[:stats][:synapses_removed] = synapses_removed_to_include.keys.length diff --git a/spec/services/map_activity_service.rb b/spec/services/map_activity_service.rb index 172dcf07..05122da2 100644 --- a/spec/services/map_activity_service.rb +++ b/spec/services/map_activity_service.rb @@ -262,6 +262,76 @@ RSpec.describe MapActivityService do 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 it 'counts messages within the last 24 hours' do create(:message, resource: map, created_at: 6.hours.ago)