CartoDB::Visualization::Watcher -> Carto::Visualization::Watcher

pull/12363/head
Luis Mayoral 7 years ago
parent e917baf835
commit 8530d7cd74
No known key found for this signature in database
GPG Key ID: 2E0B596CFA8F6EA1

@ -54,7 +54,6 @@ WORKING_SPECS_1 = \
spec/models/visualization/relator_spec.rb \
spec/models/visualization/table_blender_spec.rb \
spec/models/visualization/tags_spec.rb \
spec/models/visualization/watcher_spec.rb \
spec/models/data_import_spec.rb \
spec/models/geocoding_spec.rb \
spec/models/common_data_spec.rb \
@ -78,6 +77,7 @@ WORKING_SPECS_1 = \
spec/helpers/url_validator_spec.rb \
spec/models/carto/data_import_spec.rb \
spec/models/carto/visualization_spec.rb \
spec/models/carto/visualization/watcher_spec.rb \
spec/models/carto/map_spec.rb \
spec/models/carto/template_spec.rb \
spec/models/carto/group_spec.rb \

@ -44,7 +44,7 @@ module Carto
:destroy, :google_maps_static_image]
before_filter :ensure_visualization_owned, only: [:destroy, :google_maps_static_image]
before_filter :ensure_visualization_is_viewable, only: [:add_like, :remove_like, :notify_watching, :list_watching]
before_filter :ensure_visualization_is_viewable, only: [:add_like, :remove_like]
rescue_from Carto::LoadError, with: :rescue_from_carto_error
rescue_from Carto::UUIDParameterFormatError, with: :rescue_from_carto_error
@ -134,6 +134,7 @@ module Carto
rescue Carto::Visualization::AlreadyLikedError
render(text: "You've already liked this visualization", status: 400)
rescue KeyError => exception
CartoDB::Logger.error(exception: exception)
render(text: exception.message, status: 403)
end
@ -146,19 +147,21 @@ module Carto
Carto::Tracking::Events::LikedMap.new(current_viewer_id, event_properties).report
render_jsonp(id: @visualization.id, likes: @visualization.likes.count, liked: false)
rescue KeyError => exception
render(text: exception.message, status: 403)
end
def notify_watching
watcher = CartoDB::Visualization::Watcher.new(current_user, @visualization)
return(head 403) unless @visualization.has_read_permission?(current_viewer)
watcher = Carto::Visualization::Watcher.new(current_user, @visualization)
watcher.notify
render_jsonp(watcher.list)
end
def list_watching
render_jsonp(CartoDB::Visualization::Watcher.new(current_user, @visualization).list)
return(head 403) unless @visualization.has_read_permission?(current_viewer)
render_jsonp(Carto::Visualization::Watcher.new(current_user, @visualization).list)
end
def vizjson2

@ -1,51 +0,0 @@
# encoding: utf-8
require_relative './member'
module CartoDB
module Visualization
class Watcher
# watcher:_orgid_:_vis_id_:_user_id_
KEY_FORMAT = "watcher:%s".freeze
# @params user ::User
# @params visualization CartoDB::Visualization::Member
# @throws CartoDB::Visualization::WatcherError
def initialize(user, visualization, notification_ttl = nil)
raise WatcherError.new('User must belong to an organization') if user.organization.nil?
@user = user
@visualization = visualization
default_ttl = Cartodb.config[:watcher].present? ? Cartodb.config[:watcher].try("fetch", 'ttl', 60) : 60
@notification_ttl = notification_ttl.nil? ? default_ttl : notification_ttl
end
# Notifies that is editing the visualization
# NOTE: Expiration is handled internally by redis
def notify
key = KEY_FORMAT % @visualization.id
$tables_metadata.multi do
$tables_metadata.hset(key, @user.username, current_timestamp + @notification_ttl)
$tables_metadata.expire(key, @notification_ttl)
end
end
# Returns a list of usernames currently editing the visualization
def list
key = KEY_FORMAT % @visualization.id
users_expiry = $tables_metadata.hgetall(key)
now = current_timestamp
users_expiry.select { |_, expiry| expiry.to_i > now }.keys
end
private
def current_timestamp
Time.now.getutc.to_i
end
end
class WatcherError < BaseCartoDBError; end
end
end

@ -1,11 +1,8 @@
# encoding: utf-8
require_relative '../../spec_helper'
require_relative '../../../app/models/visualization/watcher'
include CartoDB::Visualization
describe Watcher do
require_relative '../../../spec_helper'
describe Carto::Visualization::Watcher do
before(:all) do
$tables_metadata.flushdb
end
@ -42,10 +39,10 @@ describe Watcher do
expect {
non_org_user_mock = mock
non_org_user_mock.stubs(:organization).returns(nil)
Watcher.new(non_org_user_mock, visualization_mock)
}.to raise_exception WatcherError
Carto::Visualization::Watcher.new(non_org_user_mock, visualization_mock)
}.to raise_exception Carto::Visualization::WatcherError
u1_watcher = Watcher.new(user1_mock, visualization_mock, watcher_ttl)
u1_watcher = Carto::Visualization::Watcher.new(user1_mock, visualization_mock, watcher_ttl)
u1_watcher.nil?.should eq false
u1_watcher.list.should eq []
@ -58,7 +55,7 @@ describe Watcher do
u1_watcher.notify
u1_watcher.list.should eq [user1_mock.username]
u2_watcher = Watcher.new(user2_mock, visualization_mock, watcher_ttl)
u2_watcher = Carto::Visualization::Watcher.new(user2_mock, visualization_mock, watcher_ttl)
u2_watcher.nil?.should eq false
# All watchers must notify all users
u2_watcher.list.should eq [user1_mock.username]
@ -79,5 +76,4 @@ describe Watcher do
u2_watcher.list.should eq [user2_mock.username]
end
end
end
Loading…
Cancel
Save