66 lines
2.0 KiB
Ruby
66 lines
2.0 KiB
Ruby
|
module CartoDB
|
||
|
module Visualization
|
||
|
class RedisVizjsonCache
|
||
|
|
||
|
# This needs to be changed whenever there're changes in the code that require invalidation of old keys
|
||
|
VERSION = '1'.freeze
|
||
|
|
||
|
def initialize(redis_cache = $tables_metadata, vizjson_version = 2)
|
||
|
@redis = redis_cache
|
||
|
@vizjson_version = vizjson_version
|
||
|
end
|
||
|
|
||
|
def cached(visualization_id, https_flag = false, vizjson_version = @vizjson_version)
|
||
|
key = key(visualization_id, https_flag, vizjson_version)
|
||
|
value = redis.get(key)
|
||
|
if value.present?
|
||
|
JSON.parse(value, symbolize_names: true)
|
||
|
else
|
||
|
result = yield
|
||
|
serialized = JSON.generate(result)
|
||
|
redis.setex(key, 24.hours.to_i, serialized)
|
||
|
result
|
||
|
end
|
||
|
end
|
||
|
|
||
|
def invalidate(visualization_id)
|
||
|
purge_ids([visualization_id])
|
||
|
end
|
||
|
|
||
|
def key(visualization_id, https_flag = false, vizjson_version = @vizjson_version, domain = CartoDB.session_domain)
|
||
|
"visualization:#{visualization_id}:vizjson#{VIZJSON_VERSION_KEY[vizjson_version]}:#{VERSION}:" \
|
||
|
"#{https_flag ? 'https' : 'http'}:#{domain}"
|
||
|
end
|
||
|
|
||
|
def purge(vizs)
|
||
|
purge_ids(vizs.map(&:id))
|
||
|
end
|
||
|
|
||
|
private
|
||
|
|
||
|
def purge_ids(ids)
|
||
|
return unless ids.count > 0
|
||
|
keys = VIZJSON_VERSION_KEY.keys.map { |vizjson_version|
|
||
|
Cartodb.config.fetch(:vizjson_cache_domains, [CartoDB.session_domain]).map { |domain|
|
||
|
ids.map { |id| [key(id, false, vizjson_version), key(id, true, vizjson_version, domain)] }.flatten
|
||
|
}.flatten
|
||
|
}.flatten
|
||
|
redis.del keys
|
||
|
end
|
||
|
|
||
|
# Needs to know every version because of invalidation
|
||
|
VIZJSON_VERSION_KEY = {
|
||
|
2 => '', # VizJSON v2
|
||
|
3 => '3', # VizJSON v3
|
||
|
'3n' => '3n', # VizJSON v3 forcing named maps (needed for embeds, see #7093)
|
||
|
'3a' => '3a' # VizJSON v3 forcing anonymoys maps (needed for editor, see #7150)
|
||
|
}.freeze
|
||
|
|
||
|
def redis
|
||
|
@redis
|
||
|
end
|
||
|
|
||
|
end
|
||
|
end
|
||
|
end
|