summaryrefslogtreecommitdiffstats
path: root/extensions/Review/lib/FlagStateActivity.pm
blob: 46e9300a57b3370f62f1fa43147cb4f5d592b6ef (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
# 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 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
);


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;