# -- # Copyright (C) 2001-2019 OTRS AG, https://otrs.com/ # -- # This software comes with ABSOLUTELY NO WARRANTY. For details, see # the enclosed file COPYING for license information (GPL). If you # did not receive this file, see https://www.gnu.org/licenses/gpl-3.0.txt. # -- package Kernel::System::SearchProfile; use strict; use warnings; our @ObjectDependencies = ( 'Kernel::System::Cache', 'Kernel::System::DB', 'Kernel::System::Log', ); =head1 NAME Kernel::System::SearchProfile - module to manage search profiles =head1 DESCRIPTION module with all functions to manage search profiles =head1 PUBLIC INTERFACE =head2 new() Don't use the constructor directly, use the ObjectManager instead: my $SearchProfileObject = $Kernel::OM->Get('Kernel::System::SearchProfile'); =cut sub new { my ( $Type, %Param ) = @_; # allocate new hash for object my $Self = {}; bless( $Self, $Type ); $Self->{CacheType} = 'SearchProfile'; $Self->{CacheTTL} = 60 * 60 * 24 * 20; # set lower if database is case sensitive $Self->{Lower} = ''; if ( $Kernel::OM->Get('Kernel::System::DB')->GetDatabaseFunction('CaseSensitive') ) { $Self->{Lower} = 'LOWER'; } return $Self; } =head2 SearchProfileAdd() to add a search profile item $SearchProfileObject->SearchProfileAdd( Base => 'TicketSearch', Name => 'last-search', Key => 'Body', Value => $String, # SCALAR|ARRAYREF UserLogin => 123, ); =cut sub SearchProfileAdd { my ( $Self, %Param ) = @_; # check needed stuff for (qw(Base Name Key UserLogin)) { if ( !defined $Param{$_} ) { $Kernel::OM->Get('Kernel::System::Log')->Log( Priority => 'error', Message => "Need $_!", ); return; } } # check value return 1 if !defined $Param{Value}; # create login string my $Login = $Param{Base} . '::' . $Param{UserLogin}; my @Data; if ( ref $Param{Value} eq 'ARRAY' ) { @Data = @{ $Param{Value} }; $Param{Type} = 'ARRAY'; } else { @Data = ( $Param{Value} ); $Param{Type} = 'SCALAR'; } # get database object my $DBObject = $Kernel::OM->Get('Kernel::System::DB'); for my $Value (@Data) { return if !$DBObject->Do( SQL => " INSERT INTO search_profile (login, profile_name, profile_type, profile_key, profile_value) VALUES (?, ?, ?, ?, ?) ", Bind => [ \$Login, \$Param{Name}, \$Param{Type}, \$Param{Key}, \$Value, ], ); } # reset cache my $CacheKey = $Login . '::' . $Param{Name}; $Kernel::OM->Get('Kernel::System::Cache')->Delete( Type => $Self->{CacheType}, Key => $Login, ); $Kernel::OM->Get('Kernel::System::Cache')->Delete( Type => $Self->{CacheType}, Key => $CacheKey, ); return 1; } =head2 SearchProfileGet() returns hash with search profile. my %SearchProfileData = $SearchProfileObject->SearchProfileGet( Base => 'TicketSearch', Name => 'last-search', UserLogin => 'me', ); =cut sub SearchProfileGet { my ( $Self, %Param ) = @_; # check needed stuff for (qw(Base Name UserLogin)) { if ( !defined( $Param{$_} ) ) { $Kernel::OM->Get('Kernel::System::Log')->Log( Priority => 'error', Message => "Need $_!", ); return; } } # create login string my $Login = $Param{Base} . '::' . $Param{UserLogin}; # check the cache my $CacheKey = $Login . '::' . $Param{Name}; my $Cache = $Kernel::OM->Get('Kernel::System::Cache')->Get( Type => $Self->{CacheType}, Key => $CacheKey, ); return %{$Cache} if $Cache; # get database object my $DBObject = $Kernel::OM->Get('Kernel::System::DB'); # get search profile return if !$DBObject->Prepare( SQL => " SELECT profile_type, profile_key, profile_value FROM search_profile WHERE profile_name = ? AND $Self->{Lower}(login) = $Self->{Lower}(?) ", Bind => [ \$Param{Name}, \$Login ], ); my %Result; while ( my @Data = $DBObject->FetchrowArray() ) { if ( $Data[0] eq 'ARRAY' ) { push @{ $Result{ $Data[1] } }, $Data[2]; } else { $Result{ $Data[1] } = $Data[2]; } } $Kernel::OM->Get('Kernel::System::Cache')->Set( Type => $Self->{CacheType}, TTL => $Self->{CacheTTL}, Key => $CacheKey, Value => \%Result ); return %Result; } =head2 SearchProfileDelete() deletes a search profile. $SearchProfileObject->SearchProfileDelete( Base => 'TicketSearch', Name => 'last-search', UserLogin => 'me', ); =cut sub SearchProfileDelete { my ( $Self, %Param ) = @_; # check needed stuff for (qw(Base Name UserLogin)) { if ( !$Param{$_} ) { $Kernel::OM->Get('Kernel::System::Log')->Log( Priority => 'error', Message => "Need $_!", ); return; } } # create login string my $Login = $Param{Base} . '::' . $Param{UserLogin}; # get database object my $DBObject = $Kernel::OM->Get('Kernel::System::DB'); # delete search profile return if !$DBObject->Do( SQL => " DELETE FROM search_profile WHERE profile_name = ? AND $Self->{Lower}(login) = $Self->{Lower}(?) ", Bind => [ \$Param{Name}, \$Login ], ); # delete cache my $CacheKey = $Login . '::' . $Param{Name}; $Kernel::OM->Get('Kernel::System::Cache')->Delete( Type => $Self->{CacheType}, Key => $Login, ); $Kernel::OM->Get('Kernel::System::Cache')->Delete( Type => $Self->{CacheType}, Key => $CacheKey, ); return 1; } =head2 SearchProfileList() returns a hash of all profiles for the given user. my %SearchProfiles = $SearchProfileObject->SearchProfileList( Base => 'TicketSearch', UserLogin => 'me', ); =cut sub SearchProfileList { my ( $Self, %Param ) = @_; # check needed stuff for (qw(Base UserLogin)) { if ( !defined( $Param{$_} ) ) { $Kernel::OM->Get('Kernel::System::Log')->Log( Priority => 'error', Message => "Need $_!", ); return; } } # create login string my $Login = $Param{Base} . '::' . $Param{UserLogin}; my $Cache = $Kernel::OM->Get('Kernel::System::Cache')->Get( Type => $Self->{CacheType}, Key => $Login, ); return %{$Cache} if $Cache; # get database object my $DBObject = $Kernel::OM->Get('Kernel::System::DB'); # get search profile list return if !$DBObject->Prepare( SQL => " SELECT profile_name FROM search_profile WHERE $Self->{Lower}(login) = $Self->{Lower}(?) ", Bind => [ \$Login ], ); # fetch the result my %Result; while ( my @Data = $DBObject->FetchrowArray() ) { $Result{ $Data[0] } = $Data[0]; } $Kernel::OM->Get('Kernel::System::Cache')->Set( Type => $Self->{CacheType}, TTL => $Self->{CacheTTL}, Key => $Login, Value => \%Result, ); return %Result; } =head2 SearchProfileUpdateUserLogin() changes the UserLogin of SearchProfiles my $Result = $SearchProfileObject->SearchProfileUpdateUserLogin( Base => 'TicketSearch', UserLogin => 'me', NewUserLogin => 'newme', ); =cut sub SearchProfileUpdateUserLogin { my ( $Self, %Param ) = @_; # check needed stuff for (qw(Base UserLogin NewUserLogin)) { if ( !defined( $Param{$_} ) ) { $Kernel::OM->Get('Kernel::System::Log')->Log( Priority => 'error', Message => "Need $_!", ); return; } } # get existing profiles my %SearchProfiles = $Self->SearchProfileList( Base => $Param{Base}, UserLogin => $Param{UserLogin}, ); # iterate over profiles; create them for new login name and delete old ones for my $SearchProfile ( sort keys %SearchProfiles ) { my %Search = $Self->SearchProfileGet( Base => $Param{Base}, Name => $SearchProfile, UserLogin => $Param{UserLogin}, ); # add profile for new login (needs to be done per attribute) for my $Attribute ( sort keys %Search ) { $Self->SearchProfileAdd( Base => $Param{Base}, Name => $SearchProfile, Key => $Attribute, Value => $Search{$Attribute}, UserLogin => $Param{NewUserLogin}, ); } # delete the old profile $Self->SearchProfileDelete( Base => $Param{Base}, Name => $SearchProfile, UserLogin => $Param{UserLogin}, ); } return 1; } 1; =head1 TERMS AND CONDITIONS This software is part of the OTRS project (L). This software comes with ABSOLUTELY NO WARRANTY. For details, see the enclosed file COPYING for license information (GPL). If you did not receive this file, see L. =cut