allow usage of a pool of mediawiki updaters instead of just single-process
[scpubgit/System-Introspector-Report.git] / lib / System / Introspector / Report / Publish / MediaWiki / Updater.pm
CommitLineData
8a186887 1package System::Introspector::Report::Publish::MediaWiki::Updater;
2use Moo;
3use Try::Tiny;
4use Module::Runtime qw( use_module );
5use Log::Contextual::WarnLogger;
6use Log::Contextual qw( :log ),
7 -default_logger => Log::Contextual::WarnLogger->new({
8 env_prefix => 'SI_REPORT_MEDIAWIKI_UPDATER',
9 levels => [qw( error fatal warn info trace debug )],
10 });
11
12has connection => (is => 'ro', lazy => 1, builder => 1, handles => {
13 get_page => 'get',
14 put_page => 'put',
15});
16
17sub _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
31sub process {
32 my ($self, $stream) = @_;
33 while (my $report = $stream->()) {
34 $self->_process_page(@$report);
35 }
36 return 1;
37}
38
39sub _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
67with $_ for qw(
68 System::Introspector::Report::Publish::MediaWiki::HasConnectInfo
69);
70
711;