CartoDB::Visualization::VizJSON removed from vizjson 3 presenter

pull/6977/head
Juan Ignacio Sánchez Lara 9 years ago
parent 05b910e1e6
commit 7885dda2e6

@ -232,6 +232,7 @@ SPEC_HELPER_MIN_SPECS = \
spec/requests/api/json/maps_controller_spec.rb \
spec/requests/carto/api/analyses_controller_spec.rb \
spec/requests/carto/api/maps_controller_spec.rb \
spec/requests/carto/api/vizjson3_presenter_spec.rb \
spec/requests/admin/users_controller_spec.rb \
spec/lib/carto/strong_password_validator_spec.rb \
$(NULL)

@ -3,11 +3,28 @@ require_dependency 'carto/api/layer_vizjson_adapter'
module Carto
module Api
class VizJSON3Presenter
# Forwarding as a development transient tool
extend Forwardable
delegate [:layer_group_for, :named_map_layer_group_for, :other_layers_for,
:visualization, :map, :layers_for, :configuration,
:clean_description, :bounds_from, :all_layers_for,
:layers_for, :layer_group_for_named_map, :basemap_layer_for,
:non_basemap_base_layers_for, :overlays_for, :children_for,
:ordered_overlays_for, :default_options, :auth_tokens_for] => :old_vizjson
def old_vizjson
@old_vizjson
end
def create_old_vizjson(options = {})
CartoDB::Visualization::VizJSON.new(Carto::Api::VisualizationVizJSONAdapter.new(@visualization, @redis_cache), options, Cartodb.config)
end
def initialize(visualization, redis_cache = $tables_metadata)
def initialize(visualization, redis_cache = $tables_metadata, redis_vizjson_cache = CartoDB::Visualization::RedisVizjsonCache.new(redis_cache, '3'))
@visualization = visualization
@redis_cache = redis_cache
@redis_vizjson_cache = CartoDB::Visualization::RedisVizjsonCache.new(redis_cache)
@redis_vizjson_cache = redis_vizjson_cache
end
def to_vizjson(vector: false, **options)
@ -30,6 +47,8 @@ module Carto
private
VIZJSON_3_VERSION = '3.0.0'.freeze
def calculate_vizjson(options={})
vizjson_options = {
full: false,
@ -38,7 +57,45 @@ module Carto
user: user,
viewer_user: user
}.merge(options)
CartoDB::Visualization::VizJSON.new(Carto::Api::VisualizationVizJSONAdapter.new(@visualization, @redis_cache), vizjson_options, Cartodb.config).to_poro
@old_vizjson = create_old_vizjson(vizjson_options)
to_poro(vizjson_options)
end
def to_poro(options)
poro_data = {
id: visualization.id,
version: VIZJSON_3_VERSION,
title: visualization.qualified_name(@user),
likes: visualization.likes.count,
description: visualization.description_html_safe,
scrollwheel: map.scrollwheel,
legends: map.legends,
url: options.delete(:url),
map_provider: map.provider,
bounds: bounds_from(map),
center: map.center,
zoom: map.zoom,
updated_at: map.viz_updated_at,
layers: layers_for(visualization),
overlays: overlays_for(visualization),
prev: visualization.prev_id,
next: visualization.next_id,
transition_options: visualization.transition_options
}
auth_tokens = auth_tokens_for(visualization)
poro_data.merge!(auth_tokens: auth_tokens) if auth_tokens.length > 0
children = children_for(visualization)
poro_data.merge!(slides: children) if children.length > 0
unless visualization.parent_id.nil?
poro_data[:title] = visualization.parent.qualified_name(@user)
poro_data[:description] = visualization.parent.description_html_safe
end
poro_data
end
def user

@ -4,14 +4,14 @@ module CartoDB
class RedisVizjsonCache
# This needs to be changed whenever there're changes in the code that require invalidation of old keys
VERSION = '1'
VERSION = '1'.freeze
def initialize(redis_cache=$tables_metadata)
def initialize(redis_cache = $tables_metadata, vizjson_version = 2)
@redis = redis_cache
@vizjson_version = vizjson_version
end
def cached(visualization_id, https_flag=false)
def cached(visualization_id, https_flag = false)
key = key(visualization_id, https_flag)
value = redis.get(key)
if value.present?
@ -25,22 +25,28 @@ module CartoDB
end
def invalidate(visualization_id)
redis.del [key(visualization_id, false), key(visualization_id, true)]
VIZJSON_VERSION_KEY.values.each do |vizjson_version_key|
redis.del [key(visualization_id, false, vizjson_version_key), key(visualization_id, true, vizjson_version_key)]
end
end
def key(visualization_id, https_flag=false)
"visualization:#{visualization_id}:vizjson:#{VERSION}:#{https_flag ? 'https' : 'http'}"
def key(visualization_id, https_flag = false, vizjson_version = @vizjson_version)
"visualization:#{visualization_id}:vizjson#{VIZJSON_VERSION_KEY[vizjson_version]}:#{VERSION}:#{https_flag ? 'https' : 'http'}"
end
def purge(vizs)
return unless vizs.count > 0
keys = vizs.map {|v| [key(v.id, false), key(v.id, true)]}.flatten
keys = vizs.map { |v| [key(v.id, false), key(v.id, true)] }.flatten
redis.del keys
end
private
VIZJSON_VERSION_KEY = {
2 => '',
3 => '3'
}.freeze
def redis
@redis
end

@ -18,7 +18,7 @@ module CartoDB
api_templates_type = options.fetch(:https_request, false) ? 'private' : 'public'
{
{
type: 'layergroup',
options: {
user_name: options.fetch(:user_name),
@ -55,4 +55,3 @@ module CartoDB
end
end
end

@ -1105,7 +1105,7 @@ describe Carto::Api::VisualizationsController do
end
end
# Initially, vizjson3 is a vizjson2 extension, so tests covering vizjson2 also cover vizjson3
# Specific tests for vizjson 3. Common are at `vizjson_shared_examples`
describe '#vizjson3' do
include Fixtures::Layers::Infowindows
include Fixtures::Layers::Tooltips

@ -0,0 +1,66 @@
require 'spec_helper_min'
require 'mock_redis'
describe Carto::Api::VizJSON3Presenter do
include Carto::Factories::Visualizations
include_context 'visualization creation helpers'
before(:all) do
@user_1 = FactoryGirl.create(:carto_user, private_tables_enabled: false)
end
after(:all) do
@user_1.destroy
end
let(:redis_mock) do
MockRedis.new
end
describe 'caching' do
before(:all) do
@map, @table, @table_visualization, @visualization = create_full_visualization(Carto::User.find(@user_1.id))
end
after(:all) do
destroy_full_visualization(@map, @table, @table_visualization, @visualization)
end
it 'uses the redis vizjson cache' do
fake_vizjson = { fake: 'sure!', layers: [] }
cache_mock = mock
cache_mock.stubs(:cached).with(@visualization.id, false).returns(fake_vizjson).twice
presenter = Carto::Api::VizJSON3Presenter.new(@visualization, $tables_metadata, cache_mock)
v1 = presenter.to_vizjson
v2 = presenter.to_vizjson
v1.should eq v2
end
it 'is not overriden by v2 caching' do
v2_presenter = Carto::Api::VizJSONPresenter.new(@visualization, $tables_metadata)
v2_vizjson = v2_presenter.to_vizjson
v3_presenter = Carto::Api::VizJSON3Presenter.new(@visualization, $tables_metadata)
v3_vizjson = v3_presenter.to_vizjson
v3_vizjson.should_not eq v2_vizjson
v2_vizjson[:version].should eq '0.1.0'
v3_vizjson[:version].should eq '3.0.0'
end
it 'does not override v2 caching' do
v3_presenter = Carto::Api::VizJSON3Presenter.new(@visualization, $tables_metadata)
v3_vizjson = v3_presenter.to_vizjson
v2_presenter = Carto::Api::VizJSONPresenter.new(@visualization, $tables_metadata)
v2_vizjson = v2_presenter.to_vizjson
v2_vizjson.should_not eq v3_vizjson
v2_vizjson[:version].should eq '0.1.0'
v3_vizjson[:version].should eq '3.0.0'
end
end
end
Loading…
Cancel
Save