package TestApp::Ticket;
use strict;
use base qw( Class::Accessor );
use Data::Dumper qw( Dumper );
use DateTime::Format::Strptime;
use File::Spec::Functions qw( catfile );
use Log::Log4perl qw( get_logger );
use Workflow::Factory qw( FACTORY );
use Workflow::Persister::RandomId;
use vars qw($VERSION);
$VERSION = '0.01';
my @FIELDS = qw( ticket_id type subject description creator
status due_date last_update );
__PACKAGE__->mk_accessors( @FIELDS );
my ( $generator );
my $due_parser = DateTime::Format::Strptime->new( pattern => '%Y-%m-%d' );
my $update_parser = DateTime::Format::Strptime->new( pattern => '%Y-%m-%d %H:%M' );
sub new {
my ( $class, $params ) = @_;
my $log = get_logger();
$log->info( "Instantiating new $class" );
my $self = bless( {}, $class );
for ( @FIELDS ) {
if ( $params->{ $_ } ) {
$self->$_( $params->{ $_ } );
$log->debug( "Assigning parameter '$_': $params->{ $_ }" );
}
}
$generator ||= Workflow::Persister::RandomId->new({ id_length => 8 });
return $self;
}
sub id {
goto &ticket_id;
}
sub fetch {
my ( $class, $id ) = @_;
my $log = get_logger();
$log->info( "Fetching existing ticket with ID '$id'" );
my $persister = FACTORY->get_persister( 'TestPersister' );
if ( $persister->isa( 'Workflow::Persister::DBI' ) ) {
my $ticket_fields = 'type, subject, description, creator, status, due_date, last_update';
my $sql = 'SELECT %s FROM ticket WHERE ticket_id = ?';
$sql = sprintf( $sql, $ticket_fields );
$log->debug( "Will use SQL\n$sql" );
$log->debug( "Will use parameters: $id" );
my $dbh = $persister->handle;
my ( $sth );
eval {
$sth = $dbh->prepare( $sql );
$sth->execute( $id );
};
if ( $@ ) {
$log->error( "Error fetching ticket: $@" );
die "Failed to retrieve ticket: $@";
}
my $row = $sth->fetchrow_arrayref;
$log->debug( "Got database row: ", Dumper( $row ) );
return $class->new({
ticket_id => $id,
type => $row->[0],
subject => $row->[1],
description => $row->[2],
creator => $row->[3],
status => $row->[4],
due_date => $due_parser->parse_datetime( $row->[5] ),
last_update => $update_parser->parse_datetime( $row->[6] )
});
}
elsif ( $persister->isa( 'Workflow::Persister::SPOPS' ) ) {
my $p_ticket = eval { My::Persist::Ticket->fetch( $id ) };
if ( $@ ) {
$log->error( "Error fetching ticket: $@" );
die "Failed to retrieve ticket: $@";
}
return $class->new({
ticket_id => $p_ticket->id,
type => $p_ticket->type,
subject => $p_ticket->subject,
description => $p_ticket->description,
creator => $p_ticket->creator,
status => $p_ticket->status,
due_date => $p_ticket->due_date,
last_update => $p_ticket->last_update,
});
}
elsif ( $persister->isa( 'Workflow::Persister::File' ) ) {
my $ticket_path = catfile( $persister->path, "${id}_ticket" );
return $persister->constitute_object( $ticket_path );
}
}
sub create {
my ( $self ) = @_;
my $log = get_logger();
my $id = $generator->pre_fetch_id();
$log->info( "Creating new ticket with ID '$id'" );
my $persister = FACTORY->get_persister( 'TestPersister' );
if ( $persister->isa( 'Workflow::Persister::DBI' ) ) {
my $due_date = ( ref $self->due_date )
? $self->due_date->strftime( '%Y-%m-%d' )
: $self->due_date;
my $update_date = ( ref $self->last_update )
? $self->last_update->strftime( '%Y-%m-%d %H:%M' )
: DateTime->now->strftime( '%Y-%m-%d %H:%M' );
my @fields = qw( ticket_id type subject description
creator status due_date last_update );
my @values = ( $id, $self->type, $self->subject, $self->description,
$self->creator, $self->status, $due_date, $update_date );
my $sql = 'INSERT INTO ticket ( %s ) VALUES ( %s )';
$sql = sprintf( $sql, join( ', ', @fields ),
join( ', ', map { '?' } @values ) );
$log->debug( "Will use SQL\n$sql" );
$log->debug( "Will use parameters: ", join( ', ', @values ) );
my $dbh = $persister->handle;
my ( $sth );
eval {
$sth = $dbh->prepare( $sql );
$sth->execute( @values );
};
if ( $@ ) {
$log->error( "Error creating ticket: $@" );
die "Failed to create ticket: $@";
}
}
elsif ( $persister->isa( 'Workflow::Persister::SPOPS' ) ) {
my $ticket = eval {
My::Persist::Ticket->new({
ticket_id => $id,
type => $self->type,
subject => $self->subject,
description => $self->description,
creator => $self->creator,
status => $self->status,
due_date => $self->due_date,
last_update => $self->last_update,
})->save()
};
if ( $@ ) {
$log->error( "Error creating ticket: $@" );
die "Failed to create ticket: $@";
}
}
elsif ( $persister->isa( 'Workflow::Persister::File' ) ) {
my $ticket_path = catfile( $persister->path, "${id}_ticket" );
$persister->serialize_object( $ticket_path, $self );
}
$log->info( "Ticket '$id' created ok" );
$self->ticket_id( $id );
return $self;
}
sub update {
my ( $self ) = @_;
my $log = get_logger();
my $persister = FACTORY->get_persister( 'TestPersister' );
if ( $persister->isa( 'Workflow::Persister::DBI' ) ) {
my $sql = 'UPDATE ticket ' .
'SET status = ?, due_date = ?, last_update = ? ' .
'WHERE ticket_id = ?';
my @values = ( $self->status,
$self->due_date->strftime( '%Y-%m-%d' ),
$self->last_update->strftime( '%Y-%m-%d %H:%M' ),
$self->id );
$log->debug( "Will use SQL\n$sql" );
$log->debug( "Will use parameters: ", join( ', ', @values ) );
my $dbh = $persister->handle;
my ( $sth );
eval {
$sth = $dbh->prepare( $sql );
$sth->execute( @values );
};
if ( $@ ) {
die "Failed to update ticket: $@";
}
}
elsif ( $persister->isa( 'Workflow::Persister::SPOPS' ) ) {
my $p_ticket = eval { My::Persist::Ticket->fetch( $self->id ) };
if ( $@ ) {
die "Failed to fetch ticket '", $self->id, "' for update: $@\n";
}
$p_ticket->status( $self->status );
$p_ticket->due_date( $self->due_date );
$p_ticket->last_update( $self->last_update );
eval { $p_ticket->save };
if ( $@ ) {
die "Failed to update ticket: $@";
}
}
elsif ( $persister->isa( 'Workflow::Persister::File' ) ) {
my $id = $self->id;
my $ticket_path = catfile( $persister->path, "${id}_ticket" );
$persister->serialize_object( $self, $ticket_path );
}
return $self;
}
1;
syntax highlighted by Code2HTML, v. 0.9.1