File: cached_resources_processor.rb

package info (click to toggle)
ruby-jsonapi-renderer 0.2.2-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 96 kB
  • sloc: ruby: 324; makefile: 3
file content (47 lines) | stat: -rw-r--r-- 1,328 bytes parent folder | download
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
require 'jsonapi/renderer/resources_processor'

module JSONAPI
  class Renderer
    # @private
    class CachedResourcesProcessor < ResourcesProcessor
      class JSONString < String
        def to_json(*)
          self
        end
      end

      def initialize(cache)
        @cache = cache
      end

      def process_resources
        # NOTE(beauby): This is necessary for cache keys consistency.
        @include_rels = @include_rels.each_with_object({}) do |(k, v), h|
          h[k] = v.to_a.sort!
        end

        [@primary, @included].each do |resources|
          cache_hash = cache_key_map(resources)
          processed_resources = @cache.fetch_multi(*cache_hash.keys) do |key|
            res, include, fields = cache_hash[key]
            json = res.as_jsonapi(include: include, fields: fields).to_json

            JSONString.new(json)
          end

          resources.replace(processed_resources.values)
        end
      end

      def cache_key_map(resources)
        resources.each_with_object({}) do |res, h|
          ri = [res.jsonapi_type, res.jsonapi_id]
          include_dir = @include_rels[ri]
          fields = @fields[ri.first.to_sym]
          h[res.jsonapi_cache_key(include: include_dir, fields: fields)] =
            [res, include_dir, fields]
        end
      end
    end
  end
end