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 FriendsPhotos;
use base 'CGI::Application';
use strict;

use lib ('../../lib','/usr/share/perl5');
use CGI::Application::ValidateRM;
use CGI::Uploader;

sub setup {
	my $self = shift;

	$self->start_mode('add_form');

	$self->run_modes([qw/
			add_form
			add_process

			edit_form
			edit_process

		/]);
	my $uploader_args  = $self->param('uploader_args') || die "must pass uploader PARAM";
	my $u = CGI::Uploader->new(%$uploader_args);
	$self->param('uploader',$u);

}

sub add_form {
	my $self = shift;
	my $t = $self->load_tmpl('photo-add.html');
	return $t->output;

};

sub add_process {
	my $self = shift;

	my $q = $self->query;
	my $query_hash = $q->Vars;
	my $dbh = $self->param('dbh');
	my $u   = $self->param('uploader');

	my ($results, $err_page) = $self->check_rm('add_form', {
			required => [qw/full_name photo/],
			msgs => { prefix => 'err_' },
	 });
 	return $err_page if $err_page;
	my $valid = $results->valid;

	my $friend;
	eval {
		 $dbh->{RaiseError} = 1;

		 $valid->{friend_id} = $dbh->selectrow_array("SELECT nextval('friend_id_seq')");
		 $friend = $u->store_uploads($valid);

		 require SQL::Abstract;
		 my $sql = SQL::Abstract->new;
		 my($stmt, @bind) = $sql->insert('address_book',$friend);

		 $dbh->do($stmt,{},@bind);
	};
	if ($@) {
		return "failure: $@";
	}
	else {
		my $new_q = CGI->new({
				success => 1,
				rm  => 'edit_form',
				friend_id => $friend->{friend_id}
			}
			);
		$self->header_type('redirect');
		$self->header_props( -url=> $ENV{SCRIPT_NAME}.'?'.$new_q->query_string );
	}
}

sub edit_form {
	my $self = shift;
	my $msgs = shift;

	my $q = $self->query;
	my $dbh = $self->param('dbh');
	my $friend_id = $q->param('friend_id');

	die "no friend_id found" unless $friend_id;

	my $t = $self->load_tmpl('photo-edit.html',die_on_bad_params=>0,);
	$t->param($msgs) if $msgs;
	$t->param(msg => $q->param('msg'));

	my $friend = $dbh->selectrow_hashref("SELECT * FROM address_book WHERE friend_id = ?",{},$friend_id);

	if ($friend->{photo_id}) {
		my $u   = $self->param('uploader');
		my $href = $u->fk_meta(
			table => 'address_book',
			where => { friend_id => $friend_id },
			prefixes => [qw/photo photo_thumbnail/]);
		$t->param($href);
	}

	require HTML::FillInForm;
	my $fif = HTML::FillInForm->new();
	return $fif->fill(scalarref=>\$t->output,fdat=>$friend);

}

sub edit_process {
	my $self = shift;

	my ($results, $err_page) = $self->check_rm('edit_form', {
			require_some => {
				photo_or_photo_id => [qw/photo photo_id/],
			},
			required => [qw/full_name friend_id/],
			msgs => { prefix => 'err_' },
	 });
 	return $err_page if $err_page;

	my $dbh = $self->param('dbh');
	my $q = $self->query;
	my $u   = $self->param('uploader');
	my $friend = $results->valid;

	eval {
		$dbh->{RaiseError} = 1;
		my @fk_names = $u->delete_checked_uploads;
		map { $friend->{$_} = undef } @fk_names;
		delete $friend->{photo_delete};

		$friend = $u->store_uploads($friend);
		require SQL::Abstract;
		my $sql = SQL::Abstract->new();
		my ($stmt,@bind) = $sql->update('address_book',$friend, { friend_id => $friend->{friend_id} });
		$dbh->do($stmt,{},@bind);
	};
	if ($@) {
		return "Failure: $@";
	}
	else {
		my $new_q = CGI->new({
				success => 1,
				rm  => 'edit_form',
				friend_id => $friend->{friend_id}
			}
		);
		$self->header_type('redirect');
		$self->header_props( -url=> $ENV{SCRIPT_NAME}.'?'.$new_q->query_string );
	}
}

1;