Module: Billfold::Identity::ClassMethods

Included in:
ActiveRecordIdentity::ClassMethods
Defined in:
lib/billfold/identity.rb

Instance Method Summary collapse

Instance Method Details

#update_or_create!(attributes = {}) ⇒ Object

### Billfold::Identity.update_or_create!

Updates or creates a ‘Billfold::Identity`.

### Parameters: a single ‘Hash` with the following keys:

* `:provider` -- the name of an OmniAuth provider (e.g. "twitter")
* `:user` -- if nil, creates a new `User` for the `Identity`
* `:value` -- the unique identifier
* `:data` -- extra data for the Identity

### Behavior

If ‘:provider` or `:value` is `nil`, this method raises an `ArgumentError`.

If ‘:user` is `nil`, this method creates a new `User` for the `Identity`.

If ‘:user` exists and there is no other `Identity` with the same `:value`, this method adds a new `Identity` to the `User`.

If there exists another ‘Identity` with the same `:value` and that `Identity` is owned by the given `User`, this method updates that `Identity`.

If ‘:user` exists and there exists another `Identity` with the same `:value` and that `Identity` is owned by a different `User`, this method merges that User into `:user` and updates the `Identity`.

Raises:

  • (ArgumentError)


63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
# File 'lib/billfold/identity.rb', line 63

def update_or_create!(attributes = {})
  raise ArgumentError.new("provider must not be blank") if attributes[:provider].blank?
  raise ArgumentError.new("value must not be blank") if attributes[:value].blank?
  identity = with_provider_and_value(attributes[:provider], attributes[:value])
  if identity
    old_owner, new_owner = identity.user, attributes[:user]
    transaction do
      identity.update_attributes!(attributes)
      old_owner.merge_into!(new_owner) if old_owner != new_owner
    end
  else
    identity = new(attributes)
    identity.user = attributes[:user] || ::Billfold.user_class.new(:name => identity.name_for_user)
    identity.save!
  end
  identity
end

#with_provider_and_value(provider, value) ⇒ Object

### Billfold::Identity.with_provider_and_value

Return the identity with the given ‘provider` and `value`, or `nil`, if no such identity exists. Including classes must redefine this method.

Raises:

  • (NotImplementedError)


32
33
34
# File 'lib/billfold/identity.rb', line 32

def with_provider_and_value(provider, value)
  raise NotImplementedError.new('classes including Billfold::Identity MUST redefine class method with_provider_and_value')
end