From 1bb483bb5a5e29c628b65a7fe6e27daf87a4e6d3 Mon Sep 17 00:00:00 2001 From: Tom Bloor Date: Sun, 9 Apr 2017 14:17:12 +0100 Subject: [PATCH] Final minor pass of a full registration form on the website --- lib/Pear/LocalLoop/Controller/Register.pm | 66 ++++++++++++++++++++--- lib/Pear/LocalLoop/Plugin/Validators.pm | 5 ++ templates/register/index.html.ep | 46 +++++++++++----- templates/root/index.html.ep | 11 +++- 4 files changed, 108 insertions(+), 20 deletions(-) diff --git a/lib/Pear/LocalLoop/Controller/Register.pm b/lib/Pear/LocalLoop/Controller/Register.pm index 0e6d3eb..2967afd 100644 --- a/lib/Pear/LocalLoop/Controller/Register.pm +++ b/lib/Pear/LocalLoop/Controller/Register.pm @@ -1,32 +1,86 @@ package Pear::LocalLoop::Controller::Register; use Mojo::Base 'Mojolicious::Controller'; +use DateTime; + +has error_messages => sub { + return { + name => 'Full Name is required', + email => 'Email Address is required, and must be a valid address that is not already registered', + password => 'Password is required, and must match the Confirmation field', + postcode => 'Postcode is required, and must be a valid UK Postcode', + token => 'Token is required, and must be a valid, unused token', + agerange => 'Age Range is required, and must be a selection from the drop-down', + unknown => 'Sorry, there was a problem registering!', + }; +}; + sub index { my $c = shift; my $agerange_rs = $c->schema->resultset('AgeRange'); $agerange_rs->result_class('DBIx::Class::ResultClass::HashRefInflator'); - $c->stash( ageranges => [ $agerange_rs->all ] ); + $c->stash( ageranges => [ $agerange_rs->all ], form_data => {}, error => undef ); } sub register { my $c = shift; my $validation = $c->validation; - $validation->required('name', 'trim'); - $validation->required('email')->email; + $validation->required('name'); $validation->required('password')->equal_to('password2'); $validation->required('postcode')->postcode; + my $user_rs = $c->schema->resultset('User'); + $validation->required('email')->email->not_in_resultset('email', $user_rs); + my $token_rs = $c->schema->resultset('AccountToken')->search_rs({used => 0}); $validation->required('token')->in_resultset('accounttokenname', $token_rs); my $age_rs = $c->schema->resultset('AgeRange'); $validation->required('agerange')->in_resultset('agerangeid', $age_rs); - use Devel::Dwarn; - Dwarn $validation; - $c->redirect_to('/register'); + my @error_messages; + if ( $validation->has_error ) { + my $failed_vals = $validation->failed; + @error_messages = map {$c->error_messages->{ $_ } } @$failed_vals; + + $c->render( template => 'register/index' ); + } else { + my $new_user = $c->schema->resultset('User')->find_or_new({ + email => $validation->param('email'), + hashedpassword => $c->generate_hashed_password( $validation->param('password') ), + joindate => DateTime->now(), + customer => { + username => $validation->param('name'), + postcode => $validation->param('postcode'), + agerange_fk => $validation->param('agerange'), + }, + }); + if ( $new_user->in_storage ) { + @error_messages = ( $c->error_messages->{unknown} ); + } else { + $new_user->insert; + } + } + + if ( scalar @error_messages ) { + $age_rs->result_class('DBIx::Class::ResultClass::HashRefInflator'); + $c->stash( + error => \@error_messages, + ageranges => [ $age_rs->all ], + form_data => { + name => $validation->param('name'), + email => $validation->param('email'), + postcode => $validation->param('postcode'), + token => $validation->param('token'), + agerange => $validation->param('agerange'), + } + ); + } else { + $c->flash( success => 'Registered Successfully, please log in' ); + $c->redirect_to('/'); + } } 1; diff --git a/lib/Pear/LocalLoop/Plugin/Validators.pm b/lib/Pear/LocalLoop/Plugin/Validators.pm index ea9f313..64e000c 100644 --- a/lib/Pear/LocalLoop/Plugin/Validators.pm +++ b/lib/Pear/LocalLoop/Plugin/Validators.pm @@ -17,6 +17,11 @@ sub register { return $rs->search({ $key => $value })->count ? undef : 1; }); + $app->validator->add_check( not_in_resultset => sub { + my ( $validation, $name, $value, $key, $rs ) = @_; + return $rs->search({ $key => $value })->count ? 1 : undef; + }); + $app->validator->add_check( postcode => sub { my ( $validation, $name, $value ) = @_; return Geo::UK::Postcode->new( $value )->valid ? undef : 1; diff --git a/templates/register/index.html.ep b/templates/register/index.html.ep index cf859ab..e5eb1eb 100644 --- a/templates/register/index.html.ep +++ b/templates/register/index.html.ep @@ -20,42 +20,62 @@ body { % content_for javascript => begin % end
- % if ( my $error = flash 'error' ) { + % if ( defined $error ) { - % } elsif ( my $success = flash 'success' ) { - % }
-
- +
- +
- +
- +
- % for my $agerange ( @$ageranges ) { - + % }
diff --git a/templates/root/index.html.ep b/templates/root/index.html.ep index 34f30fc..d540396 100644 --- a/templates/root/index.html.ep +++ b/templates/root/index.html.ep @@ -22,7 +22,16 @@ body { % end % content_for javascript => begin % end -
+
+ % if ( my $error = flash 'error' ) { + + % } elsif ( my $success = flash 'success' ) { + + % }