blob: 5f04b180bb05642c8515fbbb9040f52a2e3d0a6d [file] [log] [blame]
# -*- Mode: perl; indent-tabs-mode: nil -*-
#
# The contents of this file are subject to the Mozilla Public
# License Version 1.1 (the "License"); you may not use this file
# except in compliance with the License. You may obtain a copy of
# the License at http://www.mozilla.org/MPL/
#
# Software distributed under the License is distributed on an "AS
# IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
# implied. See the License for the specific language governing
# rights and limitations under the License.
#
# The Original Code is the Bugzilla Bug Tracking System.
#
# The Initial Developer of the Original Code is Everything Solved, Inc.
# Portions created by the Initial Developer are Copyright (C) 2010 the
# Initial Developer. All Rights Reserved.
#
# Contributor(s):
# Max Kanat-Alexander <mkanat@bugzilla.org>
package Bugzilla::Search::Recent;
use strict;
use base qw(Bugzilla::Object);
use Bugzilla::Constants;
use Bugzilla::Error;
use Bugzilla::Util;
#############
# Constants #
#############
use constant DB_TABLE => 'profile_search';
use constant LIST_ORDER => 'id DESC';
# Do not track buglists viewed by users.
use constant AUDIT_CREATES => 0;
use constant AUDIT_UPDATES => 0;
use constant AUDIT_REMOVES => 0;
use constant DB_COLUMNS => qw(
id
user_id
bug_list
list_order
);
use constant VALIDATORS => {
user_id => \&_check_user_id,
bug_list => \&_check_bug_list,
list_order => \&_check_list_order,
};
use constant UPDATE_COLUMNS => qw(bug_list list_order);
###################
# DB Manipulation #
###################
sub create {
my $class = shift;
my $dbh = Bugzilla->dbh;
$dbh->bz_start_transaction();
my $search = $class->SUPER::create(@_);
my $user_id = $search->user_id;
# Enforce there only being SAVE_NUM_SEARCHES per user.
my $min_id = $dbh->selectrow_array(
'SELECT id FROM profile_search WHERE user_id = ? ORDER BY id DESC '
. $dbh->sql_limit(1, SAVE_NUM_SEARCHES), undef, $user_id);
if ($min_id) {
$dbh->do('DELETE FROM profile_search WHERE user_id = ? AND id <= ?',
undef, ($user_id, $min_id));
}
$dbh->bz_commit_transaction();
return $search;
}
sub create_placeholder {
my $class = shift;
return $class->create({ user_id => Bugzilla->user->id,
bug_list => '' });
}
###############
# Constructor #
###############
sub check {
my $class = shift;
my $search = $class->SUPER::check(@_);
my $user = Bugzilla->user;
if ($search->user_id != $user->id) {
ThrowUserError('object_does_not_exist', { id => $search->id });
}
return $search;
}
sub check_quietly {
my $class = shift;
my $error_mode = Bugzilla->error_mode;
Bugzilla->error_mode(ERROR_MODE_DIE);
my $search = eval { $class->check(@_) };
Bugzilla->error_mode($error_mode);
return $search;
}
sub new_from_cookie {
my ($invocant, $bug_ids) = @_;
my $class = ref($invocant) || $invocant;
my $search = { id => 'cookie',
user_id => Bugzilla->user->id,
bug_list => join(',', @$bug_ids) };
bless $search, $class;
return $search;
}
####################
# Simple Accessors #
####################
sub bug_list { return [split(',', $_[0]->{'bug_list'})]; }
sub list_order { return $_[0]->{'list_order'}; }
sub user_id { return $_[0]->{'user_id'}; }
############
# Mutators #
############
sub set_bug_list { $_[0]->set('bug_list', $_[1]); }
sub set_list_order { $_[0]->set('list_order', $_[1]); }
##############
# Validators #
##############
sub _check_user_id {
my ($invocant, $id) = @_;
require Bugzilla::User;
return Bugzilla::User->check({ id => $id })->id;
}
sub _check_bug_list {
my ($invocant, $list) = @_;
my @bug_ids = ref($list) ? @$list : split(',', $list || '');
detaint_natural($_) foreach @bug_ids;
return join(',', @bug_ids);
}
sub _check_list_order { defined $_[1] ? trim($_[1]) : '' }
1;
__END__
=head1 NAME
Bugzilla::Search::Recent - A search recently run by a logged-in user.
=head1 SYNOPSIS
use Bugzilla::Search::Recent;
=head1 DESCRIPTION
This is an implementation of L<Bugzilla::Object>, and so has all the
same methods available as L<Bugzilla::Object>, in addition to what is
documented below.