/usr/local/CPAN/Foorum/Foorum/ResultSet/ScheduledEmail.pm
package Foorum::ResultSet::ScheduledEmail;
use strict;
use warnings;
our $VERSION = '1.001000';
use base 'DBIx::Class::ResultSet';
use Foorum::Utils qw/generate_random_word/;
use Foorum::Logger qw/error_log/;
sub send_activation {
my ( $self, $user, $new_email, $opts ) = @_;
my $schema = $self->result_source->schema;
my $cache = $schema->cache();
my $tt2 = $schema->tt2();
my $config = $schema->config();
my $lang = $opts->{lang};
my $activation_code;
my $rs = $schema->resultset('UserActivation')
->find( { user_id => $user->user_id, } );
if ($rs) {
$activation_code = $rs->activation_code;
} else {
$activation_code = generate_random_word(10);
my @extra_insert;
if ($new_email) {
@extra_insert = ( 'new_email', $new_email );
}
$schema->resultset('UserActivation')->create(
{ user_id => $user->user_id,
activation_code => $activation_code,
@extra_insert,
}
);
}
my $vars = {
username => $user->username,
activation_code => $activation_code,
new_email => $new_email,
config => $config,
};
my $email_body;
$tt2->process( "lang/$lang/email/activation.html", $vars, \$email_body );
$self->create(
{ email_type => 'activation',
from_email => $config->{mail}->{from_email},
to_email => $user->email,
subject => 'Your Activation Code In ' . $config->{name},
plain_body => $email_body,
time => time(),
processed => 'N',
}
);
my $client = $schema->theschwartz();
$client->insert('Foorum::TheSchwartz::Worker::SendScheduledEmail');
}
sub create_email {
my ( $self, $opts ) = @_;
my $schema = $self->result_source->schema;
my $cache = $schema->cache();
my $tt2 = $schema->tt2();
my $config = $schema->config();
my $base_path = $schema->base_path();
my $lang = $opts->{lang};
my $subject = $opts->{subject};
my $plain_body = $opts->{plain_body};
my $html_body = $opts->{html_body};
unless ( $subject and ( $plain_body or $html_body ) ) {
# find the template for TT use
my $template_prefix;
my $template_name = $opts->{template};
my $file_prefix
= "$base_path/templates/lang/$lang/email/$template_name";
if ( -e $file_prefix . '.txt' or -e $file_prefix . '.html' ) {
$template_prefix = "lang/$lang/email/$template_name";
} elsif ( 'en' ne $lang ) {
# try to use lang=en for default
$file_prefix
= "$base_path/templates/lang/en/email/$template_name";
if ( -e $file_prefix . '.txt' or -e $file_prefix . '.html' ) {
$template_prefix = 'lang/en/email/' . $template_name;
}
}
unless ($template_prefix) {
error_log( $schema, 'error',
"Template not found in Email.pm notification with params: $template_name"
);
return 0;
}
# we will set 'base' in cron manually, so we put %$stash before %{$opts->{stash}}
my $stash = $opts->{stash};
$stash->{config} = $config;
# prepare TXT format
if ( -e $file_prefix . '.txt' ) {
$tt2->process( $template_prefix . '.txt', $stash, \$plain_body );
}
if ( -e $file_prefix . '.html' ) {
$tt2->process( $template_prefix . '.html', $stash, \$html_body );
}
# get the subject from $plain_body or $html_body
# the format is ########Title Subject#########
if ( $plain_body and $plain_body =~ s/\#{6,}(.*?)\#{6,}\s+//isg ) {
$subject = $1;
}
if ( $html_body and $html_body =~ s/\#{6,}(.*?)\#{6,}\s+//isg ) {
$subject = $1;
}
$subject ||= 'Notification From ' . $config->{name};
}
my $to = $opts->{to};
my $from = $opts->{from} || $config->{mail}->{from_email};
my $email_type = $opts->{email_type} || $opts->{template};
$self->create(
{ email_type => $email_type,
from_email => $from,
to_email => $to,
subject => $subject,
plain_body => $plain_body,
html_body => $html_body,
time => time(),
processed => 'N',
}
);
my $client = $schema->theschwartz();
$client->insert('Foorum::TheSchwartz::Worker::SendScheduledEmail');
return 1;
}
1;