summaryrefslogtreecommitdiff
path: root/users/app/models/account.rb
diff options
context:
space:
mode:
authorAzul <azul@leap.se>2013-08-30 11:20:04 +0200
committerAzul <azul@leap.se>2013-09-03 08:54:25 +0200
commit859b79d0dcd53c85bb57e3db888a1af702802987 (patch)
treecb0e293a6eddba2a9aa0b22baa0bfb43f56c43ed /users/app/models/account.rb
parent0d44e39d2ec591c9ab98464b93a0c867ca96e02a (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.rb57
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