From 22c900047fe729a3fb6fe2c1c10b2817a7f6ed5d Mon Sep 17 00:00:00 2001 From: Martin Kamerbeek Date: Fri, 21 May 2010 11:13:59 +0200 Subject: [PATCH] Turn subscribe part of NewsletterCollection into an aspect. --- .../Asset/Wobject/NewsletterCollection.pm | 225 +--------------- lib/WebGUI/AssetAspect/Subscriber.pm | 248 ++++++++++++++++++ sbin/install_newsletter.pl | 20 +- 3 files changed, 268 insertions(+), 225 deletions(-) create mode 100644 lib/WebGUI/AssetAspect/Subscriber.pm diff --git a/lib/WebGUI/Asset/Wobject/NewsletterCollection.pm b/lib/WebGUI/Asset/Wobject/NewsletterCollection.pm index a4b9cd0..7e0fe13 100644 --- a/lib/WebGUI/Asset/Wobject/NewsletterCollection.pm +++ b/lib/WebGUI/Asset/Wobject/NewsletterCollection.pm @@ -9,43 +9,10 @@ use WebGUI::User::SpecialState; use base qw{ WebGUI::AssetAspect::Mailable + WebGUI::AssetAspect::Subscriber WebGUI::Asset::Wobject }; -#---------------------------------------------------------------------------- -sub canSubscribe { - my $self = shift; - - return !$self->session->user->isVisitor && !$self->isSubscribed; -} - -#---------------------------------------------------------------------------- -sub canUnsubscribe { - my $self = shift; - - return !$self->session->user->isVisitor && $self->isSubscribed; -} - -##---------------------------------------------------------------------------- -#sub configureMailingForm { -# my $self = shift; -# my $f = $self->next::method; -# -# tie my %issues, 'Tie::IxHash', ( -# '' => 'Choose issue...', -# map { $_->getId => $_->getTitle } -# @{ $self->getIssues } -# ); -# -# $f->selectBox( -# name => 'issue', -# label => 'Issue', -# options => $self->getIssues -# ); -# -# return $f; -#} - #---------------------------------------------------------------------------- sub definition { my $class = shift; @@ -54,12 +21,6 @@ sub definition { my $i18n = WebGUI::International->new( $session, 'Asset_NewsletterCollection' ); tie my %properties, 'Tie::IxHash', ( - alwaysConfirmSubscription => { - fieldType => 'yesNo', - defaultValue => 0, - label => 'Always require subscription confirmation', - tab => 'mailable', - }, ); push @{ $definition }, { @@ -113,18 +74,6 @@ sub generateEmailContent { return $issue->view; } -#---------------------------------------------------------------------------- -sub isSubscribed { - my $self = shift; - my $userId = shift || $self->session->user->getId; - my $db = $self->session->db; - - return $db->quickScalar( 'select 1 from NewsletterCollection_subscriptions where assetId=? and userId=?', [ - $self->getId, - $userId, - ] ); -} - ##---------------------------------------------------------------------------- #sub prepareView { # my $self = shift; @@ -134,39 +83,6 @@ sub isSubscribed { # $self->{_viewTemplate} = $template; #} -#---------------------------------------------------------------------------- -sub getSubscriptionForm { - my $self = shift; - my $session = $self->session; - my $i18n = WebGUI::International->new( $session, 'Asset_NewsletterCollection' ); - - my $formHeader = - WebGUI::Form::formHeader( $session, { action => $self->getUrl } ) - . WebGUI::Form::hidden( $session, { name => 'func', value => 'processSubscription' } ) - ; - my $subscribeButton = - sprintf '', $i18n->get('subscribe'); - my $unsubscribeButton = - sprintf '', $i18n->get('unsubscribe'); - my $emailBox = WebGUI::Form::email( $session, { name => 'email', value => '' } ); - my $formFooter = WebGUI::Form::formFooter( $session ); - - my $output = ''; - if ( $session->user->isRegistered ) { - $output .= $subscribeButton if $self->canSubscribe; - $output .= $unsubscribeButton if $self->canUnsubscribe; - - return unless $output; - return $formHeader . $output . $formFooter; - } - #### TODO: anonymousAllowed - else { - return $formHeader . $emailBox . $subscribeButton . $unsubscribeButton . $formFooter; - } - - return; -} - #---------------------------------------------------------------------------- sub view { my $self = shift; @@ -202,144 +118,5 @@ sub view { return $output; } -#---------------------------------------------------------------------------- -sub sendSubscriptionConfirmation { - my $self = shift; - my $userId = shift; - my $code = shift; - my $session = $self->session; - - my $user = WebGUI::User->new( $session, $userId ); - my $url = $session->url->getSiteURL . $self->getUrl( "func=confirmSubscription;code=$code" ); - - my $mail = WebGUI::Mail::Send->create( $self->session, { - to => $user->get('email'), - subject => 'Confirm your subscription', - } ); - $mail->addText( "Click here: $url" ); - $mail->send; - - return; -} - - -#---------------------------------------------------------------------------- -sub subscribe { - my $self = shift; - my $userId = shift || $self->session->user->getId; - my $requireConfirm = shift // $self->get('alwaysConfirmSubscription'); - my $session = $self->session; - my $db = $self->session->db; - - my $code = $self->session->id->generate if $requireConfirm; - - $db->write( 'replace into NewsletterCollection_subscriptions set assetId=?, userId=?, code=?, confirmed=?', [ - $self->getId, - $userId, - $code, - $requireConfirm ? 0 : 1, - ] ); - - $self->sendSubscriptionConfirmation( $userId, $code ) if $requireConfirm; - - return; -} - -#---------------------------------------------------------------------------- -sub unsubscribe { - my $self = shift; - my $userId = shift || $self->session->user->getId; - my $db = $self->session->db; - - $db->write( 'delete from NewsletterCollection_subscriptions where assetId=? and userId=?', [ - $self->getId, - $userId, - ] ); - - return; -} - -#---------------------------------------------------------------------------- -sub www_confirmSubscription { - my $self = shift; - my ($form, $db) = $self->session->quick( 'form', 'db' ); - - my $code = $form->get('code'); - return unless $code; - - $db->write( 'update NewsletterCollection_subscriptions set confirmed=1, code=NULL where code=?', [ - $code - ] ); - - return $self->processStyle( 'U bent aangemeld voor deze newsbrief' ); -} - -#---------------------------------------------------------------------------- -sub www_processSubscription { - my $self = shift; - my $session = $self->session; - my $form = $session->form; - - my $action = $form->get( 'action' ); - return unless $action eq 'subscribe' || $action eq 'unsubscribe'; - - if ( $session->user->isRegistered ) { - if ( $action eq 'subscribe' && $self->canSubscribe ) { - $self->subscribe; - } - if ( $action eq 'unsubscribe' && $self->canUnsubscribe ) { - $self->unsubscribe; - } - } - # TODO: anonymousAllowed - else { - my $email = $form->email( 'email' ); - return 'no email' unless $email; - - #### TODO: Break this out in seperate sub. - my $emailUser = WebGUI::User::SpecialState->newByEmail( $session, $email ); - if ( $action eq 'unsubscribe' && defined $emailUser ) { - $session->log->warn( 'unsub anon' ); - $self->unsubscribe( $emailUser->getId ); - } - if ( $action eq 'subscribe' ) { - if ( !defined $emailUser ) { - $emailUser = WebGUI::User::SpecialState->create( $session ); - $emailUser->disable; - $emailUser->username( $emailUser->getId ); - $emailUser->update( { email => $email } ); - } - $emailUser->addSpecialState( 'Newsletter', $self->getId ); - - $session->log->warn( 'sub anon ' . $emailUser->username); - $self->subscribe( $emailUser->getId, 1 ); - } - } - - return; -} - -#---------------------------------------------------------------------------- -sub www_subscribe { - my $self = shift; - - if ( $self->canSubscribe ) { - $self->subscribe; - } - - return $self->www_view; -} - -#---------------------------------------------------------------------------- -sub www_unsubscribe { - my $self = shift; - - if ( $self->canUnsubscribe ) { - $self->unsubscribe; - } - - return $self->www_view; -} - 1; diff --git a/lib/WebGUI/AssetAspect/Subscriber.pm b/lib/WebGUI/AssetAspect/Subscriber.pm new file mode 100644 index 0000000..96350fa --- /dev/null +++ b/lib/WebGUI/AssetAspect/Subscriber.pm @@ -0,0 +1,248 @@ +package WebGUI::AssetAspect::Subscriber; + +use strict; +use warnings; +use Class::C3; + +use WebGUI::Macro; +use Tie::IxHash; + +#---------------------------------------------------------------------------- +sub definition { + my $class = shift; + my $session = shift; + my $definition = shift; +# my $i18n = WebGUI::International->new( $session,'AssetAspect_Subscriber' ); + + tie my %properties, 'Tie::IxHash', ( + subscriptionEnabled => { + fieldType => 'yesNo', + defaultValue => 1, + label => 'Enable subscription', + tab => 'subscription', + }, + alwaysConfirmSubscription => { + fieldType => 'yesNo', + defaultValue => 0, + label => 'Always require subscription confirmation', + tab => 'subscription', + }, + ); + + push( @{ $definition }, { + autoGenerateForms => 1, + tableName => 'assetAspectSubscriber', + className => 'WebGUI::AssetAspect::Subscriber', + properties => \%properties + } ); + + return $class->next::method( $session, $definition ); +} + +#---------------------------------------------------------------------------- +sub getEditTabs { + my $self = shift; + + return ( $self->next::method, [ 'subscription', 'Subscription', 9 ] ); +} + +#---------------------------------------------------------------------------- +sub canSubscribe { + my $self = shift; + + return !$self->session->user->isVisitor && !$self->isSubscribed; +} + +#---------------------------------------------------------------------------- +sub canUnsubscribe { + my $self = shift; + + return !$self->session->user->isVisitor && $self->isSubscribed; +} + +#---------------------------------------------------------------------------- +sub isSubscribed { + my $self = shift; + my $userId = shift || $self->session->user->getId; + my $db = $self->session->db; + + return $db->quickScalar( 'select 1 from NewsletterCollection_subscriptions where assetId=? and userId=?', [ + $self->getId, + $userId, + ] ); +} + +#---------------------------------------------------------------------------- +sub getSubscriptionForm { + my $self = shift; + my $session = $self->session; + my $i18n = WebGUI::International->new( $session, 'Asset_NewsletterCollection' ); + + my $formHeader = + WebGUI::Form::formHeader( $session, { action => $self->getUrl } ) + . WebGUI::Form::hidden( $session, { name => 'func', value => 'processSubscription' } ) + ; + my $subscribeButton = + sprintf '', $i18n->get('subscribe'); + my $unsubscribeButton = + sprintf '', $i18n->get('unsubscribe'); + my $emailBox = WebGUI::Form::email( $session, { name => 'email', value => '' } ); + my $formFooter = WebGUI::Form::formFooter( $session ); + + my $output = ''; + if ( $session->user->isRegistered ) { + $output .= $subscribeButton if $self->canSubscribe; + $output .= $unsubscribeButton if $self->canUnsubscribe; + + return unless $output; + return $formHeader . $output . $formFooter; + } + #### TODO: anonymousAllowed + else { + return $formHeader . $emailBox . $subscribeButton . $unsubscribeButton . $formFooter; + } + + return; +} + +#---------------------------------------------------------------------------- +sub sendSubscriptionConfirmation { + my $self = shift; + my $userId = shift; + my $code = shift; + my $session = $self->session; + + my $user = WebGUI::User->new( $session, $userId ); + my $url = $session->url->getSiteURL . $self->getUrl( "func=confirmSubscription;code=$code" ); + + my $mail = WebGUI::Mail::Send->create( $self->session, { + to => $user->get('email'), + subject => 'Confirm your subscription', + } ); + $mail->addText( "Click here: $url" ); + $mail->send; + + return; +} + + +#---------------------------------------------------------------------------- +sub subscribe { + my $self = shift; + my $userId = shift || $self->session->user->getId; + my $requireConfirm = shift // $self->get('alwaysConfirmSubscription'); + my $session = $self->session; + my $db = $self->session->db; + + my $code = $self->session->id->generate if $requireConfirm; + + $db->write( 'replace into NewsletterCollection_subscriptions set assetId=?, userId=?, code=?, confirmed=?', [ + $self->getId, + $userId, + $code, + $requireConfirm ? 0 : 1, + ] ); + + $self->sendSubscriptionConfirmation( $userId, $code ) if $requireConfirm; + + return; +} + +#---------------------------------------------------------------------------- +sub unsubscribe { + my $self = shift; + my $userId = shift || $self->session->user->getId; + my $db = $self->session->db; + + $db->write( 'delete from NewsletterCollection_subscriptions where assetId=? and userId=?', [ + $self->getId, + $userId, + ] ); + + return; +} + +#---------------------------------------------------------------------------- +sub www_confirmSubscription { + my $self = shift; + my ($form, $db) = $self->session->quick( 'form', 'db' ); + + my $code = $form->get('code'); + return unless $code; + + $db->write( 'update NewsletterCollection_subscriptions set confirmed=1, code=NULL where code=?', [ + $code + ] ); + + return $self->processStyle( 'U bent aangemeld voor deze newsbrief' ); +} + +#---------------------------------------------------------------------------- +sub www_processSubscription { + my $self = shift; + my $session = $self->session; + my $form = $session->form; + + my $action = $form->get( 'action' ); + return unless $action eq 'subscribe' || $action eq 'unsubscribe'; + + if ( $session->user->isRegistered ) { + if ( $action eq 'subscribe' && $self->canSubscribe ) { + $self->subscribe; + } + if ( $action eq 'unsubscribe' && $self->canUnsubscribe ) { + $self->unsubscribe; + } + } + # TODO: anonymousAllowed + else { + my $email = $form->email( 'email' ); + return 'no email' unless $email; + + #### TODO: Break this out in seperate sub. + my $emailUser = WebGUI::User::SpecialState->newByEmail( $session, $email ); + if ( $action eq 'unsubscribe' && defined $emailUser ) { + $session->log->warn( 'unsub anon' ); + $self->unsubscribe( $emailUser->getId ); + } + if ( $action eq 'subscribe' ) { + if ( !defined $emailUser ) { + $emailUser = WebGUI::User::SpecialState->create( $session ); + $emailUser->disable; + $emailUser->username( $emailUser->getId ); + $emailUser->update( { email => $email } ); + } + $emailUser->addSpecialState( 'Newsletter', $self->getId ); + + $session->log->warn( 'sub anon ' . $emailUser->username); + $self->subscribe( $emailUser->getId, 1 ); + } + } + + return; +} + +#---------------------------------------------------------------------------- +sub www_subscribe { + my $self = shift; + + if ( $self->canSubscribe ) { + $self->subscribe; + } + + return $self->www_view; +} + +#---------------------------------------------------------------------------- +sub www_unsubscribe { + my $self = shift; + + if ( $self->canUnsubscribe ) { + $self->unsubscribe; + } + + return $self->www_view; +} + +1; + diff --git a/sbin/install_newsletter.pl b/sbin/install_newsletter.pl index 798cf7c..1d32355 100644 --- a/sbin/install_newsletter.pl +++ b/sbin/install_newsletter.pl @@ -20,6 +20,7 @@ GetOptions( my $session = start( $webguiRoot, $configFile ); +installSubscriberAspectTable( $session ); installMailableAspectTable( $session ); installNewsletterCollection( $session ); installMailingTables( $session ); @@ -46,6 +47,24 @@ EOSQL print "Done.\n"; } +#---------------------------------------------------------------------------- +sub installSubscriberAspectTable { + my $session = shift; + print "\tCreating Subscriber aspect table..."; + + $session->db->write(<