summaryrefslogtreecommitdiff
path: root/app/models/identity.rb
diff options
context:
space:
mode:
authorAzul <azul@leap.se>2014-05-28 12:20:49 +0200
committerAzul <azul@leap.se>2014-05-28 12:20:49 +0200
commit6fea83763f07add7d3bd07e3843b75aaf61e19b4 (patch)
treecf47afa9d9a0d64aa8b8f6e259441086aab7b024 /app/models/identity.rb
parent682b4060cb86c52ffda638f4f9a837f107540610 (diff)
bring back the alias functionality in Identities
Diffstat (limited to 'app/models/identity.rb')
-rw-r--r--app/models/identity.rb23
1 files changed, 13 insertions, 10 deletions
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