diff --git a/lib/WebGUI/AssetAspect/Subscriber.pm b/lib/WebGUI/AssetAspect/Subscriber.pm index 9d33dc5..803ac1a 100644 --- a/lib/WebGUI/AssetAspect/Subscriber.pm +++ b/lib/WebGUI/AssetAspect/Subscriber.pm @@ -4,6 +4,7 @@ use strict; use warnings; use Class::C3; +use WebGUI::Asset::Template; use WebGUI::Macro; use Tie::IxHash; @@ -39,6 +40,32 @@ sub definition { label => 'Allow anonymous subscription', tab => 'subscription', }, + confirmationEmailSubject => { + fieldType => 'text', + defaultVale => 'Confirm your subscription mutation', + label => 'Confirmation email subject', + tab => 'subscription', + }, + confirmationEmailTemplateId => { + fieldType => 'template', + defaultValue => '4aLemgMrTFhG3eqg57jCpQ', + label => 'Confirmation email template', + namespace => 'Subscriber/ConfirmationEmail', + tab => 'subscription', + }, + noMutationEmailSubject => { + fieldType => 'text', + defaultVale => '(Un)subscribe result', + label => 'No mutation email subject', + tab => 'subscription', + }, + noMutationEmailTemplateId => { + fieldType => 'template', + defaultValue => '', + label => 'No mutation email template', + namespace => 'Subscriber/NoMutationEmail', + tab => 'subscription', + }, ); push( @{ $definition }, { @@ -113,11 +140,6 @@ sub isSubscribed { my $db = $self->session->db; return $user->isInGroup( $self->getSubscriptionGroup->getId ); - -# return $db->quickScalar( 'select 1 from NewsletterCollection_subscriptions where assetId=? and userId=?', [ -# $self->getId, -# $userId, -# ] ); } #---------------------------------------------------------------------------- @@ -165,26 +187,93 @@ sub getSubscriptionGroup { return $group; } +#---------------------------------------------------------------------------- +sub getEmailVars { + my $self = shift; + my $user = shift; + + my $var = {}; + + my $userProperties = $user->get; + while ( my ($key, $value) = each %{ $userProperties } ) { + $var->{ "user_$key" } = $value; + } + $var->{ user_isRegular } = !WebGUI::User::SpecialState->isAdHocUser( $user ); + + my $assetProperties = $self->get; + while ( my ($key, $value) = each %{ $assetProperties } ) { + $var->{ "asset_$key" } = $value; + } + + return $var; +} + #---------------------------------------------------------------------------- sub sendSubscriptionConfirmation { my $self = shift; my $user = shift; my $code = shift; + my $action = shift || 'subscribe'; my $session = $self->session; -# my $user = WebGUI::User->new( $session, $userId ); + my $var = $self->getEmailVars( $user ); my $url = $session->url->getSiteURL . $self->getUrl( "func=confirmSubscription;code=$code" ); + $var->{ confirmUrl } = $url; + $var->{ code } = $code; + $var->{ actionIsSubscribe } = $action eq 'subscribe'; + my $mail = WebGUI::Mail::Send->create( $self->session, { to => $user->get('email'), - subject => 'Confirm your subscription', + subject => $self->get('confirmationEmailSubject'), } ); - $mail->addText( "Click here: $url" ); + + my $templateId = $self->get('confirmationEmailTemplateId'); + my $template = WebGUI::Asset::Template->new( $session, $templateId ); + if ( $template ) { + $mail->addHtml( $template->process( $var ) ); + } + else { + $session->log->error( "Cannot instanciate confirmation email template with id [$templateId]" ); + $mail->addText( "Click here to confirm your (un)subscription: $url" ); + } + $mail->send; return; } +#---------------------------------------------------------------------------- +sub sendNoMutationEmail { + my $self = shift; + my $user = shift; + my $action = shift || 'subscribe'; + my $session = $self->session; + + my $var = $self->getEmailVars( $user ); + $var->{ actionIsSubscribe } = $action eq 'subscribe'; + + my $mail = WebGUI::Mail::Send->create( $self->session, { + to => $user->get('email'), + subject => $self->get('noMutationEmailSubject'), + } ); + + my $templateId = $self->get('noMutationEmailTemplateId'); + my $template = WebGUI::Asset::Template->new( $session, $templateId ); + if ( $template ) { + $mail->addHtml( $template->process( $var ) ); + } + else { + $session->log->error( "Cannot instanciate no mutation email template with id [$templateId]" ); + if ( $action eq 'subscribe' ) { + $mail->addText( "This email address is already subscribed to " . $self->get('title') ); + } + } + + $mail->send; + + return; +} #---------------------------------------------------------------------------- sub subscribe { @@ -195,16 +284,21 @@ sub subscribe { my $db = $self->session->db; if ( $requireConfirm ) { - my $code = $self->session->id->generate; + if ( $user->isInGroup( $self->getSubscriptionGroup->getId ) ) { + $self->sendNoMutationEmail( $user, 'subscribe' ); + } + else { + my $code = $self->session->id->generate; - $db->write( 'replace into NewsletterCollection_subscriptions set assetId=?, userId=?, code=?, confirmed=?', [ - $self->getId, - $user->getId, - $code, - 0, - ] ); + $db->write( 'replace into NewsletterCollection_subscriptions set assetId=?, userId=?, code=?, confirmed=?', [ + $self->getId, + $user->getId, + $code, + 0, + ] ); - $self->sendSubscriptionConfirmation( $user, $code ); + $self->sendSubscriptionConfirmation( $user, $code ); + } } else { $self->getSubscriptionGroup->addUsers( [ $user->getId ] ); @@ -217,15 +311,9 @@ sub subscribe { sub unsubscribe { my $self = shift; my $user = shift || $self->session->user; -# my $db = $self->session->db; $self->getSubscriptionGroup->deleteUsers( [ $user->getId ] ); -# $db->write( 'delete from NewsletterCollection_subscriptions where assetId=? and userId=?', [ -# $self->getId, -# $user->getId, -# ] ); - return; } diff --git a/lib/WebGUI/User/SpecialState.pm b/lib/WebGUI/User/SpecialState.pm index 66bb970..21dbdbf 100644 --- a/lib/WebGUI/User/SpecialState.pm +++ b/lib/WebGUI/User/SpecialState.pm @@ -26,6 +26,16 @@ sub addSpecialState { return; } +sub isAdHocUser { + my $class = shift; + my $user = shift; + + return + $user->username eq $user->getId + && !$user->isEnabled; +} + + sub removeSpecialState { my $self = shift; my $state = shift || croak 'state is required'; diff --git a/sbin/install_newsletter.pl b/sbin/install_newsletter.pl index 3dede98..c6dbb54 100644 --- a/sbin/install_newsletter.pl +++ b/sbin/install_newsletter.pl @@ -60,6 +60,10 @@ sub installSubscriberAspectTable { subscriptionEnabled tinyint(1) not null default 0, alwaysConfirmSubscription tinyint(1) not null default 0, allowAnonymousSubscription tinyint(1) not null default 0, + confirmationEmailTemplateId char(22) binary, + confirmationEmailSubject varchar(255), + noMutationEmailTemplateId char(22) binary, + noMutationEmailSubject varchar(255), primary key( assetId, revisionDate ) ); EOSQL diff --git a/sbin/packages/root_import_personalnewsletter.wgpkg b/sbin/packages/root_import_personalnewsletter.wgpkg index 838af0e..815eccd 100644 Binary files a/sbin/packages/root_import_personalnewsletter.wgpkg and b/sbin/packages/root_import_personalnewsletter.wgpkg differ