* @package Civi\Api4
*/
class FinancialItem extends Generic\DAOEntity {
-
- /**
- * @see \Civi\Api4\Generic\AbstractEntity::permissions()
- * @return array
- */
- public static function permissions() {
- $permissions = \CRM_Core_Permission::getEntityActionPermissions()['financial_item'] ?? [];
-
- // Merge permissions for this entity with the defaults
- return array_merge($permissions, [
- 'create' => [\CRM_Core_Permission::ALWAYS_DENY_PERMISSION],
- 'update' => [\CRM_Core_Permission::ALWAYS_DENY_PERMISSION],
- ]);
- }
+ use Generic\Traits\ReadOnly;
}
--- /dev/null
+<?php
+/*
+ +--------------------------------------------------------------------+
+ | Copyright CiviCRM LLC. All rights reserved. |
+ | |
+ | This work is published under the GNU AGPLv3 license with some |
+ | permitted exceptions and without any warranty. For full license |
+ | and copyright information, see https://civicrm.org/licensing |
+ +--------------------------------------------------------------------+
+ */
+
+namespace Civi\Api4\Generic\Traits;
+
+/**
+ * Trait for Entities not intended to be publicly writable.
+ */
+trait ReadOnly {
+
+ /**
+ * Not intended to be used outside CiviCRM core code.
+ *
+ * @inheritDoc
+ * @internal
+ */
+ public static function save($checkPermissions = TRUE) {
+ return parent::save($checkPermissions);
+ }
+
+ /**
+ * Not intended to be used outside CiviCRM core code.
+ *
+ * @inheritDoc
+ * @internal
+ */
+ public static function create($checkPermissions = TRUE) {
+ return parent::create($checkPermissions);
+ }
+
+ /**
+ * Not intended to be used outside CiviCRM core code.
+ *
+ * @inheritDoc
+ * @internal
+ */
+ public static function update($checkPermissions = TRUE) {
+ return parent::update($checkPermissions);
+ }
+
+ /**
+ * Not intended to be used outside CiviCRM core code.
+ *
+ * @inheritDoc
+ * @internal
+ */
+ public static function delete($checkPermissions = TRUE) {
+ return parent::delete($checkPermissions);
+ }
+
+ /**
+ * Not intended to be used outside CiviCRM core code.
+ *
+ * @inheritDoc
+ * @internal
+ */
+ public static function replace($checkPermissions = TRUE) {
+ return parent::replace($checkPermissions);
+ }
+
+ /**
+ * @return array
+ */
+ public static function permissions() {
+ $permissions = parent::permissions();
+ $permissions['create'] = $permissions['update'] = $permissions['delete'] = \CRM_Core_Permission::ALWAYS_DENY_PERMISSION;
+ return $permissions;
+ }
+
+}
*/
class ConformanceTest extends UnitTestCase implements HookInterface {
- const READ_ONLY_ENTITIES = '/^(FinancialItem)$/';
-
use \api\v4\Traits\CheckAccessTrait;
use \api\v4\Traits\TableDropperTrait;
use \api\v4\Traits\OptionCleanupTrait {
* @return mixed
*/
protected function checkCreation($entity, $entityClass) {
- $isReadOnly = preg_match(static::READ_ONLY_ENTITIES, $entity);
+ $isReadOnly = $this->isReadOnly($entityClass);
$hookLog = [];
$onValidate = function(ValidateValuesEvent $e) use (&$hookLog) {
catch (UnauthorizedException $e) {
// OK, expected exception
}
- if (!preg_match(static::READ_ONLY_ENTITIES, $entity)) {
+ if (!$this->isReadOnly($entityClass)) {
$this->assertEquals(1, $this->checkAccessCounts["{$entity}::create"]);
}
$this->resetCheckAccess();
* @param \Civi\Api4\Generic\AbstractEntity|string $entityClass
*/
protected function checkDeleteWithNoId($entityClass) {
- $exceptionThrown = '';
try {
$entityClass::delete()
->execute();
+ $this->fail("$entityClass should require ID to delete.");
}
catch (\API_Exception $e) {
- $exceptionThrown = $e->getMessage();
+ // OK
}
- $this->assertStringContainsString('required', $exceptionThrown);
}
/**
protected function checkDeletionAllowed($entityClass, $id, $entity) {
$this->setCheckAccessGrants(["{$entity}::delete" => TRUE]);
$this->assertEquals(0, $this->checkAccessCounts["{$entity}::delete"]);
+ $isReadOnly = $this->isReadOnly($entityClass);
$deleteResult = $entityClass::delete()
+ ->setCheckPermissions(!$isReadOnly)
->addWhere('id', '=', $id)
->execute();
// should get back an array of deleted id
$this->assertEquals([['id' => $id]], (array) $deleteResult);
- $this->assertEquals(1, $this->checkAccessCounts["{$entity}::delete"]);
+ if (!$isReadOnly) {
+ $this->assertEquals(1, $this->checkAccessCounts["{$entity}::delete"]);
+ }
$this->resetCheckAccess();
}
// OK
}
- $this->assertEquals(1, $this->checkAccessCounts["{$entity}::delete"]);
+ if (!$this->isReadOnly($entityClass)) {
+ $this->assertEquals(1, $this->checkAccessCounts["{$entity}::delete"]);
+ }
$this->resetCheckAccess();
}
return $result;
}
+ /**
+ * @param \Civi\Api4\Generic\AbstractEntity|string $entityClass
+ * @return bool
+ */
+ protected function isReadOnly($entityClass) {
+ return in_array('ReadOnly', $entityClass::getInfo()['type'], TRUE);
+ }
+
}