Module: Graphiti::Resource::Persistence

Extended by:
ActiveSupport::Concern
Included in:
Graphiti::Resource
Defined in:
lib/graphiti/resource/persistence.rb

Instance Attribute Summary collapse

Instance Method Summary collapse

Instance Attribute Details

#assigned_model ⇒ Object (readonly)

The model built by a prior ResourceProxy#assign_attributes, present for the duration of the save that persists it



106
107
108
# File 'lib/graphiti/resource/persistence.rb', line 106

def assigned_model
  @assigned_model
end

Instance Method Details

#assign(assign_params, meta = nil, action_name = nil, model_instance: nil) ⇒ Object

model_instance is the already-built model from a previous #assign (see ResourceProxy#assign_attributes). When given, attributes are applied to it rather than to a freshly built/found model.



75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
# File 'lib/graphiti/resource/persistence.rb', line 75

def assign(assign_params, meta = nil, action_name = nil, model_instance: nil)
  # Only update strips :id (it identifies the record to find) - a create
  # payload may legitimately carry a client-supplied id to assign.
  if action_name == :update
    id = assign_params[:id]
    assign_params = assign_params.except(:id)
  elsif assign_params.key?(:id) && (public_id = self.class.config[:public_id])
    assign_params = assign_params.except(:id).merge(public_id => assign_params[:id])
  elsif assign_params.key?(:id) && self.class.config[:public_id_decode]
    primary_key = self.class.decode_public_id(assign_params[:id])
    raise Errors::ConflictRequest, unresolvable_id_errors(assign_params) if primary_key.nil?
    assign_params = assign_params.except(:id).merge(self.class.model_primary_key => primary_key)
  end

  assign_params = decode_foreign_keys(assign_params)

  run_callbacks :attributes, action_name, assign_params, meta do |params|
    model_instance ||= if action_name == :update
      self.class._find(id: id).data
    else
      call_with_meta(:build, model, meta)
    end
    call_with_meta(:assign_attributes, model_instance, params, meta)
    model_instance
  end

  model_instance
end

#assign_attributes(model_instance, update_params, meta = nil) ⇒ Object



181
182
183
# File 'lib/graphiti/resource/persistence.rb', line 181

def assign_attributes(model_instance, update_params, meta = nil)
  adapter.assign_attributes(model_instance, update_params)
end

#build(model, meta = nil) ⇒ Object



177
178
179
# File 'lib/graphiti/resource/persistence.rb', line 177

def build(model, meta = nil)
  adapter.build(model)
end

#create(create_params, meta = nil) ⇒ Object

Attributes are assigned before the persistence callbacks fire, so around_persistence receives the assigned model - its pre-yield position is the last chance to touch the model before save, inside the transaction. Modify attributes in before_attributes instead.



120
121
122
123
124
125
126
127
128
129
130
131
132
# File 'lib/graphiti/resource/persistence.rb', line 120

def create(create_params, meta = nil)
  model_instance = assigned_model || assign(create_params, meta, :create)

  run_callbacks :persistence, :create, model_instance, meta do
    run_callbacks :save, :create, model_instance, meta do
      model_instance = call_with_meta(:save, model_instance, meta)
    end

    model_instance
  end

  model_instance
end

#decode_foreign_keys(assign_params) ⇒ Object



134
135
136
137
138
139
140
141
142
143
144
145
146
147
# File 'lib/graphiti/resource/persistence.rb', line 134

def decode_foreign_keys(assign_params)
  return assign_params unless Graphiti.public_ids_declared?

  assign_params.each_with_object({}) do |(name, value), decoded|
    source = (name == :id || value.nil?) ? nil : self.class.public_id_source_for(name)
    decoded[name] = if value.is_a?(Util::InternalParam)
      value.value
    elsif source
      source.decode_public_id(value.to_s) or raise Errors::RecordNotFound.new(source.type, value, name)
    else
      value
    end
  end
end

#delete(model_instance, meta = nil) ⇒ Object



189
190
191
# File 'lib/graphiti/resource/persistence.rb', line 189

def delete(model_instance, meta = nil)
  adapter.destroy(model_instance)
end

#destroy(id, meta = nil) ⇒ Object



169
170
171
172
173
174
175
# File 'lib/graphiti/resource/persistence.rb', line 169

def destroy(id, meta = nil)
  model_instance = self.class._find(id: id).data
  run_callbacks :destroy, :destroy, model_instance, meta do
    call_with_meta(:delete, model_instance, meta)
  end
  model_instance
end

#save(model_instance, meta = nil) ⇒ Object



185
186
187
# File 'lib/graphiti/resource/persistence.rb', line 185

def save(model_instance, meta = nil)
  adapter.save(model_instance)
end

#unresolvable_id_errors(assign_params) ⇒ Object



149
150
151
152
153
# File 'lib/graphiti/resource/persistence.rb', line 149

def unresolvable_id_errors(assign_params)
  Util::SimpleErrors.new(assign_params).tap do |errors|
    errors.add("data.id", :unresolvable, message: "does not name a record of this resource")
  end
end

#update(update_params, meta = nil) ⇒ Object



155
156
157
158
159
160
161
162
163
164
165
166
167
# File 'lib/graphiti/resource/persistence.rb', line 155

def update(update_params, meta = nil)
  model_instance = assigned_model || assign(update_params, meta, :update)

  run_callbacks :persistence, :update, model_instance, meta do
    run_callbacks :save, :update, model_instance, meta do
      model_instance = call_with_meta(:save, model_instance, meta)
    end

    model_instance
  end

  model_instance
end

#with_assigned_model(model) ⇒ Object

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.



109
110
111
112
113
114
# File 'lib/graphiti/resource/persistence.rb', line 109

def with_assigned_model(model)
  @assigned_model = model
  yield
ensure
  @assigned_model = nil
end