summaryrefslogtreecommitdiff
path: root/lib/gitlab/markdown_cache/redis/extension.rb
blob: af3237f4ba65cff1d9eb734d04f7d6d26e0d2dcb (plain)
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_attributes
          {}
        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