From 9d99d340cfd3c55f21d38c1ba9f3f4574e40c46c Mon Sep 17 00:00:00 2001 From: Azul Date: Sun, 9 Dec 2012 13:19:54 +0100 Subject: basic form added to user settings, simple model created --- users/app/models/user.rb | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) (limited to 'users/app/models/user.rb') diff --git a/users/app/models/user.rb b/users/app/models/user.rb index ae271ce..81d5262 100644 --- a/users/app/models/user.rb +++ b/users/app/models/user.rb @@ -1,11 +1,13 @@ class User < CouchRest::Model::Base property :login, String, :accessible => true - property :email, String, :accessible => true - property :email_forward, String, :accessible => true property :password_verifier, String, :accessible => true property :password_salt, String, :accessible => true + property :email, String, :accessible => true + property :email_forward, String, :accessible => true + property :email_aliases, [EmailAlias] + validates :login, :password_salt, :password_verifier, :presence => true -- cgit v1.2.3 From e4c7f2fb8fa2833037508f1b88f802944855fd77 Mon Sep 17 00:00:00 2001 From: Azul Date: Mon, 10 Dec 2012 10:38:48 +0100 Subject: actually allow adding email aliases --- users/app/models/user.rb | 7 +++++++ 1 file changed, 7 insertions(+) (limited to 'users/app/models/user.rb') diff --git a/users/app/models/user.rb b/users/app/models/user.rb index 81d5262..3ad69c7 100644 --- a/users/app/models/user.rb +++ b/users/app/models/user.rb @@ -75,6 +75,13 @@ class User < CouchRest::Model::Base APP_CONFIG['admins'].include? self.login end + def email_aliases_attributes=(attrs) + if attrs + email_alias = EmailAlias.new(attrs.values.first) + email_aliases << email_alias + end + end + protected def password password_verifier -- cgit v1.2.3 From 28b21959f39b0e28c450bba54b8696632a0187fa Mon Sep 17 00:00:00 2001 From: Azul Date: Mon, 10 Dec 2012 11:00:24 +0100 Subject: created generic Email class and use it with EmailAliases --- users/app/models/user.rb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'users/app/models/user.rb') diff --git a/users/app/models/user.rb b/users/app/models/user.rb index 3ad69c7..fcb211e 100644 --- a/users/app/models/user.rb +++ b/users/app/models/user.rb @@ -6,7 +6,7 @@ class User < CouchRest::Model::Base property :email, String, :accessible => true property :email_forward, String, :accessible => true - property :email_aliases, [EmailAlias] + property :email_aliases, [Email] validates :login, :password_salt, :password_verifier, :presence => true @@ -77,7 +77,7 @@ class User < CouchRest::Model::Base def email_aliases_attributes=(attrs) if attrs - email_alias = EmailAlias.new(attrs.values.first) + email_alias = Email.new(attrs.values.first) email_aliases << email_alias end end -- cgit v1.2.3 From d9fa19106998bc6ac484494334dcf150bb6aa5d5 Mon Sep 17 00:00:00 2001 From: Azul Date: Mon, 10 Dec 2012 20:16:26 +0100 Subject: email format validations --- users/app/models/user.rb | 7 +++++++ 1 file changed, 7 insertions(+) (limited to 'users/app/models/user.rb') diff --git a/users/app/models/user.rb b/users/app/models/user.rb index fcb211e..a41554d 100644 --- a/users/app/models/user.rb +++ b/users/app/models/user.rb @@ -26,6 +26,13 @@ class User < CouchRest::Model::Base :confirmation => true, :format => { :with => /.{8}.*/, :message => "needs to be at least 8 characters long" } + # TODO: write a proper email validator to be used in the different places + validates :email, + :format => { :with => /\A([^@\s]+)@((?:[-a-z0-9]+\.)+[a-z]{2,})\Z/, :message => "needs to be a valid email address"} + + validates :email_forward, + :format => { :with => /\A([^@\s]+)@((?:[-a-z0-9]+\.)+[a-z]{2,})\Z/, :message => "needs to be a valid email address"} + timestamps! design do -- cgit v1.2.3 From 60e8fc3e1309d1c972a7695e3344e63f5d633a06 Mon Sep 17 00:00:00 2001 From: Azul Date: Wed, 12 Dec 2012 15:41:14 +0100 Subject: find users by email and aliases --- users/app/models/user.rb | 30 ++++++++++++++++++++++++++++-- 1 file changed, 28 insertions(+), 2 deletions(-) (limited to 'users/app/models/user.rb') diff --git a/users/app/models/user.rb b/users/app/models/user.rb index a41554d..7d1691a 100644 --- a/users/app/models/user.rb +++ b/users/app/models/user.rb @@ -28,16 +28,42 @@ class User < CouchRest::Model::Base # TODO: write a proper email validator to be used in the different places validates :email, - :format => { :with => /\A([^@\s]+)@((?:[-a-z0-9]+\.)+[a-z]{2,})\Z/, :message => "needs to be a valid email address"} + :format => { :with => /\A(([^@\s]+)@((?:[-a-z0-9]+\.)+[a-z]{2,}))?\Z/, :message => "needs to be a valid email address"} validates :email_forward, - :format => { :with => /\A([^@\s]+)@((?:[-a-z0-9]+\.)+[a-z]{2,})\Z/, :message => "needs to be a valid email address"} + :format => { :with => /\A(([^@\s]+)@((?:[-a-z0-9]+\.)+[a-z]{2,}))?\Z/, :message => "needs to be a valid email address"} timestamps! design do view :by_login view :by_created_at + view :by_email + view :by_email_alias, + :map => <<-EOJS + function(doc) { + if (doc.type != 'User') { + return; + } + doc.email_aliases.forEach(function(alias){ + emit(alias.email, doc); + }); + } + EOJS + view :by_email_or_alias, + :map => <<-EOJS + function(doc) { + if (doc.type != 'User') { + return; + } + if (doc.email) { + emit(doc.email, doc); + } + doc.email_aliases.forEach(function(alias){ + emit(alias.email, doc); + }); + } + EOJS end class << self -- cgit v1.2.3 From d7890d7c8af6691df2817a9b6654acf9377847bd Mon Sep 17 00:00:00 2001 From: Azul Date: Thu, 13 Dec 2012 11:49:26 +0100 Subject: LocalEmail added - will validate uniqueness amongst emails and aliases --- users/app/models/user.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'users/app/models/user.rb') diff --git a/users/app/models/user.rb b/users/app/models/user.rb index 7d1691a..e5e388b 100644 --- a/users/app/models/user.rb +++ b/users/app/models/user.rb @@ -6,7 +6,7 @@ class User < CouchRest::Model::Base property :email, String, :accessible => true property :email_forward, String, :accessible => true - property :email_aliases, [Email] + property :email_aliases, [LocalEmail] validates :login, :password_salt, :password_verifier, :presence => true -- cgit v1.2.3 From 6ff4bd80e0394260c8cd300cfb051451fc7e358f Mon Sep 17 00:00:00 2001 From: Azul Date: Thu, 13 Dec 2012 15:47:08 +0100 Subject: ensure users do not have duplicate email aliases nor aliases that are the same as the original email for that matter --- users/app/models/user.rb | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) (limited to 'users/app/models/user.rb') diff --git a/users/app/models/user.rb b/users/app/models/user.rb index e5e388b..0eb244c 100644 --- a/users/app/models/user.rb +++ b/users/app/models/user.rb @@ -33,6 +33,10 @@ class User < CouchRest::Model::Base validates :email_forward, :format => { :with => /\A(([^@\s]+)@((?:[-a-z0-9]+\.)+[a-z]{2,}))?\Z/, :message => "needs to be a valid email address"} + validate :no_duplicate_email_aliases + + validate :email_aliases_differ_from_email + timestamps! design do @@ -115,6 +119,23 @@ class User < CouchRest::Model::Base end end + ## + # Validation Functions + ## + + # TODO: How do we handle these errors? + def no_duplicate_email_aliases + if email_aliases.count != email_aliases.map(&:email).uniq.count + errors.add(:email_aliases, "include a duplicate") + end + end + + def email_aliases_differ_from_email + if email_aliases.map(&:email).include?(email) + errors.add(:email_aliases, "include the original email address") + end + end + protected def password password_verifier -- cgit v1.2.3 From 9762a37ab932ee1a94e973977520c7f4673d78b1 Mon Sep 17 00:00:00 2001 From: Azul Date: Thu, 13 Dec 2012 16:01:59 +0100 Subject: refactor: allow adding email aliases directly --- users/app/models/user.rb | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) (limited to 'users/app/models/user.rb') diff --git a/users/app/models/user.rb b/users/app/models/user.rb index 0eb244c..7c9002b 100644 --- a/users/app/models/user.rb +++ b/users/app/models/user.rb @@ -112,9 +112,16 @@ class User < CouchRest::Model::Base APP_CONFIG['admins'].include? self.login end + def add_email(email) + email = LocalEmail.new({:email => email}) unless email.is_a? Email + email_aliases << email + end + + # this currently only adds the first email address submitted. + # All the ui needs for now. def email_aliases_attributes=(attrs) if attrs - email_alias = Email.new(attrs.values.first) + email_alias = LocalEmail.new(attrs.values.first) email_aliases << email_alias end end -- cgit v1.2.3 From 577c3d8149acbd483120847b994582268f93c0b3 Mon Sep 17 00:00:00 2001 From: Azul Date: Thu, 13 Dec 2012 16:07:31 +0100 Subject: refactor: Email constructor now takes string or hash This allows us to reuse add_email from email_aliases_attributes= --- users/app/models/user.rb | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) (limited to 'users/app/models/user.rb') diff --git a/users/app/models/user.rb b/users/app/models/user.rb index 7c9002b..b531dfd 100644 --- a/users/app/models/user.rb +++ b/users/app/models/user.rb @@ -113,16 +113,15 @@ class User < CouchRest::Model::Base end def add_email(email) - email = LocalEmail.new({:email => email}) unless email.is_a? Email + email = LocalEmail.new(email) unless email.is_a? Email email_aliases << email end # this currently only adds the first email address submitted. # All the ui needs for now. def email_aliases_attributes=(attrs) - if attrs - email_alias = LocalEmail.new(attrs.values.first) - email_aliases << email_alias + if attrs && attrs.values.first + add_email attrs.values.first end end -- cgit v1.2.3 From aed03c04270bc9b7d48048ffb2f24fecc993c7ac Mon Sep 17 00:00:00 2001 From: Azul Date: Thu, 13 Dec 2012 16:13:32 +0100 Subject: refactor: changed add_email to add_email_alias that's what it does. Changed all tests to use it instead of the attributes method --- users/app/models/user.rb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'users/app/models/user.rb') diff --git a/users/app/models/user.rb b/users/app/models/user.rb index b531dfd..4fd0039 100644 --- a/users/app/models/user.rb +++ b/users/app/models/user.rb @@ -112,7 +112,7 @@ class User < CouchRest::Model::Base APP_CONFIG['admins'].include? self.login end - def add_email(email) + def add_email_alias(email) email = LocalEmail.new(email) unless email.is_a? Email email_aliases << email end @@ -121,7 +121,7 @@ class User < CouchRest::Model::Base # All the ui needs for now. def email_aliases_attributes=(attrs) if attrs && attrs.values.first - add_email attrs.values.first + add_email_alias attrs.values.first end end -- cgit v1.2.3