class Graphiti::ResourceProxy

Attributes

cache[R]
cache_expires_in[R]
payload[R]
query[R]
resource[R]
scope[R]

Public Class Methods

new(resource, scope, query, payload: nil, single: false, raise_on_missing: false, cache: nil, cache_expires_in: nil) click to toggle source
# 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)

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

Public Instance Methods

[](val) click to toggle source
# File lib/graphiti/resource_proxy.rb, line 42
def [](val)
  data[val]
end
as_graphql(options = {}) click to toggle source
# File lib/graphiti/resource_proxy.rb, line 73
def as_graphql(options = {})
  Renderer.new(self, options).as_graphql
end
as_json(options = {}) click to toggle source
# File lib/graphiti/resource_proxy.rb, line 61
def as_json(options = {})
  Renderer.new(self, options).as_json
end
cache?() click to toggle source
# File lib/graphiti/resource_proxy.rb, line 24
def cache?
  !!@cache
end
Also aliased as: cached?
cache_key() click to toggle source
# File lib/graphiti/resource_proxy.rb, line 202
def cache_key
  ActiveSupport::Cache.expand_cache_key([@scope.cache_key, @query.cache_key])
end
cache_key_with_version() click to toggle source
# File lib/graphiti/resource_proxy.rb, line 206
def cache_key_with_version
  ActiveSupport::Cache.expand_cache_key([@scope.cache_key_with_version, @query.cache_key])
end
cached?()
Alias for: cache?
data() click to toggle source
# File lib/graphiti/resource_proxy.rb, line 77
def data
  @data ||= begin
    records = @scope.resolve
    if records.empty? && raise_on_missing?
      raise Graphiti::Errors::RecordNotFound
    end
    records = records[0] if single?
    records
  end
end
Also aliased as: to_a, resolve_data
debug_requested?() click to toggle source
# File lib/graphiti/resource_proxy.rb, line 190
def debug_requested?
  query.debug_requested?
end
destroy() click to toggle source
# File lib/graphiti/resource_proxy.rb, line 150
def destroy
  resolve_data
  transaction_response = @resource.transaction do
    metadata = {method: :destroy}
    model = @resource.destroy(@query.filters[:id], metadata)
    model.instance_variable_set(:@__serializer_klass, @resource.serializer)
    @resource.after_graph_persist(model, metadata)
    validator = ::Graphiti::Util::ValidationResponse.new \
      model, @payload
    validator.validate!
    @resource.before_commit(model, metadata)

    {result: validator}
  end
  @data, success = transaction_response[:result].to_a
  success
end
each(&blk) click to toggle source
# File lib/graphiti/resource_proxy.rb, line 94
def each(&blk)
  to_a.each(&blk)
end
errors() click to toggle source
# File lib/graphiti/resource_proxy.rb, line 38
def errors
  data.errors
end
etag() click to toggle source
# File lib/graphiti/resource_proxy.rb, line 198
def etag
  "W/#{ActiveSupport::Digest.hexdigest(cache_key_with_version.to_s)}"
end
extra_fields() click to toggle source
# File lib/graphiti/resource_proxy.rb, line 186
def extra_fields
  query.extra_fields
end
fields() click to toggle source
# File lib/graphiti/resource_proxy.rb, line 182
def fields
  query.fields
end
include_hash() click to toggle source
# File lib/graphiti/resource_proxy.rb, line 175
def include_hash
  @include_hash ||= begin
    base = @payload ? @payload.include_hash : {}
    base.deep_merge(@query.include_hash)
  end
end
jsonapi_render_options(opts = {}) click to toggle source
# File lib/graphiti/resource_proxy.rb, line 46
def jsonapi_render_options(opts = {})
  opts[:expose] ||= {}
  opts[:expose][:context] = Graphiti.context[:object]
  opts
end
meta() click to toggle source
# File lib/graphiti/resource_proxy.rb, line 90
def meta
  @meta ||= data.respond_to?(:meta) ? data.meta : {}
end
pagination() click to toggle source
# File lib/graphiti/resource_proxy.rb, line 116
def pagination
  @pagination ||= Delegates::Pagination.new(self)
end
raise_on_missing?() click to toggle source
# File lib/graphiti/resource_proxy.rb, line 34
def raise_on_missing?
  !!@raise_on_missing
end
resolve_data()
Alias for: data
save(action: :create) click to toggle source
# File lib/graphiti/resource_proxy.rb, line 120
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?() click to toggle source
# File lib/graphiti/resource_proxy.rb, line 30
def single?
  !!@single
end
stats() click to toggle source
# File lib/graphiti/resource_proxy.rb, line 98
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_a()
Alias for: data
to_graphql(options = {}) click to toggle source
# File lib/graphiti/resource_proxy.rb, line 69
def to_graphql(options = {})
  Renderer.new(self, options).to_graphql
end
to_json(options = {}) click to toggle source
# File lib/graphiti/resource_proxy.rb, line 57
def to_json(options = {})
  Renderer.new(self, options).to_json
end
to_jsonapi(options = {}) click to toggle source
# File lib/graphiti/resource_proxy.rb, line 52
def to_jsonapi(options = {})
  options = jsonapi_render_options(options)
  Renderer.new(self, options).to_jsonapi
end
to_xml(options = {}) click to toggle source
# File lib/graphiti/resource_proxy.rb, line 65
def to_xml(options = {})
  Renderer.new(self, options).to_xml
end
update() click to toggle source
# File lib/graphiti/resource_proxy.rb, line 168
def update
  resolve_data
  save(action: :update)
end
Also aliased as: update_attributes
update_attributes()
Alias for: update
updated_at() click to toggle source
# File lib/graphiti/resource_proxy.rb, line 194
def updated_at
  @scope.updated_at
end

Private Instance Methods

persist() { || ... } click to toggle source
# File lib/graphiti/resource_proxy.rb, line 212
def persist
  transaction_response = @resource.transaction do
    ::Graphiti::Util::TransactionHooksRecorder.record do
      model = yield
      ::Graphiti::Util::TransactionHooksRecorder.run_graph_persist_hooks
      validator = ::Graphiti::Util::ValidationResponse.new \
        model, @payload
      validator.validate!
      validator
    end
  end

  _data, success = transaction_response[:result].to_a
  if success
    transaction_response[:after_commit_hooks].each do |hook|
      hook.call
    end
  end

  transaction_response[:result]
end