From 58b85361e4170c987f175e1941cbdcc158273f63 Mon Sep 17 00:00:00 2001 From: Monish Deb Date: Wed, 2 Jun 2021 11:10:36 +0530 Subject: [PATCH] Add AclRole Api4 Entity --- CRM/ACL/BAO/ACLEntityRole.php | 88 ++++++ CRM/ACL/BAO/EntityRole.php | 69 +---- CRM/ACL/DAO/ACLEntityRole.php | 273 ++++++++++++++++++ CRM/ACL/DAO/EntityRole.php | 263 +---------------- CRM/Core/DAO/AllCoreTables.data.php | 6 +- Civi/Api4/ACLEntityRole.php | 30 ++ .../ACLEntityRoleCreationSpecProvider.php | 40 +++ api/v3/AclRole.php | 2 +- api/v3/utils.php | 3 +- .../phpunit/api/v3/SyntaxConformanceTest.php | 2 +- .../ACL/{EntityRole.xml => ACLEntityRole.xml} | 5 +- xml/schema/ACL/files.xml | 2 +- 12 files changed, 445 insertions(+), 338 deletions(-) create mode 100644 CRM/ACL/BAO/ACLEntityRole.php create mode 100644 CRM/ACL/DAO/ACLEntityRole.php create mode 100644 Civi/Api4/ACLEntityRole.php create mode 100644 Civi/Api4/Service/Spec/Provider/ACLEntityRoleCreationSpecProvider.php rename xml/schema/ACL/{EntityRole.xml => ACLEntityRole.xml} (93%) diff --git a/CRM/ACL/BAO/ACLEntityRole.php b/CRM/ACL/BAO/ACLEntityRole.php new file mode 100644 index 0000000000..b50c256e17 --- /dev/null +++ b/CRM/ACL/BAO/ACLEntityRole.php @@ -0,0 +1,88 @@ + ts('Contact'), + 'civicrm_group' => ts('Group'), + ]; + } + return self::$_entityTable; + } + + /** + * @param array $params + * + * @return CRM_ACL_DAO_EntityRole + */ + public static function create(&$params) { + $dao = new CRM_ACL_DAO_EntityRole(); + $dao->copyValues($params); + $dao->save(); + return $dao; + } + + /** + * @param array $params + * @param $defaults + */ + public static function retrieve(&$params, &$defaults) { + CRM_Core_DAO::commonRetrieve('CRM_ACL_DAO_EntityRole', $params, $defaults); + } + + /** + * Update the is_active flag in the db. + * + * @param int $id + * Id of the database record. + * @param bool $is_active + * Value we want to set the is_active field. + * + * @return bool + * true if we found and updated the object, else false + */ + public static function setIsActive($id, $is_active) { + return CRM_Core_DAO::setFieldValue('CRM_ACL_DAO_EntityRole', $id, 'is_active', $is_active); + } + + /** + * Delete Entity Role records. + * + * @param int $entityRoleId + * ID of the EntityRole record to be deleted. + * + */ + public static function del($entityRoleId) { + $entityDAO = new CRM_ACL_DAO_EntityRole(); + $entityDAO->id = $entityRoleId; + $entityDAO->find(TRUE); + $entityDAO->delete(); + } + +} diff --git a/CRM/ACL/BAO/EntityRole.php b/CRM/ACL/BAO/EntityRole.php index b2603ca868..8a72c8006c 100644 --- a/CRM/ACL/BAO/EntityRole.php +++ b/CRM/ACL/BAO/EntityRole.php @@ -18,71 +18,4 @@ /** * Access Control EntityRole. */ -class CRM_ACL_BAO_EntityRole extends CRM_ACL_DAO_EntityRole { - public static $_entityTable = NULL; - - /** - * Get entity table. - * - * @return array|null - */ - public static function entityTable() { - if (!self::$_entityTable) { - self::$_entityTable = [ - 'civicrm_contact' => ts('Contact'), - 'civicrm_group' => ts('Group'), - ]; - } - return self::$_entityTable; - } - - /** - * @param array $params - * - * @return CRM_ACL_DAO_EntityRole - */ - public static function create(&$params) { - $dao = new CRM_ACL_DAO_EntityRole(); - $dao->copyValues($params); - $dao->save(); - return $dao; - } - - /** - * @param array $params - * @param $defaults - */ - public static function retrieve(&$params, &$defaults) { - CRM_Core_DAO::commonRetrieve('CRM_ACL_DAO_EntityRole', $params, $defaults); - } - - /** - * Update the is_active flag in the db. - * - * @param int $id - * Id of the database record. - * @param bool $is_active - * Value we want to set the is_active field. - * - * @return bool - * true if we found and updated the object, else false - */ - public static function setIsActive($id, $is_active) { - return CRM_Core_DAO::setFieldValue('CRM_ACL_DAO_EntityRole', $id, 'is_active', $is_active); - } - - /** - * Delete Entity Role records. - * - * @param int $entityRoleId - * ID of the EntityRole record to be deleted. - * - */ - public static function del($entityRoleId) { - $entityDAO = new CRM_ACL_DAO_EntityRole(); - $entityDAO->id = $entityRoleId; - $entityDAO->find(TRUE); - $entityDAO->delete(); - } - -} +class CRM_ACL_BAO_EntityRole extends CRM_ACL_BAO_ACLEntityRole {} diff --git a/CRM/ACL/DAO/ACLEntityRole.php b/CRM/ACL/DAO/ACLEntityRole.php new file mode 100644 index 0000000000..0c8b374a0f --- /dev/null +++ b/CRM/ACL/DAO/ACLEntityRole.php @@ -0,0 +1,273 @@ +__table = 'civicrm_acl_entity_role'; + parent::__construct(); + } + + /** + * Returns localized title of this entity. + * + * @param bool $plural + * Whether to return the plural version of the title. + */ + public static function getEntityTitle($plural = FALSE) { + return $plural ? ts('ACLEntity Roles') : ts('ACLEntity Role'); + } + + /** + * Returns foreign keys and entity references. + * + * @return array + * [CRM_Core_Reference_Interface] + */ + public static function getReferenceColumns() { + if (!isset(Civi::$statics[__CLASS__]['links'])) { + Civi::$statics[__CLASS__]['links'] = static::createReferenceColumns(__CLASS__); + Civi::$statics[__CLASS__]['links'][] = new CRM_Core_Reference_Dynamic(self::getTableName(), 'entity_id', NULL, 'id', 'entity_table'); + CRM_Core_DAO_AllCoreTables::invoke(__CLASS__, 'links_callback', Civi::$statics[__CLASS__]['links']); + } + return Civi::$statics[__CLASS__]['links']; + } + + /** + * Returns all the column names of this table + * + * @return array + */ + public static function &fields() { + if (!isset(Civi::$statics[__CLASS__]['fields'])) { + Civi::$statics[__CLASS__]['fields'] = [ + 'id' => [ + 'name' => 'id', + 'type' => CRM_Utils_Type::T_INT, + 'title' => ts('Entity Role'), + 'description' => ts('Unique table ID'), + 'required' => TRUE, + 'where' => 'civicrm_acl_entity_role.id', + 'table_name' => 'civicrm_acl_entity_role', + 'entity' => 'ACLEntityRole', + 'bao' => 'CRM_ACL_BAO_ACLEntityRole', + 'localizable' => 0, + 'html' => [ + 'type' => 'Number', + ], + 'readonly' => TRUE, + 'add' => '1.6', + ], + 'acl_role_id' => [ + 'name' => 'acl_role_id', + 'type' => CRM_Utils_Type::T_INT, + 'title' => ts('ACL Role ID'), + 'description' => ts('Foreign Key to ACL Role (which is an option value pair and hence an implicit FK)'), + 'required' => TRUE, + 'where' => 'civicrm_acl_entity_role.acl_role_id', + 'table_name' => 'civicrm_acl_entity_role', + 'entity' => 'ACLEntityRole', + 'bao' => 'CRM_ACL_BAO_ACLEntityRole', + 'localizable' => 0, + 'add' => '1.6', + ], + 'entity_table' => [ + 'name' => 'entity_table', + 'type' => CRM_Utils_Type::T_STRING, + 'title' => ts('Entity Table'), + 'description' => ts('Table of the object joined to the ACL Role (Contact or Group)'), + 'required' => TRUE, + 'maxlength' => 64, + 'size' => CRM_Utils_Type::BIG, + 'where' => 'civicrm_acl_entity_role.entity_table', + 'table_name' => 'civicrm_acl_entity_role', + 'entity' => 'ACLEntityRole', + 'bao' => 'CRM_ACL_BAO_ACLEntityRole', + 'localizable' => 0, + 'pseudoconstant' => [ + 'callback' => 'CRM_ACL_BAO_ACLEntityRole::entityTables', + ], + 'add' => '1.6', + ], + 'entity_id' => [ + 'name' => 'entity_id', + 'type' => CRM_Utils_Type::T_INT, + 'title' => ts('ACL Entity ID'), + 'description' => ts('ID of the group/contact object being joined'), + 'required' => TRUE, + 'where' => 'civicrm_acl_entity_role.entity_id', + 'table_name' => 'civicrm_acl_entity_role', + 'entity' => 'ACLEntityRole', + 'bao' => 'CRM_ACL_BAO_ACLEntityRole', + 'localizable' => 0, + 'add' => '1.6', + ], + 'is_active' => [ + 'name' => 'is_active', + 'type' => CRM_Utils_Type::T_BOOLEAN, + 'title' => ts('ACL Entity Role is Active'), + 'description' => ts('Is this property active?'), + 'where' => 'civicrm_acl_entity_role.is_active', + 'table_name' => 'civicrm_acl_entity_role', + 'entity' => 'ACLEntityRole', + 'bao' => 'CRM_ACL_BAO_ACLEntityRole', + 'localizable' => 0, + 'add' => '1.6', + ], + ]; + CRM_Core_DAO_AllCoreTables::invoke(__CLASS__, 'fields_callback', Civi::$statics[__CLASS__]['fields']); + } + return Civi::$statics[__CLASS__]['fields']; + } + + /** + * Return a mapping from field-name to the corresponding key (as used in fields()). + * + * @return array + * Array(string $name => string $uniqueName). + */ + public static function &fieldKeys() { + if (!isset(Civi::$statics[__CLASS__]['fieldKeys'])) { + Civi::$statics[__CLASS__]['fieldKeys'] = array_flip(CRM_Utils_Array::collect('name', self::fields())); + } + return Civi::$statics[__CLASS__]['fieldKeys']; + } + + /** + * Returns the names of this table + * + * @return string + */ + public static function getTableName() { + return self::$_tableName; + } + + /** + * Returns if this table needs to be logged + * + * @return bool + */ + public function getLog() { + return self::$_log; + } + + /** + * Returns the list of fields that can be imported + * + * @param bool $prefix + * + * @return array + */ + public static function &import($prefix = FALSE) { + $r = CRM_Core_DAO_AllCoreTables::getImports(__CLASS__, 'acl_entity_role', $prefix, []); + return $r; + } + + /** + * Returns the list of fields that can be exported + * + * @param bool $prefix + * + * @return array + */ + public static function &export($prefix = FALSE) { + $r = CRM_Core_DAO_AllCoreTables::getExports(__CLASS__, 'acl_entity_role', $prefix, []); + return $r; + } + + /** + * Returns the list of indices + * + * @param bool $localize + * + * @return array + */ + public static function indices($localize = TRUE) { + $indices = [ + 'index_role' => [ + 'name' => 'index_role', + 'field' => [ + 0 => 'acl_role_id', + ], + 'localizable' => FALSE, + 'sig' => 'civicrm_acl_entity_role::0::acl_role_id', + ], + 'index_entity' => [ + 'name' => 'index_entity', + 'field' => [ + 0 => 'entity_table', + 1 => 'entity_id', + ], + 'localizable' => FALSE, + 'sig' => 'civicrm_acl_entity_role::0::entity_table::entity_id', + ], + ]; + return ($localize && !empty($indices)) ? CRM_Core_DAO_AllCoreTables::multilingualize(__CLASS__, $indices) : $indices; + } + +} diff --git a/CRM/ACL/DAO/EntityRole.php b/CRM/ACL/DAO/EntityRole.php index 3bf022dba0..5bd5f14a32 100644 --- a/CRM/ACL/DAO/EntityRole.php +++ b/CRM/ACL/DAO/EntityRole.php @@ -3,268 +3,9 @@ /** * @package CRM * @copyright CiviCRM LLC https://civicrm.org/licensing - * - * Generated from xml/schema/CRM/ACL/EntityRole.xml - * DO NOT EDIT. Generated by CRM_Core_CodeGen - * (GenCodeChecksum:c26077f17afc43e2f44efca99ae8e8fe) */ /** - * Database access object for the EntityRole entity. + * Database access object for the ACLEntityRole entity. */ -class CRM_ACL_DAO_EntityRole extends CRM_Core_DAO { - const EXT = 'civicrm'; - const TABLE_ADDED = '1.6'; - - /** - * Static instance to hold the table name. - * - * @var string - */ - public static $_tableName = 'civicrm_acl_entity_role'; - - /** - * Should CiviCRM log any modifications to this table in the civicrm_log table. - * - * @var bool - */ - public static $_log = FALSE; - - /** - * Unique table ID - * - * @var int - */ - public $id; - - /** - * Foreign Key to ACL Role (which is an option value pair and hence an implicit FK) - * - * @var int - */ - public $acl_role_id; - - /** - * Table of the object joined to the ACL Role (Contact or Group) - * - * @var string - */ - public $entity_table; - - /** - * ID of the group/contact object being joined - * - * @var int - */ - public $entity_id; - - /** - * Is this property active? - * - * @var bool - */ - public $is_active; - - /** - * Class constructor. - */ - public function __construct() { - $this->__table = 'civicrm_acl_entity_role'; - parent::__construct(); - } - - /** - * Returns localized title of this entity. - * - * @param bool $plural - * Whether to return the plural version of the title. - */ - public static function getEntityTitle($plural = FALSE) { - return $plural ? ts('Entity Roles') : ts('Entity Role'); - } - - /** - * Returns foreign keys and entity references. - * - * @return array - * [CRM_Core_Reference_Interface] - */ - public static function getReferenceColumns() { - if (!isset(Civi::$statics[__CLASS__]['links'])) { - Civi::$statics[__CLASS__]['links'] = static::createReferenceColumns(__CLASS__); - Civi::$statics[__CLASS__]['links'][] = new CRM_Core_Reference_Dynamic(self::getTableName(), 'entity_id', NULL, 'id', 'entity_table'); - CRM_Core_DAO_AllCoreTables::invoke(__CLASS__, 'links_callback', Civi::$statics[__CLASS__]['links']); - } - return Civi::$statics[__CLASS__]['links']; - } - - /** - * Returns all the column names of this table - * - * @return array - */ - public static function &fields() { - if (!isset(Civi::$statics[__CLASS__]['fields'])) { - Civi::$statics[__CLASS__]['fields'] = [ - 'id' => [ - 'name' => 'id', - 'type' => CRM_Utils_Type::T_INT, - 'title' => ts('Entity Role'), - 'description' => ts('Unique table ID'), - 'required' => TRUE, - 'where' => 'civicrm_acl_entity_role.id', - 'table_name' => 'civicrm_acl_entity_role', - 'entity' => 'EntityRole', - 'bao' => 'CRM_ACL_BAO_EntityRole', - 'localizable' => 0, - 'html' => [ - 'type' => 'Number', - ], - 'readonly' => TRUE, - 'add' => '1.6', - ], - 'acl_role_id' => [ - 'name' => 'acl_role_id', - 'type' => CRM_Utils_Type::T_INT, - 'title' => ts('ACL Role ID'), - 'description' => ts('Foreign Key to ACL Role (which is an option value pair and hence an implicit FK)'), - 'required' => TRUE, - 'where' => 'civicrm_acl_entity_role.acl_role_id', - 'table_name' => 'civicrm_acl_entity_role', - 'entity' => 'EntityRole', - 'bao' => 'CRM_ACL_BAO_EntityRole', - 'localizable' => 0, - 'add' => '1.6', - ], - 'entity_table' => [ - 'name' => 'entity_table', - 'type' => CRM_Utils_Type::T_STRING, - 'title' => ts('Entity Table'), - 'description' => ts('Table of the object joined to the ACL Role (Contact or Group)'), - 'required' => TRUE, - 'maxlength' => 64, - 'size' => CRM_Utils_Type::BIG, - 'where' => 'civicrm_acl_entity_role.entity_table', - 'table_name' => 'civicrm_acl_entity_role', - 'entity' => 'EntityRole', - 'bao' => 'CRM_ACL_BAO_EntityRole', - 'localizable' => 0, - 'add' => '1.6', - ], - 'entity_id' => [ - 'name' => 'entity_id', - 'type' => CRM_Utils_Type::T_INT, - 'title' => ts('ACL Entity ID'), - 'description' => ts('ID of the group/contact object being joined'), - 'required' => TRUE, - 'where' => 'civicrm_acl_entity_role.entity_id', - 'table_name' => 'civicrm_acl_entity_role', - 'entity' => 'EntityRole', - 'bao' => 'CRM_ACL_BAO_EntityRole', - 'localizable' => 0, - 'add' => '1.6', - ], - 'is_active' => [ - 'name' => 'is_active', - 'type' => CRM_Utils_Type::T_BOOLEAN, - 'title' => ts('ACL Entity Role is Active'), - 'description' => ts('Is this property active?'), - 'where' => 'civicrm_acl_entity_role.is_active', - 'table_name' => 'civicrm_acl_entity_role', - 'entity' => 'EntityRole', - 'bao' => 'CRM_ACL_BAO_EntityRole', - 'localizable' => 0, - 'add' => '1.6', - ], - ]; - CRM_Core_DAO_AllCoreTables::invoke(__CLASS__, 'fields_callback', Civi::$statics[__CLASS__]['fields']); - } - return Civi::$statics[__CLASS__]['fields']; - } - - /** - * Return a mapping from field-name to the corresponding key (as used in fields()). - * - * @return array - * Array(string $name => string $uniqueName). - */ - public static function &fieldKeys() { - if (!isset(Civi::$statics[__CLASS__]['fieldKeys'])) { - Civi::$statics[__CLASS__]['fieldKeys'] = array_flip(CRM_Utils_Array::collect('name', self::fields())); - } - return Civi::$statics[__CLASS__]['fieldKeys']; - } - - /** - * Returns the names of this table - * - * @return string - */ - public static function getTableName() { - return self::$_tableName; - } - - /** - * Returns if this table needs to be logged - * - * @return bool - */ - public function getLog() { - return self::$_log; - } - - /** - * Returns the list of fields that can be imported - * - * @param bool $prefix - * - * @return array - */ - public static function &import($prefix = FALSE) { - $r = CRM_Core_DAO_AllCoreTables::getImports(__CLASS__, 'acl_entity_role', $prefix, []); - return $r; - } - - /** - * Returns the list of fields that can be exported - * - * @param bool $prefix - * - * @return array - */ - public static function &export($prefix = FALSE) { - $r = CRM_Core_DAO_AllCoreTables::getExports(__CLASS__, 'acl_entity_role', $prefix, []); - return $r; - } - - /** - * Returns the list of indices - * - * @param bool $localize - * - * @return array - */ - public static function indices($localize = TRUE) { - $indices = [ - 'index_role' => [ - 'name' => 'index_role', - 'field' => [ - 0 => 'acl_role_id', - ], - 'localizable' => FALSE, - 'sig' => 'civicrm_acl_entity_role::0::acl_role_id', - ], - 'index_entity' => [ - 'name' => 'index_entity', - 'field' => [ - 0 => 'entity_table', - 1 => 'entity_id', - ], - 'localizable' => FALSE, - 'sig' => 'civicrm_acl_entity_role::0::entity_table::entity_id', - ], - ]; - return ($localize && !empty($indices)) ? CRM_Core_DAO_AllCoreTables::multilingualize(__CLASS__, $indices) : $indices; - } - -} +class CRM_ACL_DAO_EntityRole extends CRM_ACL_DAO_ACLEntityRole {} diff --git a/CRM/Core/DAO/AllCoreTables.data.php b/CRM/Core/DAO/AllCoreTables.data.php index 7dfc5e67ba..2b84c1d943 100644 --- a/CRM/Core/DAO/AllCoreTables.data.php +++ b/CRM/Core/DAO/AllCoreTables.data.php @@ -87,9 +87,9 @@ return [ 'class' => 'CRM_ACL_DAO_ACLCache', 'table' => 'civicrm_acl_cache', ], - 'CRM_ACL_DAO_EntityRole' => [ - 'name' => 'EntityRole', - 'class' => 'CRM_ACL_DAO_EntityRole', + 'CRM_ACL_DAO_ACLEntityRole' => [ + 'name' => 'ACLEntityRole', + 'class' => 'CRM_ACL_DAO_ACLEntityRole', 'table' => 'civicrm_acl_entity_role', ], 'CRM_Contact_DAO_Contact' => [ diff --git a/Civi/Api4/ACLEntityRole.php b/Civi/Api4/ACLEntityRole.php new file mode 100644 index 0000000000..aa0047d4f9 --- /dev/null +++ b/Civi/Api4/ACLEntityRole.php @@ -0,0 +1,30 @@ +getFieldByName('is_active')->setDefaultValue(1); + } + + /** + * @inheritDoc + */ + public function applies($entity, $action) { + return $entity === 'ACLEntityRole' && $action === 'create'; + } + +} diff --git a/api/v3/AclRole.php b/api/v3/AclRole.php index aa7254f70c..450806c4d9 100644 --- a/api/v3/AclRole.php +++ b/api/v3/AclRole.php @@ -24,7 +24,7 @@ * API result array */ function civicrm_api3_acl_role_create($params) { - return _civicrm_api3_basic_create(_civicrm_api3_get_BAO(__FUNCTION__), $params, 'EntityRole'); + return _civicrm_api3_basic_create(_civicrm_api3_get_BAO(__FUNCTION__), $params, 'ACLEntityRole'); } /** diff --git a/api/v3/utils.php b/api/v3/utils.php index ecea480739..c9a7f03fef 100644 --- a/api/v3/utils.php +++ b/api/v3/utils.php @@ -320,9 +320,8 @@ function _civicrm_api3_get_DAO($name) { if ($name === 'MailingRecipients') { return 'CRM_Mailing_DAO_Recipients'; } - // FIXME: DAO should be renamed CRM_ACL_DAO_AclRole if ($name === 'AclRole') { - return 'CRM_ACL_DAO_EntityRole'; + return 'CRM_ACL_DAO_ACLEntityRole'; } // FIXME: DAO should be renamed CRM_SMS_DAO_SmsProvider // But this would impact SMS extensions so need to coordinate diff --git a/tests/phpunit/api/v3/SyntaxConformanceTest.php b/tests/phpunit/api/v3/SyntaxConformanceTest.php index 930d6882e6..01e7c2a8a4 100644 --- a/tests/phpunit/api/v3/SyntaxConformanceTest.php +++ b/tests/phpunit/api/v3/SyntaxConformanceTest.php @@ -861,7 +861,7 @@ class api_v3_SyntaxConformanceTest extends CiviUnitTestCase { $entitiesWithNamingIssues = [ 'SmsProvider' => 'Provider', - 'AclRole' => 'EntityRole', + 'AclRole' => 'ACLEntityRole', 'MailingEventQueue' => 'Queue', 'Dedupe' => 'PrevNextCache', 'Exception' => 'DedupeException', diff --git a/xml/schema/ACL/EntityRole.xml b/xml/schema/ACL/ACLEntityRole.xml similarity index 93% rename from xml/schema/ACL/EntityRole.xml rename to xml/schema/ACL/ACLEntityRole.xml index 8679d27fc8..836ab90561 100644 --- a/xml/schema/ACL/EntityRole.xml +++ b/xml/schema/ACL/ACLEntityRole.xml @@ -2,7 +2,7 @@ CRM/ACL - EntityRole + ACLEntityRolecivicrm_acl_entity_roleJoin table for Contacts and Groups to ACL Roles1.6 @@ -35,6 +35,9 @@ varchar64true + + CRM_ACL_BAO_ACLEntityRole::entityTables + Table of the object joined to the ACL Role (Contact or Group)1.6 diff --git a/xml/schema/ACL/files.xml b/xml/schema/ACL/files.xml index 2c156ee04c..a7255e9c70 100644 --- a/xml/schema/ACL/files.xml +++ b/xml/schema/ACL/files.xml @@ -4,6 +4,6 @@ - + -- 2.25.1