package Sietima::Role::SubscriberOnly::Moderate;
use Moo::Role;
use Sietima::Policy;
use Email::Stuffer;
use Email::MIME;
use namespace::clean;
our $VERSION = '1.0.2';
with 'Sietima::Role::SubscriberOnly',
'Sietima::Role::WithMailStore',
'Sietima::Role::WithOwner';
sub munge_mail_from_non_subscriber ($self,$mail) {
my $id = $self->mail_store->store($mail,'moderation');
my $notice = Email::Stuffer
->from($self->return_path->address)
->to($self->owner->address)
->subject("Message held for moderation - ".$mail->header_str('subject'))
->text_body("Use id $id to refer to it")
->attach(
$mail->as_string,
content_type => 'message/rfc822',
encoding => '7bit',
);
$self->transport->send($notice->email,{
from => $self->return_path,
to => [ $self->owner ],
});
return;
}
sub resume ($self,$mail_id) {
my $mail = $self->mail_store->retrieve_by_id($mail_id);
$self->ignoring_subscriberonly(
sub($s) { $s->handle_mail($mail) },
);
$self->mail_store->remove($mail_id);
}
sub drop ($self,$mail_id) {
$self->mail_store->remove($mail_id);
}
sub list_mails_in_moderation_queue ($self,$runner,@) {
my $mails = $self->mail_store->retrieve_by_tags('moderation');
$runner->out(sprintf 'There are %d messages held for moderation:',scalar($mails->@*));
for my $mail ($mails->@*) {
$runner->out(sprintf '* %s %s "%s" (%s)',
$mail->{id},
$mail->{mail}->header_str('From')//'<no from>',
$mail->{mail}->header_str('Subject')//'<no subject>',
$mail->{mail}->header_str('Date')//'<no date>',
);
}
}
sub show_mail_from_moderation_queue ($self,$runner,@) {
my $id = $runner->parameters->{'mail-id'};
my $mail = $self->mail_store->retrieve_by_id($id);
$runner->out("Message $id:");
$runner->out($mail->as_string =~ s{\r\n}{\n}gr);
}
around command_line_spec => sub ($orig,$self) {
my $spec = $self->$orig();
my $list_mail_ids = sub ($self,$runner,$args) {
$self->mail_store->retrieve_ids_by_tags('moderation');
};
my $etc = sub($cmd) {
return (
summary => "$cmd the given mail, currently held for moderation",
parameters => [
{
name => 'mail-id',
required => 1,
summary => "id of the mail to $cmd",
completion => { op => $list_mail_ids },
},
],
);
};
$spec->{subcommands}{'list-held'} = {
op => 'list_mails_in_moderation_queue',
summary => 'list all mails currently held for moderation',
};
$spec->{subcommands}{'show-held'} = {
op => 'show_mail_from_moderation_queue',
$etc->('show'),
};
$spec->{subcommands}{'resume-held'} = {
op => sub ($self,$runner,$args) {
$self->resume($runner->parameters->{'mail-id'});
},
$etc->('resume'),
};
$spec->{subcommands}{'drop-held'} = {
op => sub ($self,$runner,$args) {
$self->drop($runner->parameters->{'mail-id'});
},
$etc->('drop'),
};
return $spec;
};
1;
__END__