Class: Graphiti::ResourceProxy

Inherits:
Object
  • Object
show all
Includes:
Enumerable
Defined in:
lib/graphiti/resource_proxy.rb

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(resource, scope, query, payload: nil, single: false, raise_on_missing: false, cache: nil, cache_expires_in: nil, cache_tag: nil) ⇒ ResourceProxy

Returns a new instance of ResourceProxy.



7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
# File 'lib/graphiti/resource_proxy.rb', line 7

def initialize(
  resource,
  scope,
  query,
  payload: nil,
  single: false,
  raise_on_missing: false,
  cache: nil,
  cache_expires_in: nil,
  cache_tag: nil
)

  @resource = resource
  @scope = scope
  @query = query
  @payload = payload
  @single = single
  @raise_on_missing = raise_on_missing
  @cache = cache
  @cache_expires_in = cache_expires_in
  @cache_tag = cache_tag
end

Instance Attribute Details

#cacheObject (readonly)

Returns the value of attribute cache.



5
6
7
# File 'lib/graphiti/resource_proxy.rb', line 5

def cache
  @cache
end

#cache_expires_inObject (readonly)

Returns the value of attribute cache_expires_in.



5
6
7
# File 'lib/graphiti/resource_proxy.rb', line 5

def cache_expires_in
  @cache_expires_in
end

#cache_tagObject (readonly)

Returns the value of attribute cache_tag.



5
6
7
# File 'lib/graphiti/resource_proxy.rb', line 5

def cache_tag
  @cache_tag
end

#payloadObject (readonly)

Returns the value of attribute payload.



5
6
7
# File 'lib/graphiti/resource_proxy.rb', line 5

def payload
  @payload
end

#queryObject (readonly)

Returns the value of attribute query.



5
6
7
# File 'lib/graphiti/resource_proxy.rb', line 5

def query
  @query
end

#resourceObject (readonly)

Returns the value of attribute resource.



5
6
7
# File 'lib/graphiti/resource_proxy.rb', line 5

def resource
  @resource
end

#scopeObject (readonly)

Returns the value of attribute scope.



5
6
7
# File 'lib/graphiti/resource_proxy.rb', line 5

def scope
  @scope
end

Instance Method Details

#[](val) ⇒ Object



48
49
50
# File 'lib/graphiti/resource_proxy.rb', line 48

def [](val)
  data[val]
end

#as_graphql(options = {}) ⇒ Object



79
80
81
# File 'lib/graphiti/resource_proxy.rb', line 79

def as_graphql(options = {})
  Renderer.new(self, options).as_graphql
end

#as_json(options = {}) ⇒ Object



67
68
69
# File 'lib/graphiti/resource_proxy.rb', line 67

def as_json(options = {})
  Renderer.new(self, options).as_json
end

#cache?Boolean Also known as: cached?

Returns:

  • (Boolean)


30
31
32
# File 'lib/graphiti/resource_proxy.rb', line 30

def cache?
  !!@cache
end

#cache_keyObject



222
223
224
225
226
227
228
229
230
# File 'lib/graphiti/resource_proxy.rb', line 222

def cache_key
  ActiveSupport::Cache.expand_cache_key(
    [
      @scope.cache_key,
      @query.cache_key,
      resource_cache_tag
    ].compact_blank
  )
end

#cache_key_with_versionObject



232
233
234
235
236
237
238
239
240
# File 'lib/graphiti/resource_proxy.rb', line 232

def cache_key_with_version
  ActiveSupport::Cache.expand_cache_key(
    [
      @scope.cache_key_with_version,
      @query.cache_key,
      resource_cache_tag
    ].compact_blank
  )
end

#dataObject Also known as: to_a, resolve_data



83
84
85
86
87
88
89
90
91
# File 'lib/graphiti/resource_proxy.rb', line 83

def data
  @data ||= begin
    records = @scope.resolve
    raise Graphiti::Errors::RecordNotFound if records.empty? && raise_on_missing?

    records = records[0] if single?
    records
  end
end

#debug_requested?Boolean

Returns:

  • (Boolean)


204
205
206
# File 'lib/graphiti/resource_proxy.rb', line 204

def debug_requested?
  query.debug_requested?
end

#destroyObject



164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
# File 'lib/graphiti/resource_proxy.rb', line 164

def destroy
  resolve_data
  transaction_response = @resource.transaction do
     = {method: :destroy}
    model = @resource.destroy(@query.filters[:id], )
    model.instance_variable_set(:@__serializer_klass, @resource.serializer)
    @resource.after_graph_persist(model, )
    validator = ::Graphiti::Util::ValidationResponse.new \
      model, @payload
    validator.validate!
    @resource.before_commit(model, )

    {result: validator}
  end
  @data, success = transaction_response[:result].to_a
  success
end

#each(&blk) ⇒ Object



108
109
110
# File 'lib/graphiti/resource_proxy.rb', line 108

def each(&blk)
  to_a.each(&blk)
end

#errorsObject



44
45
46
# File 'lib/graphiti/resource_proxy.rb', line 44

def errors
  data.errors
end

#etagObject



212
213
214
# File 'lib/graphiti/resource_proxy.rb', line 212

def etag
  "W/#{ActiveSupport::Digest.hexdigest(cache_key_with_version.to_s)}"
end

#extra_fieldsObject



200
201
202
# File 'lib/graphiti/resource_proxy.rb', line 200

def extra_fields
  query.extra_fields
end

#fieldsObject



196
197
198
# File 'lib/graphiti/resource_proxy.rb', line 196

def fields
  query.fields
end

#future_resolve_dataObject



95
96
97
98
99
100
101
102
# File 'lib/graphiti/resource_proxy.rb', line 95

def future_resolve_data
  @scope.future_resolve.then do |records|
    raise Graphiti::Errors::RecordNotFound if records.empty? && raise_on_missing?

    records = records[0] if single?
    @data = records
  end
end

#include_hashObject



189
190
191
192
193
194
# File 'lib/graphiti/resource_proxy.rb', line 189

def include_hash
  @include_hash ||= begin
    base = @payload ? @payload.include_hash : {}
    base.deep_merge(@query.include_hash)
  end
end

#jsonapi_render_options(opts = {}) ⇒ Object



52
53
54
55
56
# File 'lib/graphiti/resource_proxy.rb', line 52

def jsonapi_render_options(opts = {})
  opts[:expose] ||= {}
  opts[:expose][:context] = Graphiti.context[:object]
  opts
end

#metaObject



104
105
106
# File 'lib/graphiti/resource_proxy.rb', line 104

def meta
  @meta ||= data.respond_to?(:meta) ? data.meta : {}
end

#paginationObject



130
131
132
# File 'lib/graphiti/resource_proxy.rb', line 130

def pagination
  @pagination ||= Delegates::Pagination.new(self)
end

#raise_on_missing?Boolean

Returns:

  • (Boolean)


40
41
42
# File 'lib/graphiti/resource_proxy.rb', line 40

def raise_on_missing?
  !!@raise_on_missing
end

#resource_cache_tagObject



216
217
218
219
220
# File 'lib/graphiti/resource_proxy.rb', line 216

def resource_cache_tag
  return unless @cache_tag.present? && @resource.respond_to?(@cache_tag)

  @resource.try(@cache_tag)
end

#save(action: :create) ⇒ Object



134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
# File 'lib/graphiti/resource_proxy.rb', line 134

def save(action: :create)
  # TODO: remove this. Only used for persisting many-to-many with AR
  # (see activerecord adapter)
  original = Graphiti.context[:namespace]
  begin
    Graphiti.context[:namespace] = action
    ::Graphiti::RequestValidator.new(@resource, @payload.params, action).validate!
    validator = persist {
      @resource.persist_with_relationships \
        @payload.meta(action: action),
        @payload.attributes,
        @payload.relationships
    }
  ensure
    Graphiti.context[:namespace] = original
  end
  @data, success = validator.to_a

  if success
    # If the context namespace is `update` or `create`, certain
    # adapters will cause N+1 validation calls, so lets explicitly
    # switch to a lookup context.
    Graphiti.with_context(Graphiti.context[:object], :show) do
      @scope.resolve_sideloads([@data])
    end
  end

  success
end

#single?Boolean

Returns:

  • (Boolean)


36
37
38
# File 'lib/graphiti/resource_proxy.rb', line 36

def single?
  !!@single
end

#statsObject



112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
# File 'lib/graphiti/resource_proxy.rb', line 112

def stats
  @stats ||= if @query.hash[:stats]
    scope = @scope.unpaginated_object
    if resource.adapter.can_group?
      if (group = @query.hash[:stats].delete(:group_by))
        scope = resource.adapter.group(scope, group[0])
      end
    end
    payload = Stats::Payload.new @resource,
      @query,
      scope,
      data
    payload.generate
  else
    {}
  end
end

#to_graphql(options = {}) ⇒ Object



75
76
77
# File 'lib/graphiti/resource_proxy.rb', line 75

def to_graphql(options = {})
  Renderer.new(self, options).to_graphql
end

#to_json(options = {}) ⇒ Object



63
64
65
# File 'lib/graphiti/resource_proxy.rb', line 63

def to_json(options = {})
  Renderer.new(self, options).to_json
end

#to_jsonapi(options = {}) ⇒ Object



58
59
60
61
# File 'lib/graphiti/resource_proxy.rb', line 58

def to_jsonapi(options = {})
  options = jsonapi_render_options(options)
  Renderer.new(self, options).to_jsonapi
end

#to_xml(options = {}) ⇒ Object



71
72
73
# File 'lib/graphiti/resource_proxy.rb', line 71

def to_xml(options = {})
  Renderer.new(self, options).to_xml
end

#updateObject Also known as: update_attributes



182
183
184
185
# File 'lib/graphiti/resource_proxy.rb', line 182

def update
  resolve_data
  save(action: :update)
end

#updated_atObject



208
209
210
# File 'lib/graphiti/resource_proxy.rb', line 208

def updated_at
  @scope.updated_at
end