From aed5515cd1296b32bd68d6836c7bef5721621184 Mon Sep 17 00:00:00 2001 From: Jonathan Druart Date: Fri, 20 Dec 2013 15:06:08 +0100 Subject: [PATCH] Bug 11430: delete search history by id - API changes Bug 10807 adds a search history for authorities and bug 10862 adds the search history on the staff interface. This one allows the user to select the search history lines he wants to delete. This change is done for the OPAC and intranet interface. The user is now allow to delete one or more lines of his/her search history. Test plan (for intranet, opac: bootstrap and prog themes): 1/ launch some search (catalogue and authority) 2/ verify the lines is added to your search history 3/ delete one or more lines of the history and verify they have been deleted 4/ at the OPAC: logout and do again steps 1-3. 5/ prove t/db_dependent/Search/History.t Signed-off-by: sonia BOUIS Signed-off-by: Kyle M Hall --- C4/Search/History.pm | 81 +++++++++++++++++++++++++++++++++++++++++++++------- 1 file changed, 70 insertions(+), 11 deletions(-) diff --git a/C4/Search/History.pm b/C4/Search/History.pm index d82d14e..1411019 100644 --- a/C4/Search/History.pm +++ b/C4/Search/History.pm @@ -42,15 +42,18 @@ sub add_to_session { my $total = $params->{total}; my $type = $params->{type} || 'biblio'; + # To a cookie (the user is not logged in) + my $now = dt_from_string; + my $id = $now->year . $now->month . $now->day . $now->hour . $now->minute . $now->second . int(rand(100)); my @recent_searches = get_from_session( { cgi => $cgi } ); - push @recent_searches, - { + push @recent_searches, { query_desc => $query_desc, query_cgi => $query_cgi, total => "$total", type => $type, - time => output_pref( { dt => dt_from_string(), dateformat => 'iso', timeformat => '24hr' } ), - }; + time => output_pref( { dt => $now, dateformat => 'iso', timeformat => '24hr' } ), + id => $id, + }; shift @recent_searches if ( @recent_searches > 15 ); set_to_session( { cgi => $cgi, search_history => \@recent_searches } ); @@ -58,22 +61,34 @@ sub add_to_session { sub delete { my ($params) = @_; + my $id = $params->{id}; my $userid = $params->{userid}; my $sessionid = $params->{sessionid}; my $type = $params->{type} || q{}; my $previous = $params->{previous} || 0; - unless ($userid) { - warn "ERROR: userid is required for history search"; + unless ( ref( $id ) ) { + $id = $id ? [ $id ] : []; + } + + unless ( $userid or @$id ) { + warn "ERROR: userid or id is required for history deletion"; return; } my $dbh = C4::Context->dbh; my $query = q{ DELETE FROM search_history - WHERE userid = ? + WHERE 1 }; + $query .= q{ AND id IN ( } . join( q{,}, (q{?}) x @$id ) . q{ )} + if @$id; + + $query .= q{ + AND userid = ? + } if $userid; + if ($sessionid) { $query .= $previous @@ -85,20 +100,56 @@ sub delete { if $type; $dbh->do( - $query, {}, $userid, + $query, {}, + ( @$id ? ( @$id ) : () ), + ( $userid ? $userid : () ), ( $sessionid ? $sessionid : () ), ( $type ? $type : () ) ); } +sub delete_from_cookie { + my ($params) = @_; + my $cookie = $params->{cookie}; + my $id = $params->{id}; + + return unless $cookie; + + unless ( ref( $id ) ) { + $id = $id ? [ $id ] : []; + } + return unless @$id; + + my @searches; + if ( $cookie ){ + $cookie = uri_unescape( $cookie ); + if (decode_json( $cookie )) { + @searches = @{decode_json( $cookie )} + } + } + + @searches = map { + my $search = $_; + ( grep { $_ != $search->{id} } @$id ) ? $search : () + } @searches; + + return uri_escape( encode_json( \@searches ) ); + +} + sub get { my ($params) = @_; + my $id = $params->{id}; my $userid = $params->{userid}; my $sessionid = $params->{sessionid}; my $type = $params->{type}; my $previous = $params->{previous}; - unless ($userid) { + unless ( ref( $id ) ) { + $id = $id ? [ $id ] : []; + } + + unless ( $userid or @$id ) { warn "ERROR: userid is required for history search"; return; } @@ -106,9 +157,16 @@ sub get { my $query = q{ SELECT * FROM search_history - WHERE userid = ? + WHERE 1 }; + $query .= q{ AND id IN ( } . join( q{,}, (q{?}) x @$id ) . q{ )} + if @$id; + + $query .= q{ + AND userid = ? + } if $userid; + if ($sessionid) { $query .= $previous @@ -122,7 +180,8 @@ sub get { my $dbh = C4::Context->dbh; my $sth = $dbh->prepare($query); $sth->execute( - $userid, + ( @$id ? ( @$id ) : () ), + ( $userid ? $userid : () ), ( $sessionid ? $sessionid : () ), ( $type ? $type : () ) ); -- 2.1.0