summaryrefslogtreecommitdiffstats
path: root/extensions/PhabBugz/lib/WebService.pm
diff options
context:
space:
mode:
Diffstat (limited to 'extensions/PhabBugz/lib/WebService.pm')
-rw-r--r--extensions/PhabBugz/lib/WebService.pm112
1 files changed, 112 insertions, 0 deletions
diff --git a/extensions/PhabBugz/lib/WebService.pm b/extensions/PhabBugz/lib/WebService.pm
new file mode 100644
index 000000000..0e2574582
--- /dev/null
+++ b/extensions/PhabBugz/lib/WebService.pm
@@ -0,0 +1,112 @@
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# This Source Code Form is "Incompatible With Secondary Licenses", as
+# defined by the Mozilla Public License, v. 2.0.
+
+package Bugzilla::Extension::PhabBugz::WebService;
+
+use 5.10.1;
+use strict;
+use warnings;
+
+use base qw(Bugzilla::WebService);
+
+use Bugzilla::Attachment;
+use Bugzilla::Bug;
+use Bugzilla::BugMail;
+use Bugzilla::Error;
+use Bugzilla::User;
+use Bugzilla::Util qw(correct_urlbase detaint_natural);
+use Bugzilla::WebService::Constants;
+
+use Bugzilla::Extension::PhabBugz::Util qw(
+ create_revision_attachment
+ create_private_revision_policy
+ edit_revision_policy
+ get_bug_role_phids
+ get_project_phid
+ get_revision_by_id
+ intersect
+ make_revision_public
+ request
+);
+
+use Data::Dumper;
+
+use constant PUBLIC_METHODS => qw(
+ revision
+);
+
+sub revision {
+ my ($self, $params) = @_;
+
+ unless (defined $params->{revision} && detaint_natural($params->{revision})) {
+ ThrowCodeError('param_required', { param => 'revision' })
+ }
+
+ my $user = Bugzilla->set_user(Bugzilla::User->new({ name => 'conduit@mozilla.bugs' }));
+
+ # Obtain more information about the revision from Phabricator
+ my $revision_id = $params->{revision};
+ my $revision = get_revision_by_id($revision_id);
+
+ my $revision_phid = $revision->{phid};
+ my $revision_title = $revision->{fields}{title} || 'Unknown Description';
+ my $bug_id = $revision->{fields}{'bugzilla.bug-id'};
+
+ my $bug = Bugzilla::Bug->check($bug_id);
+
+ # If bug is public then remove privacy policy
+ my $result;
+ if (!@{ $bug->groups_in }) {
+ $result = make_revision_public($revision_id);
+ }
+ # Else bug is private
+ else {
+ my $phab_sync_groups = Bugzilla->params->{phabricator_sync_groups}
+ || ThrowUserError('invalid_phabricator_sync_groups');
+ my $sync_group_names = [ split('[,\s]+', $phab_sync_groups) ];
+
+ my $bug_groups = $bug->groups_in;
+ my $bug_group_names = [ map { $_->name } @$bug_groups ];
+
+ my @set_groups = intersect($bug_group_names, $sync_group_names);
+
+ # If bug privacy groups do not have any matching synchronized groups,
+ # then leave revision private and it will have be dealt with manually.
+ if (!@set_groups) {
+ ThrowUserError('invalid_phabricator_sync_groups');
+ }
+
+ my $policy_phid = create_private_revision_policy($bug, \@set_groups);
+ my $subscribers = get_bug_role_phids($bug);
+ $result = edit_revision_policy($revision_phid, $policy_phid, $subscribers);
+ }
+
+ my $attachment = create_revision_attachment($bug, $revision_id, $revision_title);
+
+ Bugzilla::BugMail::Send($bug_id, { changer => $user });
+
+ return {
+ result => $result,
+ attachment_id => $attachment->id,
+ attachment_link => correct_urlbase() . "attachment.cgi?id=" . $attachment->id
+ };
+}
+
+sub rest_resources {
+ return [
+ qr{^/phabbugz/revision/([^/]+)$}, {
+ POST => {
+ method => 'revision',
+ params => sub {
+ return { revision => $_[0] };
+ }
+ }
+ }
+ ];
+}
+
+1;