Bug 21206: (QA follow-up) Rebase problem and leftover mocked GetItem
[koha.git] / C4 / Search / History.pm
index 4330692..8406f30 100644 (file)
@@ -18,39 +18,43 @@ sub add {
     my $query_cgi  = $params->{query_cgi};
     my $total      = $params->{total} // 0;
     my $type       = $params->{type} || 'biblio';
+    my $time       = $params->{time};
 
     my $dbh = C4::Context->dbh;
 
     # Add the request the user just made
     my $query = q{
         INSERT INTO search_history(
-            userid, sessionid, query_desc, query_cgi, type, total, time
+            userid, sessionid, query_desc, query_cgi, type, total} . ( $time ? ', time' : '' ) . q{
         ) VALUES(
-            ?, ?, ?, ?, ?, ?, NOW()
+            ?, ?, ?, ?, ?, ?} . ( $time ? ', ?' : '' ) . q{
         )
     };
     my $sth = $dbh->prepare($query);
     $sth->execute( $userid, $sessionid, $query_desc, $query_cgi, $type,
-        $total );
+        $total, ( $time ? $time : () ) );
 }
 
 sub add_to_session {
     my ($params) = @_;
     my $cgi = $params->{cgi};
-    my $query_desc = Encode::decode_utf8( $params->{query_desc} ) || "unknown";
-    my $query_cgi  = Encode::decode_utf8( $params->{query_cgi} )  || "unknown";
+    my $query_desc = $params->{query_desc} || "unknown";
+    my $query_cgi  = $params->{query_cgi} || "unknown";
     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 +62,35 @@ 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;
+    my $interval  = $params->{interval} || 0;
 
-    unless ($userid) {
-        warn "ERROR: userid is required for history search";
+    unless ( ref( $id ) ) {
+        $id = $id ? [ $id ] : [];
+    }
+
+    unless ( $userid or @$id or $interval ) {
+        warn "ERROR: userid, id or interval 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
@@ -84,21 +101,62 @@ sub delete {
     $query .= q{ AND type = ?}
       if $type;
 
+    # FIXME DATE_SUB is a Mysql-ism. Postgres uses: datefield - INTERVAL '6 months'
+    $query .= q{ AND time < DATE_SUB( NOW(), INTERVAL ? DAY )}
+        if $interval;
+
     $dbh->do(
-        $query, {}, $userid,
+        $query, {},
+        ( @$id ? ( @$id ) : () ),
+        ( $userid ? $userid : () ),
         ( $sessionid ? $sessionid : () ),
-        ( $type      ? $type      : () )
+        ( $type      ? $type      : () ),
+        ( $interval  ? $interval  : () ),
     );
 }
 
+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 +164,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 +187,8 @@ sub get {
     my $dbh = C4::Context->dbh;
     my $sth = $dbh->prepare($query);
     $sth->execute(
-        $userid,
+        ( @$id ? ( @$id ) : () ),
+        ( $userid ? $userid : () ),
         ( $sessionid ? $sessionid : () ),
         ( $type      ? $type      : () )
     );
@@ -152,7 +218,7 @@ sub set_to_session {
     my $session = C4::Auth::get_session($sessionID);
     return () unless $session;
     $session->param( 'search_history',
-        uri_escape_utf8( encode_json($search_history) ) );
+        uri_escape( encode_json($search_history) ) );
 }
 
 1;