summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--app/models/account.rb1
-rw-r--r--app/models/identity.rb23
2 files changed, 14 insertions, 10 deletions
diff --git a/app/models/account.rb b/app/models/account.rb
index cf998e4..bffa288 100644
--- a/app/models/account.rb
+++ b/app/models/account.rb
@@ -18,6 +18,7 @@ class Account
def self.create(attrs)
@user = User.create(attrs).tap do |user|
Identity.create_for user
+ user.refresh_identity
end
end
diff --git a/app/models/identity.rb b/app/models/identity.rb
index 2be396c..0d25bae 100644
--- a/app/models/identity.rb
+++ b/app/models/identity.rb
@@ -11,8 +11,7 @@ class Identity < CouchRest::Model::Base
property :cert_fingerprints, Hash
validate :alias_available
- validates :destination, presence: true,
- uniqueness: {scope: :address}
+ validates :destination, uniqueness: {scope: :address}
validate :address_local_email
validate :destination_email
@@ -45,12 +44,14 @@ class Identity < CouchRest::Model::Base
end
- def self.for(user)
- find_for(user) || build_for(user)
+ def self.for(user, attributes = {})
+ find_for(user, attributes) || build_for(user, attributes)
end
- def self.find_for(user)
- find_by_user_id(user.id) if user && user.persisted?
+ def self.find_for(user, attributes = {})
+ attributes.reverse_merge! attributes_from_user(user)
+ id = find_by_address_and_destination attributes.values_at(:address, :destination)
+ return id if id && id.user == user
end
def self.build_for(user, attributes = {})
@@ -67,7 +68,9 @@ class Identity < CouchRest::Model::Base
def self.disable_all_for(user)
Identity.by_user_id.key(user.id).each do |identity|
identity.disable
- identity.save
+ # if the identity is not unique anymore because the destination
+ # was reset to nil we destroy it.
+ identity.save || identity.destroy
end
end
@@ -127,15 +130,15 @@ class Identity < CouchRest::Model::Base
def alias_available
same_address = Identity.by_address.key(address)
- if same_address.detect { |other| other.user !=self.user }
+ if same_address.detect { |other| other.user != self.user }
errors.add :address, :taken
end
end
def address_local_email
- return if address.valid?
+ return if address.valid? #this ensures it is a valid local email address
# we only hand on the first error for now.
- self.errors.add(:address, address.errors.messages.values.first)
+ self.errors.add(:address, address.errors.messages[:email].first)
end
def destination_email