App-SD
view release on metacpan or search on metacpan
lib/App/SD/Replica/rt.pm view on Meta::CPAN
package App::SD::Replica::rt;
use Any::Moose;
extends qw/App::SD::ForeignReplica/;
use Params::Validate qw(:all);
use File::Temp 'tempdir';
use Memoize;
use Try::Tiny;
use constant scheme => 'rt';
use constant pull_encoder => 'App::SD::Replica::rt::PullEncoder';
use constant push_encoder => 'App::SD::Replica::rt::PushEncoder';
use Prophet::ChangeSet;
has rt => ( isa => 'RT::Client::REST', is => 'rw');
has remote_url => ( isa => 'Str', is => 'rw');
has rt_queue => ( isa => 'Str', is => 'rw');
has query => ( isa => 'Str', is => 'rw');
has foreign_username => ( isa => 'Str', is => 'rw' );
sub BUILD {
my $self = shift;
# Require rather than use to defer load
try {
require RT::Client::REST;
require RT::Client::REST::User;
require RT::Client::REST::Ticket;
} catch {
warn $_ if $ENV{PROPHET_DEBUG};
die "RT::Client::REST is required to sync with RT foreign replicas.\n";
};
my ( $server, $type, $query ) = $self->{url} =~ m{^rt:(https?://.*?)\|(.*?)\|(.*)$}
or die "Can't parse RT server spec. Expected 'rt:http://example.com|QUEUE|QUERY'.\n"
."Try: 'rt:http://example.com/|General|'.\n";
my $uri = URI->new($server);
my ($username, $password) = $self->extract_auth_from_uri($server);
$self->rt_queue($type);
$self->query( ( $query ? "($query) AND " :"") . " Queue = '$type'" );
$self->rt( RT::Client::REST->new( server => $server ) );
if ( $password ) {
try {
$self->rt->login( username => $username, password => $password );
} catch {
die "Bad username or password specified in URL! ".
"Error message was:\n$_\n";
};
}
else {
($username, $password) = $self->login_loop(
uri => $uri,
username => $username,
login_callback => sub {
my ($self, $username, $password) = @_;
$self->rt->login( username => $username, password => $password );
},
);
}
}
sub foreign_username { return shift->rt_username(@_) }
( run in 0.798 second using v1.01-cache-2.11-cpan-5fbc6bb55f2 )