From c0b88d9e8fe574d6164f48211db50f3b8a4c4d93 Mon Sep 17 00:00:00 2001 From: Azul Date: Fri, 19 Jul 2013 12:21:40 +0200 Subject: setter for keys for dirty tracking, more robust tests Just altering identity.keys did not mark identities as changed. Also we now have a sane default for keys. --- users/app/models/identity.rb | 11 ++++++++++- users/app/models/user.rb | 21 ++++++++++++++------- 2 files changed, 24 insertions(+), 8 deletions(-) (limited to 'users/app/models') diff --git a/users/app/models/identity.rb b/users/app/models/identity.rb index b862590..73531ec 100644 --- a/users/app/models/identity.rb +++ b/users/app/models/identity.rb @@ -6,7 +6,7 @@ class Identity < CouchRest::Model::Base property :address, LocalEmail property :destination, Email - property :keys, Hash + property :keys, HashWithIndifferentAccess validate :unique_forward validate :alias_available @@ -27,6 +27,15 @@ class Identity < CouchRest::Model::Base end + def keys + read_attribute('keys') || HashWithIndifferentAccess.new + end + + def set_key(type, value) + return if keys[type] == value + write_attribute('keys', keys.merge(type => value)) + end + protected def unique_forward diff --git a/users/app/models/user.rb b/users/app/models/user.rb index 546d571..c791069 100644 --- a/users/app/models/user.rb +++ b/users/app/models/user.rb @@ -59,14 +59,19 @@ class User < CouchRest::Model::Base # TODO: Create an alias for the old login when changing the login def login=(value) write_attribute 'login', value - @identity = build_identity + if @identity + @identity.address = email_address + @identity.destination = email_address + else + build_identity + end end # DEPRECATED # - # Please access identity.keys[:pgp] directly + # Please set the key on the identity directly def public_key=(value) - identity.keys[:pgp] = value + identity.set_key(:pgp, value) end # DEPRECATED @@ -83,8 +88,7 @@ class User < CouchRest::Model::Base # this is the main identity. login@domain.tld # aliases and forwards are represented in other identities. def identity - @identity ||= - Identity.find_by_address_and_destination([email_address, email_address]) + @identity ||= find_identity || build_identity end def create_identity(attribs = {}, &block) @@ -96,8 +100,7 @@ class User < CouchRest::Model::Base def build_identity(attribs = {}, &block) attribs.reverse_merge! user_id: self.id, address: self.email_address, - destination: self.email_address, - keys: {} + destination: self.email_address Identity.new(attribs, &block) end @@ -139,6 +142,10 @@ class User < CouchRest::Model::Base protected + def find_identity + Identity.find_by_address_and_destination([email_address, email_address]) + end + ## # Validation Functions ## -- cgit v1.2.3