mirror of
https://github.com/salesagility/SuiteCRM.git
synced 2024-11-21 15:37:57 +00:00
589 lines
13 KiB
PHP
589 lines
13 KiB
PHP
<?php
|
|
/**
|
|
*
|
|
* SugarCRM Community Edition is a customer relationship management program developed by
|
|
* SugarCRM, Inc. Copyright (C) 2004-2013 SugarCRM Inc.
|
|
*
|
|
* SuiteCRM is an extension to SugarCRM Community Edition developed by SalesAgility Ltd.
|
|
* Copyright (C) 2011 - 2018 SalesAgility Ltd.
|
|
*
|
|
* This program is free software; you can redistribute it and/or modify it under
|
|
* the terms of the GNU Affero General Public License version 3 as published by the
|
|
* Free Software Foundation with the addition of the following permission added
|
|
* to Section 15 as permitted in Section 7(a): FOR ANY PART OF THE COVERED WORK
|
|
* IN WHICH THE COPYRIGHT IS OWNED BY SUGARCRM, SUGARCRM DISCLAIMS THE WARRANTY
|
|
* OF NON INFRINGEMENT OF THIRD PARTY RIGHTS.
|
|
*
|
|
* This program is distributed in the hope that it will be useful, but WITHOUT
|
|
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
|
|
* FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more
|
|
* details.
|
|
*
|
|
* You should have received a copy of the GNU Affero General Public License along with
|
|
* this program; if not, see http://www.gnu.org/licenses or write to the Free
|
|
* Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
|
|
* 02110-1301 USA.
|
|
*
|
|
* You can contact SugarCRM, Inc. headquarters at 10050 North Wolfe Road,
|
|
* SW2-130, Cupertino, CA 95014, USA. or at email address contact@sugarcrm.com.
|
|
*
|
|
* The interactive user interfaces in modified source and object code versions
|
|
* of this program must display Appropriate Legal Notices, as required under
|
|
* Section 5 of the GNU Affero General Public License version 3.
|
|
*
|
|
* In accordance with Section 7(b) of the GNU Affero General Public License version 3,
|
|
* these Appropriate Legal Notices must retain the display of the "Powered by
|
|
* SugarCRM" logo and "Supercharged by SuiteCRM" logo. If the display of the logos is not
|
|
* reasonably feasible for technical reasons, the Appropriate Legal Notices must
|
|
* display the words "Powered by SugarCRM" and "Supercharged by SuiteCRM".
|
|
*/
|
|
|
|
namespace SuiteCRM;
|
|
|
|
use Exception;
|
|
use Psr\Http\Message\ServerRequestInterface;
|
|
use SuiteCRM\API\v8\Exception\ApiException;
|
|
|
|
if (!defined('sugarEntry') || !sugarEntry) {
|
|
die('Not A Valid Entry Point');
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
* implementation of http://jsonapi.org/format/#error-objects
|
|
*
|
|
* @todo incomplete...
|
|
*/
|
|
#[\AllowDynamicProperties]
|
|
class JsonApiErrorObject
|
|
{
|
|
|
|
/**
|
|
* integer
|
|
*/
|
|
public const DEFAULT_ID = 1;
|
|
|
|
/**
|
|
* integer
|
|
*/
|
|
public const DEFAULT_CODE = 1;
|
|
|
|
/**
|
|
* integer
|
|
*/
|
|
public const DEFAULT_STATUS = 200;
|
|
|
|
/**
|
|
*
|
|
* @var string
|
|
*/
|
|
protected $id;
|
|
|
|
/**
|
|
*
|
|
* @var array
|
|
*/
|
|
protected $links;
|
|
|
|
/**
|
|
*
|
|
* @var string
|
|
*/
|
|
protected $status;
|
|
|
|
/**
|
|
*
|
|
* @var string
|
|
*/
|
|
protected $code;
|
|
|
|
/**
|
|
*
|
|
* @var LangText
|
|
*/
|
|
protected $title;
|
|
|
|
/**
|
|
*
|
|
* @var LangText
|
|
*/
|
|
protected $detail;
|
|
|
|
/**
|
|
*
|
|
* @var array
|
|
*/
|
|
protected $source;
|
|
|
|
/**
|
|
*
|
|
* @var array
|
|
*/
|
|
protected $meta;
|
|
|
|
/**
|
|
*
|
|
* @param \SuiteCRM\LangText|null $title
|
|
* @param \SuiteCRM\LangText|null $detail
|
|
* @param string $id
|
|
* @param string $code
|
|
* @param string $status
|
|
* @param array $links
|
|
* @param array $source
|
|
* @param array $meta
|
|
*/
|
|
public function __construct(LangText $title = null, LangText $detail = null, $id = null, $code = null, $status = null, $links = null, $source = null, $meta = null)
|
|
{
|
|
$this->setTitle($title ? $title : $this->getDefaultTitle());
|
|
$this->setDetail($detail ? $detail : $this->getDefaultDetail());
|
|
$this->setId($id ? $id : $this->getDefaultId());
|
|
$this->setCode($code ? $code : $this->getDefaultCode());
|
|
$this->setStatus($status ? $status : $this->getDefaultStatus());
|
|
$this->setLinks($links ? $links : $this->getDefaultLinks());
|
|
$this->setSource($source ? $source : $this->getDefaultSource());
|
|
$this->setMeta($meta ? $meta : $this->getDefaultMeta());
|
|
}
|
|
|
|
/**
|
|
*
|
|
* @param LangText $title
|
|
*/
|
|
public function setTitle(LangText $title)
|
|
{
|
|
if ($this->isValidTitle($title)) {
|
|
$this->title = $title->getText();
|
|
} else {
|
|
ErrorMessage::log('Invalid JSON API error object, invalid title', 'warn');
|
|
$this->title = $this->getDefaultTitle();
|
|
}
|
|
}
|
|
|
|
/**
|
|
*
|
|
* @param LangText $detail
|
|
*/
|
|
public function setDetail(LangText $detail)
|
|
{
|
|
if ($this->isValidDetail($detail)) {
|
|
$this->detail = $detail->getText();
|
|
} else {
|
|
ErrorMessage::log('Invalid JSON API error object, invalid detail', 'warn');
|
|
$this->detail = $this->getDefaultDetail();
|
|
}
|
|
}
|
|
|
|
/**
|
|
*
|
|
* @param string $id
|
|
*/
|
|
public function setId($id)
|
|
{
|
|
if ($this->isValidId($id)) {
|
|
$this->id = $id;
|
|
} else {
|
|
ErrorMessage::log('Invalid JSON API error object, invalid id', 'warn');
|
|
$this->getDefaultId();
|
|
}
|
|
}
|
|
|
|
/**
|
|
*
|
|
* @param string $code
|
|
*/
|
|
public function setCode($code)
|
|
{
|
|
if ($this->isValidCode($code)) {
|
|
$this->code = $code;
|
|
} else {
|
|
ErrorMessage::log('Invalid JSON API error object, invalid code', 'warn');
|
|
$this->code = $this->getDefaultCode();
|
|
}
|
|
}
|
|
|
|
/**
|
|
*
|
|
* @param string $status
|
|
*/
|
|
public function setStatus($status)
|
|
{
|
|
if ($this->isValidStatus($status)) {
|
|
$this->status = $status;
|
|
} else {
|
|
ErrorMessage::log('Invalid JSON API error object, invalid status', 'warn');
|
|
$this->status = $this->getDefaultSource();
|
|
}
|
|
}
|
|
|
|
/**
|
|
*
|
|
* @param array $links
|
|
*/
|
|
public function setLinks($links)
|
|
{
|
|
if ($this->isValidLinks($links)) {
|
|
$this->links = $links;
|
|
} else {
|
|
ErrorMessage::log('Invalid JSON API error object, invalid links', 'warn');
|
|
$this->links = $this->getDefaultLinks();
|
|
}
|
|
}
|
|
|
|
/**
|
|
*
|
|
* @param array $source
|
|
*/
|
|
public function setSource($source)
|
|
{
|
|
if ($this->isValidSource($source)) {
|
|
$this->source = $source;
|
|
} else {
|
|
ErrorMessage::log('Invalid JSON API error object, invalid source', 'warn');
|
|
$this->source = $this->getDefaultSource();
|
|
}
|
|
}
|
|
|
|
/**
|
|
*
|
|
* @param array $meta
|
|
*/
|
|
public function setMeta($meta)
|
|
{
|
|
if ($this->getValidMeta($meta)) {
|
|
$this->meta = $meta;
|
|
} else {
|
|
ErrorMessage::log('Invalid JSON API error object, invalid meta', 'warn');
|
|
$this->meta = $this->getDefaultMeta();
|
|
}
|
|
}
|
|
|
|
/**
|
|
*
|
|
* @param LangText $title
|
|
* @return boolean
|
|
*/
|
|
protected function isValidTitle(LangText $title)
|
|
{
|
|
return true;
|
|
}
|
|
|
|
/**
|
|
*
|
|
* @param LangText $detail
|
|
* @return boolean
|
|
*/
|
|
protected function isValidDetail(LangText $detail)
|
|
{
|
|
return true;
|
|
}
|
|
|
|
/**
|
|
*
|
|
* @param string $id
|
|
* @return boolean
|
|
*/
|
|
protected function isValidId($id)
|
|
{
|
|
return is_string($id) || is_numeric($id);
|
|
}
|
|
|
|
/**
|
|
*
|
|
* @param string $code
|
|
* @return boolean
|
|
*/
|
|
protected function isValidCode($code)
|
|
{
|
|
return is_string($code) || is_numeric($code);
|
|
}
|
|
|
|
/**
|
|
*
|
|
* @param string $status
|
|
* @return boolean
|
|
*/
|
|
protected function isValidStatus($status)
|
|
{
|
|
return is_string($status) || is_numeric($status);
|
|
}
|
|
|
|
/**
|
|
*
|
|
* @param array $links
|
|
* @return boolean
|
|
*/
|
|
protected function isValidLinks($links)
|
|
{
|
|
return is_array($links) && isset($links['about']);
|
|
}
|
|
|
|
/**
|
|
*
|
|
* @param array $source
|
|
* @return boolean
|
|
*/
|
|
protected function isValidSource($source)
|
|
{
|
|
return is_array($source) && isset($source['pointer']) && isset($source['parameter']);
|
|
}
|
|
|
|
/**
|
|
*
|
|
* @param array $meta
|
|
* @return boolean
|
|
*/
|
|
protected function getValidMeta($meta)
|
|
{
|
|
return is_array($meta);
|
|
}
|
|
|
|
/**
|
|
*
|
|
* @return LangText
|
|
*/
|
|
protected function getDefaultTitle()
|
|
{
|
|
$text = new LangText('LBL_DEFAULT_API_ERROR_TITLE');
|
|
return $text;
|
|
}
|
|
|
|
/**
|
|
*
|
|
* @return LangText
|
|
*/
|
|
protected function getDefaultDetail()
|
|
{
|
|
$text = new LangText('LBL_DEFAULT_API_ERROR_DETAIL');
|
|
return $text;
|
|
}
|
|
|
|
/**
|
|
*
|
|
* @return string
|
|
*/
|
|
protected function getDefaultId()
|
|
{
|
|
return (string) self::DEFAULT_ID;
|
|
}
|
|
|
|
/**
|
|
*
|
|
* @return string
|
|
*/
|
|
protected function getDefaultCode()
|
|
{
|
|
return (string) self::DEFAULT_CODE;
|
|
}
|
|
|
|
/**
|
|
*
|
|
* @return string
|
|
*/
|
|
protected function getDefaultStatus()
|
|
{
|
|
return (string) self::DEFAULT_STATUS;
|
|
}
|
|
|
|
/**
|
|
*
|
|
* @return array
|
|
*/
|
|
protected function getDefaultLinks()
|
|
{
|
|
return ['about' => null];
|
|
}
|
|
|
|
/**
|
|
*
|
|
* @return array
|
|
*/
|
|
protected function getDefaultSource()
|
|
{
|
|
return ['pointer' => null, 'parameter' => null];
|
|
}
|
|
|
|
/**
|
|
*
|
|
* @return array
|
|
*/
|
|
protected function getDefaultMeta()
|
|
{
|
|
return [];
|
|
}
|
|
|
|
/**
|
|
*
|
|
* @return string|null
|
|
*/
|
|
protected function getId()
|
|
{
|
|
return $this->id;
|
|
}
|
|
|
|
/**
|
|
*
|
|
* @return array|null
|
|
*/
|
|
protected function getLinks()
|
|
{
|
|
return $this->links;
|
|
}
|
|
|
|
/**
|
|
*
|
|
* @return string|null
|
|
*/
|
|
protected function getStatus()
|
|
{
|
|
return $this->status;
|
|
}
|
|
|
|
/**
|
|
*
|
|
* @return string|null
|
|
*/
|
|
protected function getCode()
|
|
{
|
|
return $this->code;
|
|
}
|
|
|
|
/**
|
|
*
|
|
* @return string|null
|
|
*/
|
|
protected function getTitle()
|
|
{
|
|
return $this->title;
|
|
}
|
|
|
|
/**
|
|
*
|
|
* @return string|null
|
|
*/
|
|
protected function getDetail()
|
|
{
|
|
return $this->detail;
|
|
}
|
|
|
|
/**
|
|
*
|
|
* @return array|null
|
|
*/
|
|
protected function getSource()
|
|
{
|
|
return $this->source;
|
|
}
|
|
|
|
/**
|
|
*
|
|
* @return array|null
|
|
*/
|
|
protected function getMeta()
|
|
{
|
|
return $this->meta;
|
|
}
|
|
|
|
/**
|
|
*
|
|
* @return array
|
|
*/
|
|
public function export()
|
|
{
|
|
return [
|
|
'id' => $this->getId(),
|
|
'links' => $this->getLinks(),
|
|
'status' => $this->getStatus(),
|
|
'code' => $this->getCode(),
|
|
'title' => $this->getTitle(),
|
|
'detail' => $this->getDetail(),
|
|
'source' => $this->getSource(),
|
|
'meta' => $this->getMeta(),
|
|
];
|
|
}
|
|
|
|
/**
|
|
*
|
|
* @return string
|
|
*/
|
|
public function exportJson()
|
|
{
|
|
$json = json_encode($this->export());
|
|
$error = json_last_error();
|
|
if ($error !== JSON_ERROR_NONE) {
|
|
ErrorMessage::log('API Error Object JSON export error: ' . json_last_error_msg());
|
|
}
|
|
return $json;
|
|
}
|
|
|
|
/**
|
|
*
|
|
* @global array $sugar_config
|
|
* @param Exception $e
|
|
* @return array
|
|
*/
|
|
protected function retrieveMetaFromException(Exception $e)
|
|
{
|
|
$meta = [
|
|
'about' => 'Exception',
|
|
'class' => get_class($e),
|
|
'code' => $e->getCode(),
|
|
];
|
|
|
|
if ($e instanceof LangExceptionInterface) {
|
|
$meta['langMessage'] = $e->getLangMessage();
|
|
}
|
|
|
|
if (inDeveloperMode()) {
|
|
$meta['debug']['message'] = $e->getMessage();
|
|
$meta['debug']['file'] = $e->getFile();
|
|
$meta['debug']['line'] = $e->getLine();
|
|
$meta['debug']['trace'] = $e->getTrace();
|
|
$meta['debug']['traceAsString'] = $e->getTraceAsString();
|
|
if ($previous = $e->getPrevious()) {
|
|
$meta['debug']['previous'] = $this->retrieveMetaFromException($previous);
|
|
}
|
|
}
|
|
|
|
return $meta;
|
|
}
|
|
|
|
/**
|
|
*
|
|
* @param Exception $e
|
|
* @return $this
|
|
*/
|
|
public function retrieveFromException(Exception $e)
|
|
{
|
|
$this->setCode($e->getCode());
|
|
|
|
$meta = $this->retrieveMetaFromException($e);
|
|
|
|
$this->setMeta($meta);
|
|
|
|
|
|
if ($e instanceof ApiException) {
|
|
$this->setCode($e->getCode());
|
|
$this->setStatus($e->getHttpStatus());
|
|
$this->setDetail($e->getDetail());
|
|
$this->setStatus($e->getHttpStatus());
|
|
}
|
|
|
|
return $this;
|
|
}
|
|
|
|
/**
|
|
*
|
|
* @param ServerRequestInterface $request
|
|
* @return $this
|
|
*/
|
|
public function retrieveFromRequest(ServerRequestInterface $request)
|
|
{
|
|
$this->setSource([
|
|
'pointer' => $request->getUri(),
|
|
'parametes' => $request->getQueryParams(),
|
|
]);
|
|
|
|
return $this;
|
|
}
|
|
}
|