From 7ffeac7bc7b627252ab4ffa0241a9a589c38046b Mon Sep 17 00:00:00 2001 From: sergiotarxz Date: Mon, 14 Mar 2022 19:14:05 +0100 Subject: [PATCH] Adding customer object. --- Build.PL | 5 ++ MYMETA.json | 52 ++++++++++++++++ lib/Peace/DAO/{User.pm => Customer.pm} | 14 ++++- lib/Peace/DB.pm | 9 ++- lib/Peace/Model/Customer.pm | 86 ++++++++++++++++++++++++++ lib/Peace/Model/User.pm | 35 ----------- t/00001-customer-model.t | 35 +++++++++++ t/00002-customer-dao.t | 39 ++++++++++++ t/00003-db.t | 10 +++ t/00004-peace.t | 10 +++ 10 files changed, 254 insertions(+), 41 deletions(-) create mode 100644 MYMETA.json rename lib/Peace/DAO/{User.pm => Customer.pm} (61%) create mode 100644 lib/Peace/Model/Customer.pm delete mode 100644 lib/Peace/Model/User.pm create mode 100644 t/00001-customer-model.t create mode 100644 t/00002-customer-dao.t create mode 100644 t/00003-db.t create mode 100644 t/00004-peace.t diff --git a/Build.PL b/Build.PL index 8a4b3a6..e24f8de 100644 --- a/Build.PL +++ b/Build.PL @@ -5,8 +5,13 @@ my $home = $ENV{HOME}; my $build = Module::Build->new( module_name => 'Peace', license => 'AGPLv3', + dist_author => 'Sergio Iglesias ', + dist_abstract => 'Peace application shop.', requires => { 'Mojolicious' => 0, + 'DBI' => 0, + 'DBD::Pg' => 0, + 'DBD::Mock' => 0, }, install_path => { 'templates' => "$HOME/.local/share/peace/template", diff --git a/MYMETA.json b/MYMETA.json new file mode 100644 index 0000000..ef8626d --- /dev/null +++ b/MYMETA.json @@ -0,0 +1,52 @@ +{ + "abstract" : "Peace application shop.", + "author" : [ + "Sergio Iglesias " + ], + "dynamic_config" : 0, + "generated_by" : "Module::Build version 0.4231", + "license" : [ + "unknown" + ], + "meta-spec" : { + "url" : "http://search.cpan.org/perldoc?CPAN::Meta::Spec", + "version" : 2 + }, + "name" : "Peace", + "prereqs" : { + "runtime" : { + "requires" : { + "DBD::Mock" : "0", + "DBD::Pg" : "0", + "DBI" : "0", + "Mojolicious" : "0" + } + } + }, + "provides" : { + "Peace" : { + "file" : "lib/Peace.pm" + }, + "Peace::Controller::User" : { + "file" : "lib/Peace/Controller/User.pm" + }, + "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", + "version" : 0, + "x_serialization_backend" : "JSON::PP version 4.06" +} diff --git a/lib/Peace/DAO/User.pm b/lib/Peace/DAO/Customer.pm similarity index 61% rename from lib/Peace/DAO/User.pm rename to lib/Peace/DAO/Customer.pm index f5e0806..3fee73d 100644 --- a/lib/Peace/DAO/User.pm +++ b/lib/Peace/DAO/Customer.pm @@ -1,4 +1,4 @@ -package Peace::DAO::User; +package Peace::DAO::Customer; use v5.30.0; @@ -28,13 +28,21 @@ use Types::Standard qw/HasMethods InstanceOf/; { my $validator = validation_for( params => { - user => { type => InstanceOf['Peace::Model::User'] }, + customer => { type => InstanceOf['Peace::Model::Customer'] }, } ); sub create { my $self = shift; my %params = $validator->(@_); - my $user = $params{user}; + my $customer = $params{customer}; + 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; } } diff --git a/lib/Peace/DB.pm b/lib/Peace/DB.pm index 48b84b3..2132e0f 100644 --- a/lib/Peace/DB.pm +++ b/lib/Peace/DB.pm @@ -19,12 +19,14 @@ my @migrations = ( 'CREATE EXTENSION "pgcrypto";', 'CREATE TABLE customers ( uuid UUID NOT NULL DEFAULT gen_random_uuid(), + date_creation timestamp DEFAULT NOW(), secret TEXT NOT NULL, - stripe_id TEXT NOT NULL, + stripe_id TEXT, PRIMARY KEY (uuid) );', 'CREATE TABLE developers ( uuid UUID NOT NULL DEFAULT gen_random_uuid(), + date_creation timestamp DEFAULT NOW(), name TEXT NOT NULL, surname TEXT NOT NULL, email TEXT NOT NULL, @@ -35,6 +37,7 @@ my @migrations = ( );', 'CREATE TABLE applications ( uuid UUID NOT NULL DEFAULT gen_random_uuid(), + date_creation timestamp DEFAULT NOW(), name TEXT NOT NULL, url TEXT NOT NULL, developer UUID NOT NULL, @@ -62,10 +65,10 @@ my @migrations = ( FOREIGN KEY (release) REFERENCES releases (uuid) );', 'CREATE TABLE purchases ( - uuid UUID NOT NULL DEFAULT gen_random_uuid(), customer UUID NOT NULL, application UUID NOT NULL, - PRIMARY KEY (uuid), + date timestamp DEFAULT NOW(), + PRIMARY KEY (customer, application), FOREIGN KEY (application) REFERENCES applications (uuid), FOREIGN KEY (customer) REFERENCES customers (uuid) );', diff --git a/lib/Peace/Model/Customer.pm b/lib/Peace/Model/Customer.pm new file mode 100644 index 0000000..de1dd43 --- /dev/null +++ b/lib/Peace/Model/Customer.pm @@ -0,0 +1,86 @@ +package Peace::Model::Customer; +use v5.30.0; + +use strict; +use warnings; + +use Params::ValidationCompiler qw/validation_for/; +use Types::Standard qw/Str InstanceOf Bool/; + +use DateTime; + +{ + my $validator = validation_for( + params => { + uuid => { type => Str, optional => 1 }, + date_creation => { type => InstanceOf ['DateTime'], optional => 1 }, + secret => { type => Str }, + stripe_id => { type => Str, optional => 1 }, + } + ); + + sub new { + my $class = shift; + my %params = $validator->(@_); + my $self = bless {%params}, $class; + return $self; + } +} + +{ + my $validator = + validation_for( params => [ { type => Str, optional => 1 } ] ); + + sub uuid { + my $self = shift; + if (@_) { + my ($new_uuid) = $validator->(@_); + $self->{uuid} = $new_uuid; + } + return $self->{uuid}; + } +} + +{ + my $validator = + validation_for( + params => [ { type => InstanceOf ['DateTime'], optional => 1 } ] ); + + sub date_creation { + my $self = shift; + if (@_) { + my ($new_date_creation) = $validator->(@_); + $self->{date_creation} = $new_date_creation; + } + return $self->{date_creation}; + } +} + +{ + my $validator = + validation_for( params => [ { type => Str, optional => 1 } ] ); + + sub secret { + my $self = shift; + if (@_) { + my ($new_secret) = $validator->(@_); + $self->{secret} = $new_secret; + } + return $self->{secret}; + } +} + +{ + my $validator = + validation_for( params => [ { type => Str, optional => 1 } ] ); + + sub stripe_id { + my $self = shift; + if (@_) { + my ($new_stripe_id) = $validator->(@_); + $self->{stripe_id} = $new_stripe_id; + } + return $self->{stripe_id}; + } +} +1; diff --git a/lib/Peace/Model/User.pm b/lib/Peace/Model/User.pm deleted file mode 100644 index 556ff74..0000000 --- a/lib/Peace/Model/User.pm +++ /dev/null @@ -1,35 +0,0 @@ -package Peace::Model::User; - -use v5.30.0; - -use strict; -use warnings; - -use Params::ValidationCompiler qw/validation_for/; -use Types::Standard qw/Str InstanceOf Bool/; - -use DateTime; - -{ - my $validator = validation_for( - params => { - username => { type => Str }, - firstname => { type => Str }, - lastname => { type => Str }, - email => { type => Str }, - password => { type => Str }, - date_creation => { type => InstanceOf ['DateTime'], optional => 1 }, - last_connection => - { type => InstanceOf ['DateTime'], optional => 1 }, - verified => { type => Bool }, - } - ); - - sub new { - my $class = shift; - my %params = $validator->(@_); - my $self = bless {%params}, $class; - return $self; - } -} -1; diff --git a/t/00001-customer-model.t b/t/00001-customer-model.t new file mode 100644 index 0000000..7ac77ff --- /dev/null +++ b/t/00001-customer-model.t @@ -0,0 +1,35 @@ +use v5.30.0; + +use strict; +use warnings; + +use Test::Most tests => 5; + +BEGIN { + use_ok 'Peace::Model::Customer'; +} + +{ + ## GIVEN + my $secret = 'hola'; + ## WHEN + my $customer = Peace::Model::Customer->new( secret => $secret ); + ## THEN + ok $customer->isa('Peace::Model::Customer'), + 'Instanced customer is made of Peace::Model::Customer.'; + is $customer->secret, $secret, 'Secret is correctly setup'; + is $customer->uuid, undef, 'Uuid is undef.'; +} + +{ + ## GIVEN + my $secret = 'hola'; + my $uuid = 'example'; + my $customer = Peace::Model::Customer->new( secret => $secret ); + + ## WHEN + $customer->uuid($uuid); + + ## THEN + is $customer->uuid, $uuid, 'Uuid can be set.'; +} diff --git a/t/00002-customer-dao.t b/t/00002-customer-dao.t new file mode 100644 index 0000000..96afa31 --- /dev/null +++ b/t/00002-customer-dao.t @@ -0,0 +1,39 @@ +use v5.30.0; + +use strict; +use warnings; + +use Test::Most tests => 2; + +use DBI; + +use Peace::Model::Customer; + +BEGIN { + use_ok 'Peace::DAO::Customer'; +} + +{ + ## GIVEN + my $sql = <<'EOF'; +INSERT INTO customers (secret) VALUES (?) RETURNING uuid; +EOF + 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 ], + ] + }; + + ## WHEN + $customer_dao->create( customer => $customer ); + + ## THEN + is $customer->uuid, $uuid, 'Customer id correctly set after user creation.'; +} diff --git a/t/00003-db.t b/t/00003-db.t new file mode 100644 index 0000000..1668246 --- /dev/null +++ b/t/00003-db.t @@ -0,0 +1,10 @@ +use v5.30.0; + +use strict; +use warnings; + +use Test::Most tests => 1; + +BEGIN { + use_ok 'Peace::DB'; +} diff --git a/t/00004-peace.t b/t/00004-peace.t new file mode 100644 index 0000000..5e9363a --- /dev/null +++ b/t/00004-peace.t @@ -0,0 +1,10 @@ +use v5.30.0; + +use strict; +use warnings; + +use Test::Most tests => 1; + +BEGIN { + use_ok 'Peace'; +}