mirror of
https://github.com/SuiteCRM/SuiteCRM-Core.git
synced 2025-08-29 04:21:06 +08:00
f058c4c306 Fix #9106 - Update securexss for backwards compatibility 05471a51f3 Update composer.lock dee3305fce 7.11.19 0952712425 Fix Calender display issues in FullCalender 3.10 91bfb1cf3a Fix #7999 - Prevent securitygroups mass assign damage e36e1a52f5 Fix #5624 - Make SWSPEditRoleButton::displayList compatible w. parent 8265b5e29b Fix #8571 - Remove duplicate code in users detailviewdefs f63f05a4a2 Fix #8514 - Implement effective opcache file clearing 5e671f3b1b Fix #8461, #8462 - PHP files are potentially overwritten 0b18500b42 Fix #8700 - Various problems in PHPDocs throughout the codebase. 25dce7954d Fix #9067 - Fix the drop down width 28eecb4198 Add Additional api filter option `like` 8b5a152f7f Add filters in relationship API 7a92e5ec8a Add Relationship Beans in V8 API Response c192ccdf2e Fix #9090 - User menu alignment 466f2d96e7 Fix #6051 - Modulebuilder labels edit fixes fe5ed90fd9 Update JQuery JS Library to v3.6.0 e0382c1a6c Update FullCalendar JS Library to v3.10.2 86882a4d4f Update YUI JS Library to 2.9.1 540245494b Fix #8999 - Hardcoded 'by' label in calls e4f3c6a2fb Fix #9034 - Business Hours does not work in non-english languages b0a51cc667 Fix #8910 - Update the V8 Api to allow for upload of documents similar to notes 8408cd8e91 Fix #9010 - Add missing 'view task' label on calendar faa46f5a4c Fix #8894 - Add missing label for calendar dashlet 5905f3d308 Fix #9032 - Prevent Notice Error During Import 5c9e8700ba Fix #8182 - Update updateTimeDateFields to handle undefined dates fc3dd03386 Fix #9075 - Removing deleted related beans via link 039d9a69d2 Fix #8988 - Improve upon solution which doesn't cache incomplete beans f562c57c8d Fix #7772 - Only index ElasticSearch when enabled dd1a5bc244 Fix #9101 LangText exception breaking ElasticSearch 0c861d3f1a Fix #8472 - No or not complete Searchresults using elasticsearch engine e4e884667c Fix #6800 - Elasticsearch: Elastic index name is hardcoded e525634d7b Fix #8916 - Misspelled elasticsearch labels 28d7afaa59 Fix #9080 - Update config for google/apiclient at composer.json 66bd8998ec Fix #9060 - Project Form action should not be changed if delete is not confirmed 06195fe5f1 Fix #8676 - New Scheduled Reports does not run 89341758e2 Fix #2645 - Calendar quick create ignores required fields a329377bc0 Deprecate PdfParser e5c03ad198 Deprecate advanced open discovery (AOD) git-subtree-dir: public/legacy git-subtree-split: f058c4c3062e7fff72cc2b62440bf064a63e6843
294 lines
8.2 KiB
PHP
294 lines
8.2 KiB
PHP
<?php
|
|
namespace Api\V8\BeanDecorator;
|
|
|
|
use \SugarBean;
|
|
use \Person;
|
|
|
|
class BeanManager
|
|
{
|
|
const DEFAULT_OFFSET = 0;
|
|
const DEFAULT_LIMIT = -1;
|
|
const DEFAULT_ALL_RECORDS = -99;
|
|
|
|
/**
|
|
* @var \DBManager
|
|
*/
|
|
protected $db;
|
|
|
|
/**
|
|
* @var array
|
|
*/
|
|
protected $beanAliases;
|
|
|
|
/**
|
|
* @param \DBManager $db
|
|
* @param array $beanAliases
|
|
*/
|
|
public function __construct(\DBManager $db, array $beanAliases)
|
|
{
|
|
$this->db = $db;
|
|
$this->beanAliases = $beanAliases;
|
|
}
|
|
|
|
/**
|
|
* @param string $module
|
|
*
|
|
* @return \SugarBean
|
|
* @throws \InvalidArgumentException When the module is invalid.
|
|
*/
|
|
public function newBeanSafe($module)
|
|
{
|
|
if (array_key_exists($module, $this->beanAliases)) {
|
|
$module = $this->beanAliases[$module];
|
|
}
|
|
|
|
$bean = \BeanFactory::newBean($module);
|
|
|
|
if (!$bean instanceof \SugarBean) {
|
|
throw new \InvalidArgumentException(sprintf('Module %s does not exist', $module));
|
|
}
|
|
|
|
return $bean;
|
|
}
|
|
|
|
/**
|
|
* @param string $module
|
|
* @param string|null $id
|
|
* @param array $params
|
|
* @param boolean $deleted
|
|
*
|
|
* @return \SugarBean|boolean
|
|
*/
|
|
public function getBean($module, $id = null, array $params = [], $deleted = true)
|
|
{
|
|
return \BeanFactory::getBean($module, $id, $params, $deleted);
|
|
}
|
|
|
|
/**
|
|
* @param string $module
|
|
* @param string $id
|
|
* @param array $params
|
|
* @param boolean $deleted
|
|
*
|
|
* @return \SugarBean
|
|
* @throws \DomainException When bean id is empty or bean is not found by name.
|
|
* @throws \InvalidArgumentException When bean is not found with the given id.
|
|
*/
|
|
public function getBeanSafe(
|
|
$module,
|
|
$id,
|
|
array $params = [],
|
|
$deleted = true
|
|
) {
|
|
if (empty($id)) {
|
|
throw new \DomainException('Module id is empty when trying to get ' . $module);
|
|
}
|
|
|
|
$objectName = \BeanFactory::getObjectName($module);
|
|
if (!$objectName && array_key_exists($module, $this->beanAliases)) {
|
|
$objectName = \BeanFactory::getObjectName($this->beanAliases[$module]);
|
|
$module = $this->beanAliases[$module];
|
|
}
|
|
|
|
if (!$objectName) {
|
|
throw new \DomainException(sprintf('Module with name %s is not found', $module));
|
|
}
|
|
|
|
$bean = $this->getBean($module, $id, $params, $deleted);
|
|
if ($bean === false) {
|
|
throw new \InvalidArgumentException(
|
|
sprintf('%s module with id %s is not found', $module, $id)
|
|
);
|
|
}
|
|
|
|
return $bean;
|
|
}
|
|
|
|
/**
|
|
* @param string $module
|
|
*
|
|
* @return BeanListRequest
|
|
*/
|
|
public function getList($module)
|
|
{
|
|
return new BeanListRequest($this->newBeanSafe($module));
|
|
}
|
|
|
|
/**
|
|
* @param \SugarBean $sourceBean
|
|
* @param \SugarBean $relatedBean
|
|
* @param string $relationship
|
|
*
|
|
* @throws \RuntimeException If relationship cannot be loaded or created between beans.
|
|
*/
|
|
public function createRelationshipSafe(\SugarBean $sourceBean, \SugarBean $relatedBean, $relationship)
|
|
{
|
|
if (!$sourceBean->load_relationship($relationship)) {
|
|
throw new \RuntimeException(
|
|
sprintf('Cannot load relationship %s for module %s', $relationship, $sourceBean->getObjectName())
|
|
);
|
|
}
|
|
|
|
$result = $sourceBean->{$relationship}->add($relatedBean);
|
|
|
|
if (!$result) {
|
|
throw new \RuntimeException(
|
|
sprintf(
|
|
'Cannot create relationship %s between module %s and %s',
|
|
$relationship,
|
|
$sourceBean->getObjectName(),
|
|
$relatedBean->getObjectName()
|
|
)
|
|
);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* @param \SugarBean $sourceBean
|
|
* @param \SugarBean $relatedBean
|
|
* @param string $relationship
|
|
*
|
|
* @throws \RuntimeException If relationship cannot be loaded or deleted between beans.
|
|
*/
|
|
public function deleteRelationshipSafe(\SugarBean $sourceBean, \SugarBean $relatedBean, $relationship)
|
|
{
|
|
if (!$sourceBean->load_relationship($relationship)) {
|
|
throw new \RuntimeException(
|
|
sprintf('Cannot load relationship %s for module %s', $relationship, $sourceBean->getObjectName())
|
|
);
|
|
}
|
|
|
|
$result = $sourceBean->{$relationship}->delete($sourceBean->id, $relatedBean->id);
|
|
|
|
if (!$result) {
|
|
throw new \RuntimeException(
|
|
sprintf(
|
|
'Cannot delete relationship %s between module %s and %s',
|
|
$relationship,
|
|
$sourceBean->getObjectName(),
|
|
$relatedBean->getObjectName()
|
|
)
|
|
);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* @param \SugarBean $sourceBean
|
|
* @param \SugarBean $relatedBean
|
|
*
|
|
* @return string
|
|
* @throws \DomainException In case link field is not found.
|
|
*/
|
|
public function getLinkedFieldName(\SugarBean $sourceBean, \SugarBean $relatedBean)
|
|
{
|
|
$linkedFields = $sourceBean->get_linked_fields();
|
|
$relationship = \Relationship::retrieve_by_modules(
|
|
$sourceBean->module_name,
|
|
$relatedBean->module_name,
|
|
$sourceBean->db
|
|
);
|
|
|
|
$linkFieldName = '';
|
|
foreach ($linkedFields as $linkedField) {
|
|
if ($linkedField['relationship'] === $relationship) {
|
|
$linkFieldName = $linkedField['name'];
|
|
}
|
|
}
|
|
|
|
if (!$linkFieldName) {
|
|
throw new \DomainException(
|
|
sprintf(
|
|
'Link field has not found in %s to determine relationship for %s',
|
|
$sourceBean->getObjectName(),
|
|
$relatedBean->getObjectName()
|
|
)
|
|
);
|
|
}
|
|
|
|
return $linkFieldName;
|
|
}
|
|
|
|
/**
|
|
* @param \SugarBean $sourceBean
|
|
* @param string $linkFieldName
|
|
* @return SugarBean
|
|
*/
|
|
public function getLinkedFieldBean(\SugarBean $sourceBean, $linkFieldName)
|
|
{
|
|
if (!$sourceBean->load_relationship($linkFieldName)) {
|
|
throw new \RuntimeException(
|
|
sprintf('Cannot load relationship %s for %s module', $linkFieldName, $sourceBean->getObjectName())
|
|
);
|
|
}
|
|
|
|
$linkFieldModule = $sourceBean->$linkFieldName->getRelatedModuleName();
|
|
$linkFieldBean = $this->getBean($linkFieldModule);
|
|
|
|
if (!$linkFieldBean) {
|
|
throw new \DomainException(
|
|
sprintf(
|
|
'Link field has not found in %s to determine relationship for %s',
|
|
$sourceBean->getObjectName(),
|
|
$linkFieldName
|
|
)
|
|
);
|
|
}
|
|
|
|
return $linkFieldBean;
|
|
}
|
|
|
|
/**
|
|
* @param string $module
|
|
* @param string $where
|
|
*
|
|
* @return integer
|
|
*/
|
|
public function countRecords($module, $where)
|
|
{
|
|
$rowCount = $this->db->fetchRow(
|
|
$this->db->query(
|
|
sprintf(
|
|
"SELECT COUNT(*) AS cnt FROM %s %s",
|
|
$this->newBeanSafe($module)->getTableName(),
|
|
$where === '' ? '' : 'WHERE ' . $where
|
|
)
|
|
)
|
|
)["cnt"];
|
|
|
|
return (int)$rowCount;
|
|
}
|
|
|
|
/**
|
|
* @param SugarBean $bean
|
|
* @return array
|
|
*/
|
|
public function getDefaultFields(SugarBean $bean)
|
|
{
|
|
return array_column($bean->field_defs, 'name');
|
|
}
|
|
|
|
/**
|
|
* @param SugarBean $bean
|
|
* @param array $fields
|
|
* @return array
|
|
*/
|
|
public function filterAcceptanceFields(SugarBean $bean, array $fields)
|
|
{
|
|
if (!$bean instanceof Person) {
|
|
return $fields;
|
|
}
|
|
|
|
return array_filter(
|
|
$fields,
|
|
static function ($field) use ($bean) {
|
|
return (
|
|
in_array($field, array_column($bean->field_defs, 'name'), true)
|
|
&& (
|
|
empty($bean->field_defs[$field]['link_type'])
|
|
|| $bean->field_defs[$field]['link_type'] !== 'relationship_info'
|
|
)
|
|
);
|
|
}
|
|
);
|
|
}
|
|
}
|