Mercurial > pub > buggler
diff lib/Benzin/Bugzilla/XmlRpcClient.pm @ 7:29309bc8d932
initial objects to work with bugzilla web service
author | cin |
---|---|
date | Fri, 04 Sep 2015 19:41:28 +0300 |
parents | |
children | cc7244ab1b9f |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/lib/Benzin/Bugzilla/XmlRpcClient.pm Fri Sep 04 19:41:28 2015 +0300 @@ -0,0 +1,70 @@ +package Benzin::Bugzilla::XmlRpcClient; +use strict; + +use LWP::UserAgent; +use XMLRPC::Lite; +use YAML::XS qw(Dump); + +use IMPL::require { + Bug => 'Benzin::Bugzilla::Bug' +}; + +use fields qw(url apikey); + +use constant { SELF => __PACKAGE__ }; + +sub new { + my $class = shift; + $class = ref $class || $class; + + my $inst = fields::new($class); + $inst->CTOR(@_); + + return $inst; +} + +sub CTOR { + my SELF $this = shift; + my %params = @_; + + $this->{url} = $params{url} or die "An url is required"; + $this->{apikey} = $params{apikey} if $params{apikey}; +} + +sub GetBugs { + my SELF $this = shift; + + return [map Bug->new($_), @{$this->_CallService( 'Bug.get', shift )->{bugs} || [] }]; +} + +sub FillBugComments { + my SELF $this = shift; + my $bugs = shift || []; + + if ( my @ids = map $_->{id}, @$bugs ) { + + my $comments = $this->_CallService( 'Bug.comments', { ids => \@ids } ); + + for my Bug $bug (@$bugs) { + map @{$comments->{$bug->{id}}->{comments} || [] }; + } + } +} + +sub _CallService { + my SELF $this = shift; + my ( $method, $params ) = @_; + + die "Method must be specified" unless $method; + $params ||= {}; + + $params->{api_key} = $this->{apikey}; + my $url = URI->new_abs( 'xmlrpc.cgi', $this->{url} ); + + my $result = XMLRPC::Lite->proxy($url)->call( $method, $params ); + + die $result->fault if $result->fault; + return $result->result; +} + +1;