# frozen_string_literal: true

# Interface to the Redis-backed cache store
module Gitlab
  class RepositoryCache
    attr_reader :repository, :namespace, :backend

    def initialize(repository, extra_namespace: nil, backend: Rails.cache)
      @repository = repository
      @namespace = "#{repository.full_path}:#{repository.project.id}"
      @namespace = "#{@namespace}:#{extra_namespace}" if extra_namespace
      @backend = backend
    end

    def cache_key(type)
      "#{type}:#{namespace}"
    end

    def expire(key)
      backend.delete(cache_key(key))
    end

    def fetch(key, &block)
      backend.fetch(cache_key(key), &block)
    end

    def exist?(key)
      backend.exist?(cache_key(key))
    end

    def read(key)
      backend.read(cache_key(key))
    end

    def write(key, value)
      backend.write(cache_key(key), value)
    end

    def fetch_without_caching_false(key, &block)
      value = read(key)
      return value if value

      value = yield

      # Don't cache false values
      write(key, value) if value

      value
    end
  end
end

# frozen_string_literal: true

# Interface to the Redis-backed cache store
module Gitlab
  class RepositoryCache
    attr_reader :repository, :namespace, :backend

    def initialize(repository, extra_namespace: nil, backend: Rails.cache)
      @repository = repository
      @namespace = "project:#{repository.project.id}"
      @namespace = "#{@namespace}:#{extra_namespace}" if extra_namespace
      @backend = backend
    end

    def cache_key(type)
      "#{namespace}:#{type}"
    end

    def expire(key)
      backend.delete(cache_key(key))
    end

    def fetch(key, &block)
      backend.fetch(cache_key(key), &block)
    end

    def exist?(key)
      backend.exist?(cache_key(key))
    end

    def read(key)
      backend.read(cache_key(key))
    end

    def write(key, value)
      backend.write(cache_key(key), value)
    end

    def fetch_without_caching_false(key, &block)
      value = read(key)
      return value if value

      value = yield

      # Don't cache false values
      write(key, value) if value

      value
    end
  end
end

Change project cache key to depend on ID instead of full path
Change project cache key to depend on ID instead of full path

Previously, project cache used as part of the namespace the `full_path`,
which included namespace and project slug.

That meant that anytime a project was renamed or transfered to a
different namespace, we would lose the existing cache. This is not
necessary, nor desired.

I've prefixed cache key with `project:` to make it easy to find in redis
if necessary as well as make it possible to purge all project related
cache.

I've also switched the cache key type to go after the initial namespace
and not before.
