summaryrefslogtreecommitdiffstats
path: root/extensions/Review/lib/FlagStateActivity.pm
blob: fcc799a79748f834c9d20be745f95534f21e3a99 (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
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
# 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::Review::FlagStateActivity;

use 5.10.1;
use strict;
use warnings;

use Bugzilla::Error qw(ThrowUserError);
use Bugzilla::Util qw(trim datetime_from);
use List::MoreUtils qw(none);

use base qw( Bugzilla::Object );

use constant DB_TABLE      => 'flag_state_activity';
use constant LIST_ORDER    => 'id';
use constant AUDIT_CREATES => 0;
use constant AUDIT_UPDATES => 0;
use constant AUDIT_REMOVES => 0;

use constant DB_COLUMNS => qw(
    id
    flag_when
    type_id
    flag_id
    setter_id
    requestee_id
    bug_id
    attachment_id
    status
);

###############################
####      Accessors      ######
###############################

use Class::XSAccessor {
    accessors => {
        id   => __PACKAGE__->ID_FIELD,
        name => __PACKAGE__->NAME_FIELD,
    },
};

sub _check_param_required {
    my ($param) = @_;

    return sub {
        my ($invocant, $value) = @_;
        $value = trim($value)
            or ThrowCodeError('param_required', {param => $param});
        return $value;
    },
}

sub _check_date {
    my ($invocant, $date) = @_;

    $date = trim($date);
    datetime_from($date)
        or ThrowUserError('illegal_date', { date   => $date,
                                            format => 'YYYY-MM-DD HH24:MI:SS' });
    return $date;
}

sub _check_status {
    my ($self, $status) = @_;

    # - Make sure the status is valid.
    # - Make sure the user didn't request the flag unless it's requestable.
    #   If the flag existed and was requested before it became unrequestable,
    #   leave it as is.
    if (none { $status eq $_ } qw( X + - ? )) {
        ThrowUserError(
            'flag_status_invalid',
            {
                id     => $self->id,
                status => $status
            }
        );
    }
    return $status;
}

use constant VALIDATORS => {
    flag_when => \&_check_date,
    type_id   => _check_param_required('type_id'),
    flag_id   => _check_param_required('flag_id'),
    setter_id => _check_param_required('setter_id'),
    bug_id    => _check_param_required('bug_id'),
    status    => \&_check_status,
};

sub flag_when     { return $_[0]->{flag_when} }
sub type_id       { return $_[0]->{type_id} }
sub flag_id       { return $_[0]->{flag_id} }
sub setter_id     { return $_[0]->{setter_id} }
sub bug_id        { return $_[0]->{bug_id} }
sub requestee_id  { return $_[0]->{requestee_id} }
sub attachment_id { return $_[0]->{attachment_id} }
sub status        { return $_[0]->{status} }

sub type {
    my ($self) = @_;
    return $self->{type} //= Bugzilla::FlagType->new({ id => $self->type_id, cache => 1 });
}

sub setter {
    my ($self) = @_;
    return $self->{setter} //= Bugzilla::User->new({ id => $self->setter_id, cache => 1 });
}

sub requestee {
    my ($self) = @_;
    return undef unless defined $self->requestee_id;
    return $self->{requestee} //= Bugzilla::User->new({ id => $self->requestee_id, cache => 1 });
}

sub bug {
    my ($self) = @_;
    return $self->{bug} //= Bugzilla::Bug->new({ id => $self->bug_id, cache => 1 });
}

sub attachment {
    my ($self) = @_;
    return $self->{attachment} //=
        Bugzilla::Attachment->new({ id => $self->attachment_id, cache => 1 });
}

1;