package Sietima::Role::SubscriberOnly::Moderate;
use Moo::Role;
use Sietima::Policy;
use Email::Stuffer;
use Email::MIME;
use namespace::clean;
with 'Sietima::Role::SubscriberOnly',
'Sietima::Role::WithMailStore',
'Sietima::Role::WithAdmin';
sub munge_mail_from_non_subscriber ($self,$mail) {
my $id = $self->mail_store->store($mail,'moderation');
my $notice = Email::Stuffer
->from($self->return_path)
->to($self->admin)
->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');
$self->transport->send($notice->email,{
from => $self->return_path,
to => [ $self->admin ],
});
return;
}
sub resume ($self,$mail_id) {
my $mail = $self->mail_store->retrieve_by_id($mail_id);
local $Sietima::Role::SubscriberOnly::let_it_pass=1;
$self->handle_mail($mail);
$self->mail_store->remove($mail_id);
}
sub drop ($self,$mail_id) {
$self->mail_store->remove($mail_id);
}
around command_line_spec => sub ($orig,$self) {
my $spec = $self->$orig();
$spec->{subcommands}{'resume-held'} = {
op => sub ($self,$runner,$args) {
$self->resume($runner->parameters->{'mail-id'});
},
summary => 'resume the given mail, currently held for moderation',
parameters => [
{
name => 'mail-id',
required => 1,
summary => 'id of the mail to resume',
},
],
};
$spec->{subcommands}{'drop-held'} = {
op => sub ($self,$runner,$args) {
$self->drop($runner->parameters->{'mail-id'});
},
summary => 'drop the given mail, currently held for moderation',
parameters => [
{
name => 'mail-id',
required => 1,
summary => 'id of the mail to drop',
},
],
};
return $spec;
};
1;