package Peace::DAO::Developer; use v5.30.0; use strict; use warnings; use Params::ValidationCompiler qw/validation_for/; use Types::Standard qw/HasMethods InstanceOf Str/; use DateTime::Format::Pg; { my $validator = validation_for( params => { dbh => { type => HasMethods ['selectrow_hashref'] }, } ); sub new { my $class = shift; my %params = $validator->(@_); my $self = bless {}, $class; $self->{dbh} = $params{dbh}; return $self; } } { my $validator = validation_for( params => { developer => { type => InstanceOf ['Peace::Model::Developer'] }, } ); sub create { my $self = shift; my %params = $validator->(@_); my $developer = $params{developer}; my $dbh = $self->_dbh; my $insert = <<'EOF'; INSERT INTO developers (secret_bcrypt, name, surname, email, country, verified) VALUES (?, ?, ?, ?, ?, ?) RETURNING uuid; EOF my $result; eval { $result = $dbh->selectrow_hashref( $insert, undef, $developer->secret_bcrypt, $developer->name, $developer->surname, $developer->email, $developer->country, $developer->verified ); }; if ($@) { if ($@ =~ /duplicate key value/) { die "Email already registered."; } die $@; } my $uuid = $result->{uuid}; $developer->uuid($uuid); my $new_developer = $self->recover_by_uuid( uuid => $uuid ); $developer->date_creation( $new_developer->date_creation ) if defined $new_developer->date_creation; return $developer; } } { my $validator = validation_for( params => { uuid => { type => Str }, } ); sub recover_by_uuid { my $self = shift; my %params = $validator->(@_); my $uuid = $params{uuid}; my $dbh = $self->_dbh; my $result = $dbh->selectrow_hashref( <<'EOF', undef, $uuid ); SELECT uuid, date_creation, secret_bcrypt, name, surname, email, stripe_id, country, verified FROM developers WHERE uuid = ?; EOF for my $key (keys %$result) { delete $result->{$key} unless defined $result->{$key}; } if ( exists $result->{date_creation} ) { my $iso8601 = DateTime::Format::Pg->new; $result->{date_creation} = $iso8601->parse_datetime( $result->{date_creation} ); } my $developer = Peace::Model::Developer->new(%$result); return $developer; } } sub _dbh { my $self = shift; return $self->{dbh}; } 1; =encoding utf8 =head1 NAME Peace::DAO::Developer - The database access object of developers. =head1 SYNOPSIS my $developer_dao = Peace::DAO::Developer->new( dbh => $dbh ); $developer_dao->create( developer => $developer); my $developer = $developer_dao->recover_by_uuid( uuid => $uuid ); =head1 DESCRIPTION Peace::DAO::Developer allows you to make database operations over the developers table like recover or create. =head1 INSTANCE METHODS Peace::DAO::Developer implements the following instance methods: =head2 new my $developer_dao = Peace::DAO::Developer->new( dbh => $dbh ); Builds a L object. =head1 METHODS Peace::DAO::Developer implements the following methods: =head2 create $developer_dao->create( developer => $developer ); Creates a representation in database of the passed developer object. As a side effect sets the fields uuid and date_creation in the passed object. =head2 recover_by_uuid my $developer = $developer_dao->recover_by_uuid( uuid => $uuid ); Recovers the L associated from an uuid from database. =head1 SEE ALSO L, L