ff5f61f74caec123bd172bd328cd72674bc560c1
[scpubgit/System-Introspector-Report.git] / lib / System / Introspector / Report / Publish / MediaWiki / Updater.pm
1 package System::Introspector::Report::Publish::MediaWiki::Updater;
2 use Moo;
3 use Try::Tiny;
4 use Module::Runtime qw( use_module );
5 use Log::Contextual::WarnLogger;
6 use Log::Contextual qw( :log ),
7   -default_logger => Log::Contextual::WarnLogger->new({
8     env_prefix => 'SI_REPORT_MEDIAWIKI_UPDATER',
9     levels      => [qw( error warn info debug trace )],
10   });
11
12 has connection => (is => 'ro', lazy => 1, builder => 1, handles => {
13   get_page => 'get',
14   put_page => 'put',
15 });
16
17 sub _build_connection {
18   my ($self) = @_;
19   return use_module($self->connection_class)->new(
20     api_uri         => $self->api_uri,
21     username        => $self->username,
22     password        => $self->password,
23     allow_create    => 1,
24     $self->http_auth ? (
25       http_auth  => 1,
26       http_realm => $self->http_realm,
27     ) : (),
28   );
29 }
30
31 sub process {
32   my ($self, $stream) = @_;
33   while (my $report = $stream->()) {
34     $self->_process_page(@$report);
35   }
36   return 1;
37 }
38
39 sub _process_page {
40   my ($self, $page_name, $options, $reports) = @_;
41   unless (scalar @$reports) {
42     log_debug { "Skipping page '$page_name': No reports to publish" };
43     return 1;
44   }
45   my $do_create = $options->{create};
46   return try {
47     my $page = $self->get_page($page_name);
48     if ($page->is_new and not $do_create) {
49       log_trace { "Skipping page '$page_name': Does not yet exist" };
50       return 1;
51     }
52     my $is_changed = $page->update($reports);
53     unless ($is_changed) {
54       log_debug { "Not pushing page '$page_name': No changes" };
55       return 1;
56     }
57     log_debug { "Updating page '$page_name'" };
58     $self->put_page($page);
59     return 1;
60   }
61   catch {
62     log_error { "Error during page update: $_" };
63     return 1;
64   };
65 }
66
67 with $_ for qw(
68   System::Introspector::Report::Publish::MediaWiki::HasConnectInfo
69 );
70
71 1;