# --
# 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::GenericInterface::Operation::ConfigItem::ConfigItemGet;
use strict;
use warnings;
## nofilter(TidyAll::Plugin::OTRS::Migrations::OTRS6::SysConfig)
use MIME::Base64;
use Kernel::System::VariableCheck qw(:all);
use parent qw(
Kernel::GenericInterface::Operation::Common
Kernel::GenericInterface::Operation::ConfigItem::Common
);
our $ObjectManagerDisabled = 1;
=head1 NAME
Kernel::GenericInterface::Operation::ConfigItem::ConfigItemGet - GenericInterface Configuration Item Get Operation backend
=head1 PUBLIC INTERFACE
=head2 new()
usually, you want to create an instance of this
by using Kernel::GenericInterface::Operation->new();
=cut
sub new {
my ( $Type, %Param ) = @_;
my $Self = {};
bless( $Self, $Type );
# check needed objects
for my $Needed (qw( DebuggerObject WebserviceID )) {
if ( !$Param{$Needed} ) {
return {
Success => 0,
ErrorMessage => "Got no $Needed!",
};
}
$Self->{$Needed} = $Param{$Needed};
}
$Self->{OperationName} = 'ConfigItemGet';
$Self->{Config} = $Kernel::OM->Get('Kernel::Config')->Get('GenericInterface::Operation::ConfigItemGet');
return $Self;
}
=head2 Run()
perform ConfigItemGet Operation. This function is able to return
one or more ConfigItem entries in one call.
my $Result = $OperationObject->Run(
Data => {
UserLogin => 'some agent login', # UserLogin or SessionID is
SessionID => 123, # required
Password => 'some password', # if UserLogin is sent then Password is required
ConfigItemID => '32,33', # required, could be coma separated IDs or an Array
Attachments => 1, # Optional, 1 as default. If it's set with the value 1,
# attachments for articles will be included on ConfigItem data
},
);
$Result = {
Success => 1, # 0 or 1
ErrorMessage => '', # In case of an error
Data => {
ConfigItem => [
{
Number => '20101027000001',
ConfigItemID => 123,
Name => 'some name',
Class => 'some class',
VersionID => 123,
LastVersionID => 123,
DefinitionID => 123,
InciState => 'some incident state',
InciStateType => 'some incident state type',
DeplState => 'some deployment state',
DeplStateType => 'some deployment state type',
CurInciState => 'some incident state',
CurInciStateType => 'some incident state type',
CurDeplState => 'some deployment state',
CurDeplStateType => 'some deployment state type',
CreateTime => '2010-10-27 20:15:00'
CreateBy => 123,
CIXMLData => $XMLDataHashRef,
Attachment => [
{
Content => "xxxx", # actual attachment contents, base64 enconded
ContentType => "application/pdf",
Filename => "StdAttachment-Test1.pdf",
Filesize => "4.6 KBytes",
Preferences => $PreferencesHashRef,
},
{
# . . .
},
],
},
{
# . . .
},
],
},
};
=cut
sub Run {
my ( $Self, %Param ) = @_;
my $Result = $Self->Init(
WebserviceID => $Self->{WebserviceID},
);
if ( !$Result->{Success} ) {
$Self->ReturnError(
ErrorCode => 'Webservice.InvalidConfiguration',
ErrorMessage => $Result->{ErrorMessage},
);
}
my ( $UserID, $UserType ) = $Self->Auth(
%Param
);
if ( !$UserID ) {
return $Self->ReturnError(
ErrorCode => '$Self->{OperationName}.AuthFail',
ErrorMessage => "$Self->{OperationName}: Authorization failing!",
);
}
# check needed stuff
for my $Needed (qw(ConfigItemID)) {
if ( !$Param{Data}->{$Needed} ) {
return $Self->ReturnError(
ErrorCode => "$Self->{OperationName}.MissingParameter",
ErrorMessage => "$Self->{OperationName}: $Needed parameter is missing!",
);
}
}
my $ErrorMessage = '';
# all needed variables
my @ConfigItemIDs;
if ( IsStringWithData( $Param{Data}->{ConfigItemID} ) ) {
@ConfigItemIDs = split( /,/, $Param{Data}->{ConfigItemID} );
}
elsif ( IsArrayRefWithData( $Param{Data}->{ConfigItemID} ) ) {
@ConfigItemIDs = @{ $Param{Data}->{ConfigItemID} };
}
else {
return $Self->ReturnError(
ErrorCode => "$Self->{OperationName}.WrongStructure",
ErrorMessage => "$Self->{OperationName}: Structure for ConfigItemID is not correct!",
);
}
my $Attachments = $Param{Data}->{Attachments} || 0;
my $ReturnData = {
Success => 1,
};
my @Item;
my $ConfigItemObject = $Kernel::OM->Get('Kernel::System::ITSMConfigItem');
# start ConfigItem loop
CONFIGITEM:
for my $ConfigItemID (@ConfigItemIDs) {
# check create permissions
my $Permission = $ConfigItemObject->Permission(
Scope => 'Item',
ItemID => $ConfigItemID,
UserID => $UserID,
Type => $Self->{Config}->{Permission},
);
if ( !$Permission ) {
return $Self->ReturnError(
ErrorCode => "$Self->{OperationName}.AccessDenied",
ErrorMessage => "$Self->{OperationName}: Can not get configuration item!",
);
}
# get the ConfigItem entry
my $ConfigItem = $ConfigItemObject->ConfigItemGet(
ConfigItemID => $ConfigItemID,
UserID => $UserID,
);
# get latest version
my $Version = $ConfigItemObject->VersionGet(
ConfigItemID => $ConfigItemID,
UserID => $UserID,
);
if ( !IsHashRefWithData($Version) ) {
$ErrorMessage = 'Could not get ConfigItem data'
. ' in Kernel::GenericInterface::Operation::ConfigItem::ConfigItemGet::Run()';
return $Self->ReturnError(
ErrorCode => '$Self->{OperationName}.InvalidParameter',
ErrorMessage => "$Self->{OperationName}: $ErrorMessage",
);
}
# remove unneeded items
delete $Version->{ClassID};
delete $Version->{CurDeplStateID};
delete $Version->{CurInciStateID};
delete $Version->{DeplStateID};
delete $Version->{InciStateID};
delete $Version->{XMLDefinitionID};
my $Definition = delete $Version->{XMLDefinition};
my $FormatedXMLData = $Self->InvertFormatXMLData(
XMLData => $Version->{XMLData}->[1]->{Version},
);
my $ReplacedXMLData = $Self->InvertReplaceXMLData(
XMLData => $FormatedXMLData,
Definition => $Definition,
);
$Version->{XMLData} = $ReplacedXMLData;
# rename XMLData since SOAP transport complains about XML prefix on names
$Version->{CIXMLData} = delete $Version->{XMLData};
# set ConfigItem entry data
my $ConfigItemBundle = $Version;
if ($Attachments) {
my @Attachments = $ConfigItemObject->ConfigItemAttachmentList(
ConfigItemID => $ConfigItemID,
);
my @AttachmentDetails;
ATTACHMENT:
for my $Filename (@Attachments) {
next ATTACHMENT if !$Filename;
my $Attachment = $ConfigItemObject->ConfigItemAttachmentGet(
ConfigItemID => $ConfigItemID,
Filename => $Filename,
);
# next if not attachment
next ATTACHMENT if !IsHashRefWithData($Attachment);
# convert content to base64
$Attachment->{Content} = encode_base64( $Attachment->{Content} );
push @AttachmentDetails, $Attachment;
}
# set ConfigItem entry data
$ConfigItemBundle->{Attachment} = '';
if ( IsArrayRefWithData( \@AttachmentDetails ) ) {
$ConfigItemBundle->{Attachment} = \@AttachmentDetails;
}
}
# add
push @Item, $ConfigItemBundle;
} # finish ConfigItem loop
if ( !scalar @Item ) {
$ErrorMessage = 'Could not get ConfigItem data'
. ' in Kernel::GenericInterface::Operation::ConfigItem::ConfigItemGet::Run()';
return $Self->ReturnError(
ErrorCode => '$Self->{OperationName}.NoConfigItemData',
ErrorMessage => "$Self->{OperationName}: $ErrorMessage",
);
}
# set ConfigItem data into return structure
$ReturnData->{Data}->{ConfigItem} = '';
if ( IsArrayRefWithData( \@Item ) ) {
$ReturnData->{Data}->{ConfigItem} = \@Item;
}
# return result
return $ReturnData;
}
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