From 4a3a3b9e36cab669cf3bf7f4026c3be3a12e9d43 Mon Sep 17 00:00:00 2001 From: sergiotarxz Date: Mon, 14 Mar 2022 19:47:22 +0100 Subject: [PATCH] Adding auto recovery of database generated data in creation. --- MYMETA.json | 6 ----- lib/Peace/DAO/Customer.pm | 54 +++++++++++++++++++++++++++++++-------- t/00002-customer-dao.t | 52 +++++++++++++++++++++++++++++++------ 3 files changed, 88 insertions(+), 24 deletions(-) diff --git a/MYMETA.json b/MYMETA.json index ef8626d..54883b8 100644 --- a/MYMETA.json +++ b/MYMETA.json @@ -33,17 +33,11 @@ "Peace::DAO::Customer" : { "file" : "lib/Peace/DAO/Customer.pm" }, - "Peace::DAO::User" : { - "file" : "lib/Peace/DAO/User.pm" - }, "Peace::DB" : { "file" : "lib/Peace/DB.pm" }, "Peace::Model::Customer" : { "file" : "lib/Peace/Model/Customer.pm" - }, - "Peace::Model::User" : { - "file" : "lib/Peace/Model/User.pm" } }, "release_status" : "stable", diff --git a/lib/Peace/DAO/Customer.pm b/lib/Peace/DAO/Customer.pm index 3fee73d..b4a59a9 100644 --- a/lib/Peace/DAO/Customer.pm +++ b/lib/Peace/DAO/Customer.pm @@ -6,7 +6,7 @@ use strict; use warnings; use Params::ValidationCompiler qw/validation_for/; -use Types::Standard qw/HasMethods InstanceOf/; +use Types::Standard qw/HasMethods InstanceOf Str/; { my $validator = validation_for( @@ -28,21 +28,55 @@ use Types::Standard qw/HasMethods InstanceOf/; { my $validator = validation_for( params => { - customer => { type => InstanceOf['Peace::Model::Customer'] }, + customer => { type => InstanceOf ['Peace::Model::Customer'] }, } ); + sub create { - my $self = shift; - my %params = $validator->(@_); + my $self = shift; + my %params = $validator->(@_); my $customer = $params{customer}; - my $dbh = $self->_dbh; - my $insert = <<'EOF'; + my $dbh = $self->_dbh; + my $insert = <<'EOF'; INSERT INTO customers (secret) VALUES (?) RETURNING uuid; EOF - my $result = $dbh->selectrow_hashref($insert, undef, $customer->secret); - my $uuid = $result->{uuid}; - $customer->uuid($uuid); - return $customer; + my $result = + $dbh->selectrow_hashref( $insert, undef, $customer->secret ); + my $uuid = $result->{uuid}; + $customer->uuid($uuid); + my $new_customer = $self->recover_by_uuid( uuid => $uuid ); + $customer->secret( $new_customer->secret ) + if defined $new_customer->secret; + $customer->date_creation( $new_customer->date_creation ) + if defined $new_customer->date_creation; + $customer->stripe_id( $new_customer->stripe_id ) + if defined $new_customer->stripe_id; + return $customer; + } +} + +{ + my $validator = validation_for( + params => { + uuid => { type => Str }, + } + ); + + sub recover_by_uuid { + my $self = shift; + my $dbh = $self->_dbh; + + my %params = $validator->(@_); + my $uuid = $params{uuid}; + + my $result = $dbh->selectrow_hashref( <<'EOF', undef, $uuid ); +SELECT uuid, date_creation, secret, stripe_id FROM customer WHERE uuid = ?; +EOF + for my $key ( keys %$result ) { + delete $result->{$key} unless defined $result->{$key}; + } + my $customer = Peace::Model::Customer->new(%$result); + return $customer; } } diff --git a/t/00002-customer-dao.t b/t/00002-customer-dao.t index 96afa31..10fe549 100644 --- a/t/00002-customer-dao.t +++ b/t/00002-customer-dao.t @@ -3,9 +3,10 @@ use v5.30.0; use strict; use warnings; -use Test::Most tests => 2; +use Test::Most tests => 6; use DBI; +use DateTime; use Peace::Model::Customer; @@ -18,22 +19,57 @@ BEGIN { my $sql = <<'EOF'; INSERT INTO customers (secret) VALUES (?) RETURNING uuid; EOF - my $uuid = 'hola'; + my $uuid = 'hola'; my $dbh = DBI->connect( 'DBI:Mock:', '', '' ); my $customer = Peace::Model::Customer->new( secret => 'hola' ); my $customer_dao = Peace::DAO::Customer->new( dbh => $dbh ); $dbh->{mock_add_resultset} = { - sql => $sql, - results => [ - [ 'uuid' ], - [ $uuid ], - ] + sql => $sql, + results => [ ['uuid'], [$uuid], ] + }; + $sql = <<'EOF'; +SELECT uuid, date_creation, secret, stripe_id FROM customer WHERE uuid = ?; +EOF + $dbh->{mock_add_resultset} = { + sql => $sql, + results => [ ['uuid', 'secret', 'date_creation', 'stripe_id'], [$uuid, 'hola', undef, undef] ], }; - ## WHEN $customer_dao->create( customer => $customer ); ## THEN is $customer->uuid, $uuid, 'Customer id correctly set after user creation.'; } + +{ + ## GIVEN + my $dbh = DBI->connect( 'DBI:Mock:', '', '' ); + my $customer_dao = Peace::DAO::Customer->new( dbh => $dbh ); + my $sql = <<'EOF'; +SELECT uuid, date_creation, secret, stripe_id FROM customer WHERE uuid = ?; +EOF + my $uuid = 'hola'; + my $date_creation = DateTime->now; + my $secret = 'hola'; + my $stripe_id = undef; + + $dbh->{mock_add_resultset} = { + sql => $sql, + results => [ + [ 'uuid', 'date_creation', 'secret', 'stripe_id' ], + [ $uuid, $date_creation, $secret, $stripe_id ], + ] + }; + + ## WHEN + my $customer = $customer_dao->recover_by_uuid( uuid => $uuid ); + + ## THEN + is $customer->uuid, $uuid, 'Uuid is recovered correctly'; + is $customer->date_creation, $date_creation, + 'Date creation is recovered correctly'; + is $customer->secret, $secret, 'Secret is recovered correctly'; + is $customer->stripe_id, $stripe_id, 'Secret is recovered correctly'; + +}