The London Perl and Raku Workshop takes place on 26th Oct 2024. If your company depends on Perl, please consider sponsoring and/or attending.
package MyApp::C::CD;

use strict;
use base 'Catalyst::Base';

sub add : Local { 
    my ( $self, $c ) = @_;

    $self->_do_add($c);
    $c->stash->{output} = "Input Successful" unless scalar @{ $c->error };
}

sub add_error : Local { 
    my ( $self, $c ) = @_;

    $self->_do_add($c, 1);
    $c->stash->{output} = "Input Successful" unless scalar @{ $c->error };
}

sub add_atomic : Local { 
    my ( $self, $c ) = @_;

    $c->atomic( sub { $self->_do_add($c) } );
    $c->stash->{output} = "Input Successful" unless scalar @{ $c->error };
}

sub add_transaction : Local { 
    my ( $self, $c ) = @_;

    $c->transaction( sub { $self->_do_add($c) } );
    $c->stash->{output} = "Input Successful" unless scalar @{ $c->error };
}

sub add_trans : Local { 
    my ( $self, $c ) = @_;

    $c->trans( sub { $self->_do_add($c) } );
    $c->stash->{output} = "Input Successful" unless scalar @{ $c->error };
}

sub add_error_atomic : Local { 
    my ( $self, $c ) = @_;

    $c->atomic( sub { $self->_do_add($c, 1) } );
    $c->stash->{output} = "Input Successful" unless scalar @{ $c->error };
}

sub add_error_transaction : Local { 
    my ( $self, $c ) = @_;

    $c->transaction( sub { $self->_do_add($c, 1) } );
    $c->stash->{output} = "Input Successful" unless scalar @{ $c->error };
}

sub add_error_trans : Local { 
    my ( $self, $c ) = @_;

    $c->trans( sub { $self->_do_add($c, 1) } );
    $c->stash->{output} = "Input Successful" unless scalar @{ $c->error };
}

sub _do_add : Private {
    my ( $self, $c, $error ) = @_;

    my ($artist_name, $title, $year, $notes) = @{ $c->req->arguments };

    my $artist = MyApp::M::CDBI::Artist->find_or_create({
        name => $artist_name,
    });

    my $cd = MyApp::M::CDBI::Cd->create({
        artist => $artist,
        title  => $title,
        year   => $year,
    });

    die("Throwing an error between cd and liner_notes") if $error;

    if ( $notes ) {
        $cd->notes($notes);
        $cd->update;
    }
}

sub default : Private {
    my ( $self, $c ) = @_;

    my $cds = MyApp::M::CDBI::Cd->retrieve_all;

    my $output = join('|', qw/cdid artist title year/) . "\n";
    while ( my $cd = $cds->next ) {
        $output .= join('|', $cd, $cd->artist, $cd->title, $cd->year) . "\n";
    }

    $c->res->output($output);
}

1;