summaryrefslogtreecommitdiffstats
path: root/extensions/BzAPI/lib/Resources/Bugzilla.pm
blob: 6c436e86197a104b0686cedcc57d156ea7f86a4e (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
# 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::BzAPI::Resources::Bugzilla;

use 5.10.1;
use strict;

use Bugzilla;
use Bugzilla::Constants;
use Bugzilla::Error;
use Bugzilla::Keyword;
use Bugzilla::Product;
use Bugzilla::Status;
use Bugzilla::Field;

use Digest::MD5 qw(md5_base64);

#########################
# REST Resource Methods #
#########################

BEGIN {
    require Bugzilla::WebService::Bugzilla;
    *Bugzilla::WebService::Bugzilla::get_configuration = \&get_configuration;
}

sub rest_handlers {
    my $rest_handlers = [
        qr{^/configuration$}, {
            GET  => {
                resource => {
                    method => 'get_configuration'
                }
            }
        }
    ];
    return $rest_handlers;
}

sub get_configuration {
    my ($self) = @_;
    my $user   = Bugzilla->user;
    my $params = Bugzilla->input_params;

    # Get data from the shadow DB as they don't change very often.
    Bugzilla->switch_to_shadow_db;

    # Pass a bunch of Bugzilla configuration to the templates.
    my $vars = {};
    $vars->{'priority'}   = get_legal_field_values('priority');
    $vars->{'severity'}   = get_legal_field_values('bug_severity');
    $vars->{'platform'}   = get_legal_field_values('rep_platform');
    $vars->{'op_sys'}     = get_legal_field_values('op_sys');
    $vars->{'keyword'}    = [ map($_->name, Bugzilla::Keyword->get_all) ];
    $vars->{'resolution'} = get_legal_field_values('resolution');
    $vars->{'status'}     = get_legal_field_values('bug_status');
    $vars->{'custom_fields'} =
        [ grep {$_->is_select} Bugzilla->active_custom_fields ];

    # Include a list of product objects.
    if ($params->{'product'}) {
        my @products = $params->{'product'};
        foreach my $product_name (@products) {
            my $product = new Bugzilla::Product({ name => $product_name });
            if ($product && $user->can_see_product($product->name)) {
                push (@{$vars->{'products'}}, $product);
            }
        }
    } else {
        $vars->{'products'} = $user->get_selectable_products;
    }

    # We set the 2nd argument to 1 to also preload flag types.
    Bugzilla::Product::preload($vars->{'products'}, 1, { is_active => 1 });

    # Allow consumers to specify whether or not they want flag data.
    if (defined $params->{'flags'}) {
        $vars->{'show_flags'} = $params->{'flags'};
    }
    else {
        # We default to sending flag data.
        $vars->{'show_flags'} = 1;
    }

    # Create separate lists of open versus resolved statuses.  This should really
    # be made part of the configuration.
    my @open_status;
    my @closed_status;
    foreach my $status (@{$vars->{'status'}}) {
        is_open_state($status) ? push(@open_status, $status)
                               : push(@closed_status, $status);
    }
    $vars->{'open_status'} = \@open_status;
    $vars->{'closed_status'} = \@closed_status;

    # Generate a list of fields that can be queried.
    my @fields = @{Bugzilla::Field->match({obsolete => 0})};
    # Exclude fields the user cannot query.
    if (!Bugzilla->user->is_timetracker) {
        @fields = grep { $_->name !~ /^(estimated_time|remaining_time|work_time|percentage_complete|deadline)$/ } @fields;
    }
    $vars->{'field'} = \@fields;

    my $json;
    Bugzilla->template->process('config.json.tmpl', $vars, \$json);
    my $result = {};
    if ($json) {
        $result = $self->json->decode($json);
    }
    return $result;
}

1;