jsonapi-suite / jsonapi_compliable

MIT License
20 stars 35 forks source link

Add a rollback method on resources to handle manually defining a transaction #137

Open Startouf opened 6 years ago

Startouf commented 6 years ago

When dealing with transactionless operations (MongoDB, ElasticSearch, etc.) it is not possible to redefine the transaction, yet it would make sense to have a rollback method that would yield the model that was created or updated (ie the return of the create/update method.

Based on that, it would become possible to either destroy or just rollback the changes manually (ActiveModel has a nice previous_changes builtin method)

class FooResource

  def create(attributes)
    Foo.create(attributes)
  end

  def rollback(resource:, method:)
    if method == :create
      resource.destroy
    else
      resource.update_attributes(resource.previous_changes)
    end 
  end

The idea being that the rollback method would be fired automatically if there is for example a failure while persisting the related resources / sideposting

Startouf commented 6 years ago

Hum... handled by https://github.com/jsonapi-suite/jsonapi_compliable/pull/72#pullrequestreview-105206046 ?

richmolj commented 6 years ago

I would definitely like this functionality, and I think the linked comment by @wadetandy is the way to go. I'm currently working on transitioning this to graphiti (beta next week) if you'd like to submit a PR there (otherwise will be a little while until I can get to it). Specs here.