diff options
author | Azul <azul@leap.se> | 2013-08-30 11:20:04 +0200 |
---|---|---|
committer | Azul <azul@leap.se> | 2013-09-03 08:54:25 +0200 |
commit | 859b79d0dcd53c85bb57e3db888a1af702802987 (patch) | |
tree | cb0e293a6eddba2a9aa0b22baa0bfb43f56c43ed /users/app/models/account.rb | |
parent | 0d44e39d2ec591c9ab98464b93a0c867ca96e02a (diff) |
Account: Composition to handle User and its identities
We have a lot of things that act upon a user record and one or more of it's identities at the same time:
* Sing up: Create a user and it's initial identity
* Rename: Change the username and create a new identity, turn old into an alias
* Cancel Account: Remove user and all their identities.
In order to keep the User and Identity behaviour isolated but still have a this logic represented in a sinle place the Account model deals with all these things.
We could have overwritten the User#create, User#update and User#destroy methods instead. But then we would always create identities, even if we only need a user (for example in tests).
Diffstat (limited to 'users/app/models/account.rb')
-rw-r--r-- | users/app/models/account.rb | 57 |
1 files changed, 57 insertions, 0 deletions
diff --git a/users/app/models/account.rb b/users/app/models/account.rb new file mode 100644 index 0000000..5368a1b --- /dev/null +++ b/users/app/models/account.rb @@ -0,0 +1,57 @@ +# +# A Composition of a User record and it's identity records. +# +class Account + + attr_reader :user + + def initialize(user = nil) + @user = user + end + + # Returns the user record so it can be used in views. + def self.create(attrs) + @user = User.create(attrs).tap do |user| + Identity.create_for user + end + end + + def update(attrs) + if attrs[:password_verifier].present? + update_login(attrs[:login]) + @user.update_attributes attrs.slice(:password_verifier, :password_salt) + end + # TODO: move into identity controller + update_pgp_key(attrs[:public_key]) if attrs.has_key? :public_key + @user.save && save_identities + @user.refresh_identity + end + + def destroy + return unless @user + Identity.by_user_id.key(@user.id).each do |identity| + identity.destroy + end + @user.destroy + end + + protected + + def update_login(login) + return unless login.present? + @old_identity = Identity.for(@user) + @user.login = login + @new_identity = Identity.for(@user) # based on the new login + @old_identity.destination = @user.email_address # alias old -> new + end + + def update_pgp_key(key) + @new_identity ||= Identity.for(@user) + @new_identity.set_key(:pgp, key) + end + + def save_identities + @new_identity.try(:save) && @old_identity.try(:save) + end + +end |