# -- # 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::CustomerUser::Preferences::DB; use strict; use warnings; our @ObjectDependencies = ( 'Kernel::Config', 'Kernel::System::Cache', 'Kernel::System::DB', ); sub new { my ( $Type, %Param ) = @_; # allocate new hash for object my $Self = {}; bless( $Self, $Type ); $Self->{CacheType} = 'CustomerUserPreferencesDB'; $Self->{CacheTTL} = 60 * 60 * 24 * 20; # get config object my $ConfigObject = $Kernel::OM->Get('Kernel::Config'); # preferences table data $Self->{PreferencesTable} = $ConfigObject->Get('CustomerPreferences')->{Params}->{Table} || 'customer_preferences'; $Self->{PreferencesTableKey} = $ConfigObject->Get('CustomerPreferences')->{Params}->{TableKey} || 'preferences_key'; $Self->{PreferencesTableValue} = $ConfigObject->Get('CustomerPreferences')->{Params}->{TableValue} || 'preferences_value'; $Self->{PreferencesTableUserID} = $ConfigObject->Get('CustomerPreferences')->{Params}->{TableUserID} || 'user_id'; # set lower if database is case sensitive $Self->{Lower} = ''; if ( $Kernel::OM->Get('Kernel::System::DB')->GetDatabaseFunction('CaseSensitive') ) { $Self->{Lower} = 'LOWER'; } # create cache prefix $Self->{CachePrefix} = 'CustomerUserPreferencesDB' . $Self->{PreferencesTable} . $Self->{PreferencesTableKey} . $Self->{PreferencesTableValue} . $Self->{PreferencesTableUserID}; return $Self; } sub SetPreferences { my ( $Self, %Param ) = @_; return if !$Param{UserID}; return if !$Param{Key}; my $Value = defined $Param{Value} ? $Param{Value} : ''; # get database object my $DBObject = $Kernel::OM->Get('Kernel::System::DB'); # delete old data return if !$DBObject->Do( SQL => " DELETE FROM $Self->{PreferencesTable} WHERE $Self->{PreferencesTableUserID} = ? AND $Self->{PreferencesTableKey} = ?", Bind => [ \$Param{UserID}, \$Param{Key} ], ); # insert new data return if !$DBObject->Do( SQL => " INSERT INTO $Self->{PreferencesTable} ($Self->{PreferencesTableUserID}, $Self->{PreferencesTableKey}, $Self->{PreferencesTableValue}) VALUES (?, ?, ?)", Bind => [ \$Param{UserID}, \$Param{Key}, \$Value ], ); # delete cache $Kernel::OM->Get('Kernel::System::Cache')->Delete( Type => $Self->{CacheType}, Key => $Self->{CachePrefix} . $Param{UserID}, ); return 1; } # =item RenamePreferences() # # rename the old userid with the new userid in the preferences # # returns 1 if success or undef otherwise # # my $Success = $PreferencesObject->RenamePreferences( # NewUserID => 2, # OldUserID => 1, # ); # # =cut sub RenamePreferences { my ( $Self, %Param ) = @_; return if !$Param{NewUserID}; return if !$Param{OldUserID}; # update the preferences return if !$Kernel::OM->Get('Kernel::System::DB')->Prepare( SQL => " UPDATE $Self->{PreferencesTable} SET $Self->{PreferencesTableUserID} = ? WHERE $Self->{PreferencesTableUserID} = ?", Bind => [ \$Param{NewUserID}, \$Param{OldUserID}, ], ); # delete cache $Kernel::OM->Get('Kernel::System::Cache')->Delete( Type => $Self->{CacheType}, Key => $Self->{CachePrefix} . $Param{OldUserID}, ); return 1; } sub GetPreferences { my ( $Self, %Param ) = @_; return if !$Param{UserID}; # read cache my $Cache = $Kernel::OM->Get('Kernel::System::Cache')->Get( Type => $Self->{CacheType}, Key => $Self->{CachePrefix} . $Param{UserID}, ); return %{$Cache} if $Cache; # get database object my $DBObject = $Kernel::OM->Get('Kernel::System::DB'); # get preferences return if !$DBObject->Prepare( SQL => " SELECT $Self->{PreferencesTableKey}, $Self->{PreferencesTableValue} FROM $Self->{PreferencesTable} WHERE $Self->{PreferencesTableUserID} = ?", Bind => [ \$Param{UserID} ], ); # fetch the result my %Data; while ( my @Row = $DBObject->FetchrowArray() ) { $Data{ $Row[0] } = $Row[1]; } # set cache $Kernel::OM->Get('Kernel::System::Cache')->Set( Type => $Self->{CacheType}, TTL => $Self->{CacheTTL}, Key => $Self->{CachePrefix} . $Param{UserID}, Value => \%Data, ); return %Data; } sub SearchPreferences { my ( $Self, %Param ) = @_; my $Key = $Param{Key} || ''; my $Value = $Param{Value} || ''; # get database object my $DBObject = $Kernel::OM->Get('Kernel::System::DB'); my $Lower = ''; if ( $DBObject->GetDatabaseFunction('CaseSensitive') ) { $Lower = 'LOWER'; } my $SQL = " SELECT $Self->{PreferencesTableUserID}, $Self->{PreferencesTableValue} FROM $Self->{PreferencesTable} WHERE $Self->{PreferencesTableKey} = ?"; my @Bind = ( \$Key ); if ($Value) { $SQL .= " AND $Lower($Self->{PreferencesTableValue}) LIKE $Lower(?)"; push @Bind, \$Value; } # get preferences return if !$DBObject->Prepare( SQL => $SQL, Bind => \@Bind, ); # fetch the result my %UserID; while ( my @Row = $DBObject->FetchrowArray() ) { $UserID{ $Row[0] } = $Row[1]; } return %UserID; } 1;