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 | |
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')
-rw-r--r-- | users/app/controllers/v1/users_controller.rb | 11 | ||||
-rw-r--r-- | users/app/models/account.rb (renamed from users/app/models/account_settings.rb) | 25 | ||||
-rw-r--r-- | users/app/models/signup_service.rb | 9 | ||||
-rw-r--r-- | users/app/models/user.rb | 4 |
4 files changed, 31 insertions, 18 deletions
diff --git a/users/app/controllers/v1/users_controller.rb b/users/app/controllers/v1/users_controller.rb index f380c19..b271152 100644 --- a/users/app/controllers/v1/users_controller.rb +++ b/users/app/controllers/v1/users_controller.rb @@ -18,23 +18,20 @@ module V1 end def create - @user = signup_service.register(params[:user]) + @user = Account.create(params[:user]) respond_with @user # return ID instead? end def update - account_settings.update params[:user] + account.update params[:user] respond_with @user end protected - def account_settings - AccountSettings.new(@user) + def account + Account.new(@user) end - def signup_service - SignupService.new - end end end diff --git a/users/app/models/account_settings.rb b/users/app/models/account.rb index 27fa227..5368a1b 100644 --- a/users/app/models/account_settings.rb +++ b/users/app/models/account.rb @@ -1,9 +1,21 @@ -class AccountSettings +# +# A Composition of a User record and it's identity records. +# +class Account - def initialize(user) + 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]) @@ -12,6 +24,15 @@ class AccountSettings # 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 diff --git a/users/app/models/signup_service.rb b/users/app/models/signup_service.rb deleted file mode 100644 index f316ca9..0000000 --- a/users/app/models/signup_service.rb +++ /dev/null @@ -1,9 +0,0 @@ -class SignupService - - def register(attrs) - User.create(attrs).tap do |user| - Identity.create_for user - end - end - -end diff --git a/users/app/models/user.rb b/users/app/models/user.rb index 8874966..310eecd 100644 --- a/users/app/models/user.rb +++ b/users/app/models/user.rb @@ -86,6 +86,10 @@ class User < CouchRest::Model::Base @identity ||= Identity.for(self) end + def refresh_identity + @identity = Identity.for(self) + end + protected ## |