extension.rb 1.46 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63
# frozen_string_literal: true

module Gitlab
  module MarkdownCache
    module Redis
      module Extension
        extend ActiveSupport::Concern

        attr_reader :cached_markdown_version

        class_methods do
          def cache_markdown_field(markdown_field, context = {})
            super

            # define the `[field]_html` accessor
            html_field = cached_markdown_fields.html_field(markdown_field)
            define_method(html_field) do
              load_cached_markdown unless markdown_data_loaded?

              instance_variable_get("@#{html_field}")
            end
          end
        end

        private

        def save_markdown(updates)
          markdown_store.save(updates)
        end

        def write_markdown_field(field_name, value)
          instance_variable_set("@#{field_name}", value)
        end

        def markdown_field_changed?(field_name)
          false
        end

        def changed_markdown_fields
          []
        end

        def cached_markdown
          @cached_data ||= markdown_store.read
        end

        def load_cached_markdown
          cached_markdown.each do |field_name, value|
            write_markdown_field(field_name, value)
          end
        end

        def markdown_data_loaded?
          cached_markdown_version.present? || markdown_store.loaded?
        end

        def markdown_store
          @store ||= Gitlab::MarkdownCache::Redis::Store.new(self)
        end
      end
    end
  end
end