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 Parley::App::Communication::Email;
# vim: ts=8 sts=4 et sw=4 sr sta
use strict;
use warnings;

use Parley::Version;  our $VERSION = $Parley::VERSION;

use Perl6::Export::Attrs;

use Parley::App::I18N qw( :locale );

sub queue_email :Export( :email ) {
    my ($c, $options) = @_;
    $c->log->info('queuing an email');
    eval {
        my $queued_mail = $c->model('ParleyDB')->resultset('EmailQueue')->create(
            {
                sender          => $options->{headers}{from}        || q{Missing From <chisel@somewhere.com>},

                recipient_id    => $options->{recipient}->id()      || 0,
                subject         => $options->{headers}{subject}     || q{Subject Line Missing},
                text_content    => $options->{text_content}         || q{Email Body Text Missing},
                html_content    => $options->{html_content}         || undef,
            }
        );
    };
    if ($@) {
        $c->log->error($@);
        return;
    }
    $c->log->info('email queued');
    return 1; # success
}

sub send_email :Export( :email ) {
    my ($c, $options) = @_;
    my ($text_content, $html_content, $email_status);

    my $locale = first_valid_locale($c, [qw/email_templates/]);
    $c->log->debug('first_valid_locale is: ' . $locale);

    # preparing for future expansion, where we intend to build multipart emails
    # and we'll be using ->{template}{text} and ->{template}{html}
    if (            exists $options->{template}
            and ref($options->{template}) ne 'HASH'
    ) {
        $c->log->warn(
              q{DEPRECATED use of ->{template} = 'file.eml'}
            . q{: plain-text template name should be stored in }
            . q{->{template}{text} instead of ->{template}}
        );

        # put the data in the right place
        my $tpl_name = $options->{template};
        $options->{template} = {};
        $options->{template}{text} = $tpl_name;
    }

    # we don't send anything immediately ... push it into the queue of outgoing
    # messages

    # prepare the text content portion of the message - we read this from a
    # [template] file which we render
    $c->log->info(
        $c->path_to(
            'root',
            'email_templates',
            $locale
        )
    );
    $text_content = $c->view('Plain')->render(
        $c,
        $options->{template}{text},
        {
            additional_template_paths => [
                $c->path_to(
                    'root',
                    'email_templates',
                    $locale
                )
            ],

            # automatically make the person data available
            person => $options->{person},

            # pass through extra TT data
            %{ $options->{template_data} || {} },
        }
    );

    # if we have html_content, prepare that for queueing
    if (defined $options->{template}{html}) {
        $html_content = $c->view('Plain')->render(
            $c,
            $options->{template}{html},
            {
                #additional_template_paths => [ $c->config->{root} . q{/email_templates}],
                additional_template_paths => [
                    $c->path_to(
                        'root',
                        'email_templates',
                        $locale
                    )
                ],

                # automatically make the person data available
                person => $options->{person},

                # pass through extra TT data
                %{ $options->{template_data} || {} },
            }
        );
    }

    # queue the message
    $email_status = $c->queue_email(
        {
            headers => {
                from        =>     $options->{headers}{from}
                                || q{Missing From <missing.from@localhost>},
                subject     =>     $options->{headers}{subject}
                                || q{Subject Line Missing},
            },

            recipient       => $options->{person},
            text_content    => $text_content,
            html_content    => $html_content,
        },
    );

    # did we queue the email OK?
    if ($email_status) {
        $c->log->info(
              q{send_email(}
            . $options->{person}->email()
            . q{): }
            . $email_status
        );

        return 1;
    }
    else {
        $c->log->error( $email_status );
        $c->stash->{error}{message} =
            $c->localize(q{EMAIL SEND PROBLEM});
        return 0;
    }
}

1;

__END__

=head1 NAME

Parley::App::Communication::Email - email helper functions

=head1 SYNOPSIS

  use Parley::App::Communication::Email;

  send_email($c, $options);

=head1 SEE ALSO

L<Parley::Controller::Root>, L<Catalyst::Plugin::Email>, L<Catalyst>

=head1 AUTHOR

Chisel Wright C<< <chiselwright@users.berlios.de> >>

=head1 LICENSE

This library is free software, you can redistribute it and/or modify
it under the same terms as Perl itself.

=cut