addEmailAddress: permit shared email addresses.

An existing email address can exist already.  If it does, just map it to
the new donor_id as well.
This commit is contained in:
Bradley M. Kuhn 2015-12-30 05:49:12 -08:00
parent 736f022005
commit 6d1825240a
2 changed files with 50 additions and 21 deletions

View file

@ -200,28 +200,37 @@ sub addEmailAddress($$$$) {
die "addEmailAddress: invalid email address, $emailAddressType" die "addEmailAddress: invalid email address, $emailAddressType"
unless defined $emailAddressType and Mail::RFC822::Address::valid($emailAddress); unless defined $emailAddressType and Mail::RFC822::Address::valid($emailAddress);
my $existingEmail = $self->_lookupEmailAddress($emailAddress);
die "addEmailAddress: attempt to add email address that exists, using a different type!"
if defined $existingEmail and $existingEmail->{type} ne $emailAddressType;
my($sth, $addressId);
$self->_beginWork(); $self->_beginWork();
my $addressTypeId; if (defined $existingEmail) {
eval { $addressId = $existingEmail->{id};
$addressTypeId = $self->addAddressType($emailAddressType); } else {
}; my $addressTypeId;
if ($@ or not defined $addressTypeId) { eval {
my $err = $@; $addressTypeId = $self->addAddressType($emailAddressType);
$err = "addEmailAddress: unable to addAddressType" if (not defined $err); };
$self->_rollback(); if ($@ or not defined $addressTypeId) {
die $@ if $@; my $err = $@;
$err = "addEmailAddress: unable to addAddressType" if (not defined $err);
$self->_rollback();
die $@ if $@;
}
$sth = $self->dbh->prepare("INSERT INTO email_address(email_address, type_id, date_encountered)" .
"VALUES( ?, ?, date('now'))");
$sth->execute($emailAddress, $addressTypeId);
$addressId = $self->dbh->last_insert_id("","","","");
$sth->finish();
} }
my $sth = $self->dbh->prepare("INSERT INTO email_address(email_address, type_id, date_encountered)" .
"VALUES( ?, ?, date('now'))");
$sth->execute($emailAddress, $addressTypeId);
my $addressId = $self->dbh->last_insert_id("","","","");
$sth->finish();
$sth = $self->dbh->prepare("INSERT INTO donor_email_address_mapping" . $sth = $self->dbh->prepare("INSERT INTO donor_email_address_mapping" .
"(donor_id, email_address_id) " . "(donor_id, email_address_id) " .
"VALUES( ?, ?)"); "VALUES( ?, ?)");
$sth->execute($id, $addressId); $sth->execute($id, $addressId);
$sth->finish(); $sth->finish();

View file

@ -5,7 +5,7 @@
use strict; use strict;
use warnings; use warnings;
use Test::More tests => 176; use Test::More tests => 182;
use Test::Exception; use Test::Exception;
use Scalar::Util qw(looks_like_number reftype); use Scalar::Util qw(looks_like_number reftype);
@ -131,9 +131,25 @@ ok((not defined $val or not defined $val->{'name'}),
my $drapperEmailId; my $drapperEmailId;
lives_ok { $drapperEmailId = $sp->addEmailAddress($drapperId, 'drapper@example.org', 'work') } lives_ok { $drapperEmailId = $sp->addEmailAddress($drapperId, 'drapper@example.org', 'work') }
"addEmailAdress: inserting a valid email address works"; "addEmailAddress: inserting a valid email address works";
ok((looks_like_number($drapperEmailId) and $drapperEmailId > 0), "addEmailAddress: id returned is sane."); ok((looks_like_number($drapperEmailId) and $drapperEmailId > 0), "addEmailAddress: id returned is sane.");
my $olsonEmailId2;
dies_ok { $olsonEmailId2 = $sp->addEmailAddress($olsonId, 'drapper@example.org', 'paypal') }
"addEmailAddress: fails when adding the same email address for someone else, but as a different type";
my $drapperEmailId2;
lives_ok { $drapperEmailId2 = $sp->addEmailAddress($drapperId, 'everyone@example.net', 'paypal') }
"addEmailAddress: inserting a second valid email address works";
ok((looks_like_number($drapperEmailId2) and $drapperEmailId2 > 0 and $drapperEmailId != $drapperEmailId2),
"addEmailAddress: id returned is sane and is not same as previous id.");
lives_ok { $olsonEmailId2 = $sp->addEmailAddress($olsonId, 'everyone@example.net', 'paypal') }
"addEmailAddress: binding known email address to another person works...";
ok((looks_like_number($olsonEmailId2) and $olsonEmailId2 > 0 and $olsonEmailId2 == $drapperEmailId2),
"addEmailAddress: ... and id returned is sane and is same.");
=item addAddressType =item addAddressType
=cut =cut
@ -546,7 +562,11 @@ dies_ok { $sp->_lookupEmailAddress(undef); } "_lookupEmailAddressId: dies for un
is_deeply($sp->_lookupEmailAddress('drapper@example.org'), is_deeply($sp->_lookupEmailAddress('drapper@example.org'),
{ emailAddress => 'drapper@example.org', id => $drapperEmailId, type => 'work', dateEncountered => $today }, { emailAddress => 'drapper@example.org', id => $drapperEmailId, type => 'work', dateEncountered => $today },
"_lookupEmailAddressId: returns email Id for known item"); "_lookupEmailAddressId: 1 returns email Id for known item");
is_deeply($sp->_lookupEmailAddress('everyone@example.net'),
{ emailAddress => 'everyone@example.net', id => $olsonEmailId2, type => 'paypal', dateEncountered => $today },
"_lookupEmailAddressId: 2 returns email id for known item");
is($sp->_lookupEmailAddress('drapper@example.com'), undef, is($sp->_lookupEmailAddress('drapper@example.com'), undef,
"_lookupEmailAddressId: returns undef for unknown item."); "_lookupEmailAddressId: returns undef for unknown item.");