turn rare log messages back into debug since they shouldn't happen too often and...
[scpubgit/System-Introspector-Report.git] / lib / System / Introspector / Report / Publish / MediaWiki.pm
CommitLineData
499ebcdd 1package System::Introspector::Report::Publish::MediaWiki;
2use Moo;
0331d9cd 3use Try::Tiny;
72599a55 4use Log::Contextual qw( :log );
499ebcdd 5use aliased 'System::Introspector::Report::Publish::MediaWiki::Connection';
6
7has page_options => (
8 is => 'ro',
9 default => sub { {} },
10 init_arg => 'page',
11);
12
499ebcdd 13has connection => (is => 'ro', lazy => 1, builder => 1, handles => {
14 get_page => 'get',
15 put_page => 'put',
16});
17
7a479e54 18has api_uri => (is => 'ro', required => 1);
19has username => (is => 'ro', required => 1);
20has password => (is => 'ro', required => 1);
21has allow_create => (is => 'ro', default => sub { 0 });
22has http_auth => (is => 'ro');
23has http_realm => (is => 'ro');
0331d9cd 24
25sub _build_producer { Producer->new }
26
27sub _build_connection {
28 my ($self) = @_;
29 return Connection->new(
7a479e54 30 api_uri => $self->api_uri,
31 username => $self->username,
32 password => $self->password,
33 allow_create => $self->allow_create,
0331d9cd 34 $self->http_auth ? (
35 http_auth => 1,
36 http_realm => $self->http_realm,
37 ) : (),
38 );
39}
499ebcdd 40
41sub publish {
42 my ($self, $reports) = @_;
43 my $pages = $self->page_options;
7f86d23e 44 log_info {
45 sprintf "Pushing reports to MediaWiki at '%s'", $self->api_uri;
46 };
499ebcdd 47 for my $page (sort keys %$pages) {
48 $self->_publish_page($reports, $page, $pages->{$page});
49 }
72599a55 50 log_info { "Finished pushing to MediaWiki" };
499ebcdd 51 return 1;
52}
53
54sub _sort_reports {
55 my ($self, $reports, $included) = @_;
56 my @matchers = map {
57 $self->_prepare_matcher_from($_);
58 } ref($included) ? @{$included} : $included;
59 my @grouped;
60 for my $report (@$reports) {
61 my ($group_idx) = grep {
62 $self->_match_id($report, $matchers[$_]);
63 } 0 .. $#matchers;
64 if (defined $group_idx) {
65 push @{$grouped[$group_idx]}, $report;
66 }
67 }
68 return [ map { (@$_) } @grouped ];
69}
70
7a479e54 71sub _publish_dynamic {
72 my ($self, $reports, $page_name, $key, $options) = @_;
73 my %reports_by_key;
74 for my $report (@$reports) {
75 my $value = $report->{meta}{$key};
76 next unless defined $value;
77 push @{ $reports_by_key{$value} ||= [] }, $report;
78 }
79 for my $value (keys %reports_by_key) {
80 (my $effective_page = $page_name)
81 =~ s{\%\(meta:\Q$key\E\)}{$value};
82 my $assoc = $reports_by_key{$value};
83 $self->_publish_page($assoc, $effective_page, $options);
84 }
85 return 1;
86}
87
499ebcdd 88sub _publish_page {
21e7cc98 89 my ($self, $reports, $page_name, $options) = @_;
7a479e54 90 if ($page_name =~ m{\%\(meta:(.+?)\)}) {
91 return $self->_publish_dynamic($reports, $page_name, $1, $options);
92 }
499ebcdd 93 my $sorted = $self->_sort_reports($reports, $options->{report} || []);
7a479e54 94 unless (scalar @$sorted) {
82dc985c 95 log_debug { "Skipping page '$page_name': No reports to publish" };
7a479e54 96 return 1;
97 }
7a479e54 98 my $do_create = $options->{create};
99 return try {
0331d9cd 100 my $page = $self->get_page($page_name);
7a479e54 101 if ($page->is_new and not $do_create) {
1acc31a2 102 log_trace { "Skipping page '$page_name': Does not yet exist" };
7a479e54 103 return 1;
104 }
105 my $is_changed = $page->update($sorted);
106 unless ($is_changed) {
82dc985c 107 log_debug { "Not pushing page '$page_name': No changes" };
7a479e54 108 return 1;
109 }
ac3652dc 110 log_debug { "Updating page '$page_name'" };
0331d9cd 111 $self->put_page($page);
7a479e54 112 return 1;
0331d9cd 113 }
114 catch {
72599a55 115 log_error { "Error during page update: $_" };
7a479e54 116 return 1;
0331d9cd 117 };
499ebcdd 118}
119
120with $_ for qw(
121 System::Introspector::Report::Publish::API
122);
123
1241;