You are here

class TeamStorage in Apigee Edge 8

Entity storage implementation for teams.

Hierarchy

Expanded class hierarchy of TeamStorage

File

modules/apigee_edge_teams/src/Entity/Storage/TeamStorage.php, line 45

Namespace

Drupal\apigee_edge_teams\Entity\Storage
View source
class TeamStorage extends AttributesAwareFieldableEdgeEntityStorageBase implements TeamStorageInterface {

  /**
   * The team controller service.
   *
   * @var \Drupal\apigee_edge_teams\Entity\Controller\TeamControllerInterface
   */
  private $teamController;

  /**
   * The entity type manager.
   *
   * @var \Drupal\Core\Entity\EntityTypeManagerInterface
   */
  protected $entityTypeManager;

  /**
   * The logger.
   *
   * @var \Psr\Log\LoggerInterface
   */
  private $logger;

  /**
   * Constructs an DeveloperStorage instance.
   *
   * @param \Drupal\Core\Entity\EntityTypeInterface $entity_type
   *   The entity type definition.
   * @param \Drupal\Core\Cache\CacheBackendInterface $cache_backend
   *   The cache backend to be used.
   * @param \Drupal\Core\Cache\MemoryCache\MemoryCacheInterface $memory_cache
   *   The memory cache.
   * @param \Drupal\Component\Datetime\TimeInterface $system_time
   *   The system time.
   * @param \Drupal\apigee_edge_teams\Entity\Controller\TeamControllerInterface $team_controller
   *   The team controller service.
   * @param \Drupal\Core\Entity\EntityTypeManagerInterface $entity_type_manager
   *   The entity type manager.
   * @param \Drupal\Core\Config\ConfigFactoryInterface $config
   *   Configuration factory.
   * @param \Psr\Log\LoggerInterface $logger
   *   The logger.
   */
  public function __construct(EntityTypeInterface $entity_type, CacheBackendInterface $cache_backend, MemoryCacheInterface $memory_cache, TimeInterface $system_time, TeamControllerInterface $team_controller, EntityTypeManagerInterface $entity_type_manager, ConfigFactoryInterface $config, LoggerInterface $logger) {
    parent::__construct($entity_type, $cache_backend, $memory_cache, $system_time);
    $this->teamController = $team_controller;
    $this->cacheExpiration = $config
      ->get('apigee_edge_teams.team_settings')
      ->get('cache_expiration');
    $this->entityTypeManager = $entity_type_manager;
    $this->logger = $logger;
  }

  /**
   * {@inheritdoc}
   */
  public static function createInstance(ContainerInterface $container, EntityTypeInterface $entity_type) {
    return new static($entity_type, $container
      ->get('cache.apigee_edge_entity'), $container
      ->get('entity.memory_cache'), $container
      ->get('datetime.time'), $container
      ->get('apigee_edge_teams.controller.team'), $container
      ->get('entity_type.manager'), $container
      ->get('config.factory'), $container
      ->get('logger.channel.apigee_edge_teams'));
  }

  /**
   * {@inheritdoc}
   */
  protected function entityController() : EdgeEntityControllerInterface {
    if ($this->teamController instanceof EntityCacheAwareControllerInterface) {
      return new CachedManagementApiEdgeEntityControllerProxy($this->teamController);
    }
    return new ManagementApiEdgeEntityControllerProxy($this->teamController);
  }

  /**
   * {@inheritdoc}
   */
  protected function doSave($id, EntityInterface $entity) {

    /** @var \Drupal\apigee_edge_teams\Entity\TeamInterface $entity */
    $team_status = $entity
      ->getStatus();
    $result = parent::doSave($id, $entity);

    // Change the status of the team (company) in Apigee Edge.
    // TODO Only change it if it has changed.
    try {
      $this->teamController
        ->setStatus($entity
        ->id(), $team_status);
    } catch (ApiException $exception) {
      throw new EntityStorageException($exception
        ->getMessage(), $exception
        ->getCode(), $exception);
    }

    // Apply status change in the entity object as well.
    $entity
      ->setStatus($team_status);
    return $result;
  }

  /**
   * {@inheritdoc}
   */
  protected function doPostSave(EntityInterface $entity, $update) {

    /** @var \Drupal\apigee_edge_teams\Entity\TeamInterface $entity */
    if (!$update) {

      /** @var \Drupal\apigee_edge_teams\Entity\Storage\TeamMemberRoleStorageInterface $team_member_role_storage */
      $team_member_role_storage = $this->entityTypeManager
        ->getStorage('team_member_role');

      /** @var \Drupal\apigee_edge_teams\Entity\TeamMemberRoleInterface[] $team_roles_by_teams */
      $team_roles_by_teams = $team_member_role_storage
        ->loadByTeam($entity);
      if ($team_roles_by_teams) {

        // Teams (Companies) can be deleted outside of Drupal so it could
        // happen that remnant team member roles exist in database when
        // a new team gets created with a previously used team id.
        $context = [
          '%team' => "{$entity->label()} ({$entity->id()})",
          'link' => $entity
            ->toLink($this
            ->t('Members'), 'members')
            ->toString(),
        ];
        $this->logger
          ->warning('Integrity check: Remnant team member roles found for new %team team.', $context);
        $success = TRUE;
        foreach ($team_roles_by_teams as $team_member_role) {
          try {
            $team_member_role
              ->delete();
          } catch (\Exception $exception) {
            $success = FALSE;
            $context += Error::decodeException($exception);
            $this->logger
              ->warning('Failed to remove remnant developer role from new %team team. @message %function (line %line of %file). <pre>@backtrace_string</pre>', $context);
          }
        }
        if ($success) {
          $this->logger
            ->info('Integrity check: Successfully removed all remnant team member roles in association with the new %team team.', $context);
        }
        else {
          $this->logger
            ->critical('Integrity check: Failed to remove all remnant team member roles from the database for the new %team team.', $context);
        }
      }
    }
    parent::doPostSave($entity, $update);
  }

  /**
   * {@inheritdoc}
   */
  protected function doDelete($entities) {
    parent::doDelete($entities);

    /** @var \Drupal\apigee_edge_teams\Entity\Storage\TeamMemberRoleStorageInterface $team_member_role_storage */
    $team_member_role_storage = $this->entityTypeManager
      ->getStorage('team_member_role');

    /** @var \Drupal\apigee_edge_teams\Entity\TeamMemberRoleInterface[] $dev_roles_by_teams */
    $dev_roles_by_teams = $team_member_role_storage
      ->loadByProperties([
      'team' => array_keys($entities),
    ]);

    // When a team gets deleted all team member roles related to the team
    // should be deleted from the database.
    foreach ($dev_roles_by_teams as $role) {
      try {
        $role
          ->delete();
      } catch (\Exception $exception) {
        $context = [
          '%team' => "{$role->getTeam()->label()} ({$role->getTeam()->id()})",
          '%developer' => $role
            ->getDeveloper()
            ->getEmail(),
        ];
        $context += Error::decodeException($exception);
        $this->logger
          ->critical("Integrity check: Failed to remove %developer team member's role(s) from %team team when team got deleted. @message %function (line %line of %file). <pre>@backtrace_string</pre>", $context);
      }
    }
  }

}

Members

Namesort descending Modifiers Type Description Overrides
AttributesAwareFieldableEdgeEntityStorageBase::countFieldData public function Determines the number of entities with values for a given field. Overrides FieldableEdgeEntityStorageBase::countFieldData
DependencySerializationTrait::$_entityStorages protected property An array of entity type IDs keyed by the property name of their storages.
DependencySerializationTrait::$_serviceIds protected property An array of service IDs keyed by property name used for serialization.
DependencySerializationTrait::__sleep public function 1
DependencySerializationTrait::__wakeup public function 2
EdgeEntityStorageBase::$cacheBackend protected property Cache backend.
EdgeEntityStorageBase::$cacheExpiration protected property Number of seconds until an entity can be served from cache.
EdgeEntityStorageBase::$systemTime protected property The system time.
EdgeEntityStorageBase::buildCacheId protected function Builds the cache ID for the passed in entity ID. Overrides EntityStorageBase::buildCacheId
EdgeEntityStorageBase::createNewInstance protected function Creates a new Drupal entity from an SDK entity.
EdgeEntityStorageBase::deleteRevision public function Delete a specific entity revision. Overrides EntityStorageInterface::deleteRevision
EdgeEntityStorageBase::doLoadMultiple protected function Performs storage-specific loading of entities. Overrides EntityStorageBase::doLoadMultiple
EdgeEntityStorageBase::getFromPersistentCache protected function Gets entities from the persistent cache backend.
EdgeEntityStorageBase::getFromStorage protected function Gets entities from the storage. 1
EdgeEntityStorageBase::getPersistentCacheExpiration protected function Number of seconds after a cache item expires.
EdgeEntityStorageBase::getQueryServiceName protected function Gets the name of the service for the query for this entity storage. Overrides EntityStorageBase::getQueryServiceName
EdgeEntityStorageBase::has protected function Determines if this entity already exists in storage. Overrides EntityStorageBase::has
EdgeEntityStorageBase::invokeStorageLoadHook protected function Invokes hook_entity_storage_load().
EdgeEntityStorageBase::loadRevision public function Load a specific entity revision. Overrides EntityStorageInterface::loadRevision
EdgeEntityStorageBase::loadUnchanged public function Loads an unchanged entity from the database. Overrides EntityStorageBase::loadUnchanged 1
EdgeEntityStorageBase::processLoadedEntities final protected function Processes loaded (SDK) entities to Drupal entities.
EdgeEntityStorageBase::resetCache public function Resets the internal, static entity cache. Overrides EntityStorageBase::resetCache 2
EdgeEntityStorageBase::resetControllerCache protected function Resets entity controller's cache if it is a cached entity controller.
EdgeEntityStorageBase::SAVED_UNKNOWN public constant Initial status for saving a item to Apigee Edge.
EdgeEntityStorageBase::setPersistentCache protected function Stores entities in the persistent cache backend. 2
EdgeEntityStorageBase::withController protected function Wraps communication with Apigee Edge.
EntityHandlerBase::$moduleHandler protected property The module handler to invoke hooks on. 2
EntityHandlerBase::moduleHandler protected function Gets the module handler. 2
EntityHandlerBase::setModuleHandler public function Sets the module handler for this handler.
EntityStorageBase::$entityClass protected property Name of the entity class.
EntityStorageBase::$entityType protected property Information about the entity type.
EntityStorageBase::$entityTypeId protected property Entity type ID for this storage.
EntityStorageBase::$idKey protected property Name of the entity's ID field in the entity database table.
EntityStorageBase::$langcodeKey protected property The name of the entity langcode property. 1
EntityStorageBase::$memoryCache protected property The memory cache.
EntityStorageBase::$memoryCacheTag protected property The memory cache cache tag.
EntityStorageBase::$uuidKey protected property Name of entity's UUID database table field, if it supports UUIDs. 1
EntityStorageBase::$uuidService protected property The UUID service. 1
EntityStorageBase::buildPropertyQuery protected function Builds an entity query. 1
EntityStorageBase::create public function Constructs a new entity object, without permanently saving it. Overrides EntityStorageInterface::create 1
EntityStorageBase::delete public function Deletes permanently saved entities. Overrides EntityStorageInterface::delete 2
EntityStorageBase::doPreSave protected function Performs presave entity processing. 1
EntityStorageBase::getAggregateQuery public function Gets an aggregated query instance. Overrides EntityStorageInterface::getAggregateQuery
EntityStorageBase::getEntityType public function Gets the entity type definition. Overrides EntityStorageInterface::getEntityType
EntityStorageBase::getEntityTypeId public function Gets the entity type ID. Overrides EntityStorageInterface::getEntityTypeId
EntityStorageBase::getFromStaticCache protected function Gets entities from the static cache.
EntityStorageBase::getQuery public function Gets an entity query instance. Overrides EntityStorageInterface::getQuery
EntityStorageBase::hasData public function Determines if the storage contains any data. Overrides EntityStorageInterface::hasData 3
EntityStorageBase::invokeHook protected function Invokes a hook on behalf of the entity. 2
EntityStorageBase::load public function Loads one entity. Overrides EntityStorageInterface::load 2
EntityStorageBase::loadByProperties public function Load entities by their property values. Overrides EntityStorageInterface::loadByProperties 3
EntityStorageBase::loadMultiple public function Loads one or more entities. Overrides EntityStorageInterface::loadMultiple 1
EntityStorageBase::mapFromStorageRecords protected function Maps from storage records to entity objects. 4
EntityStorageBase::postLoad protected function Attaches data to entities upon loading.
EntityStorageBase::preLoad protected function Gathers entities from a 'preload' step. 1
EntityStorageBase::restore public function Restores a previously saved entity. Overrides EntityStorageInterface::restore 1
EntityStorageBase::save public function Saves the entity permanently. Overrides EntityStorageInterface::save 4
EntityStorageBase::setStaticCache protected function Stores entities in the static entity cache.
EntityStorageInterface::FIELD_LOAD_CURRENT constant Load the most recent version of an entity's field data.
EntityStorageInterface::FIELD_LOAD_REVISION constant Load the version of an entity's field data specified in the entity.
FieldableEdgeEntityStorageBase::doCreate protected function Overrides EntityStorageBase::doCreate
FieldableEdgeEntityStorageBase::finalizePurge public function Performs final cleanup after all data of a field has been purged. Overrides FieldableEntityStorageInterface::finalizePurge
FieldableEdgeEntityStorageBase::getPersistentCacheTags protected function Generates cache tags for entities. Overrides EdgeEntityStorageBase::getPersistentCacheTags 1
FieldableEdgeEntityStorageBase::initFieldValues protected function Initializes field values. 1
FieldableEdgeEntityStorageBase::onEntityTypeCreate public function Reacts to the creation of the entity type. Overrides EntityTypeListenerInterface::onEntityTypeCreate
FieldableEdgeEntityStorageBase::onEntityTypeDelete public function Reacts to the deletion of the entity type. Overrides EntityTypeListenerInterface::onEntityTypeDelete
FieldableEdgeEntityStorageBase::onEntityTypeUpdate public function Reacts to the update of the entity type. Overrides EntityTypeListenerInterface::onEntityTypeUpdate
FieldableEdgeEntityStorageBase::onFieldableEntityTypeCreate public function Reacts to the creation of the fieldable entity type. Overrides EntityTypeListenerInterface::onFieldableEntityTypeCreate
FieldableEdgeEntityStorageBase::onFieldableEntityTypeUpdate public function Reacts to the update of a fieldable entity type. Overrides EntityTypeListenerInterface::onFieldableEntityTypeUpdate
FieldableEdgeEntityStorageBase::onFieldDefinitionCreate public function Reacts to the creation of a field. Overrides FieldDefinitionListenerInterface::onFieldDefinitionCreate
FieldableEdgeEntityStorageBase::onFieldDefinitionDelete public function Reacts to the deletion of a field. Overrides FieldDefinitionListenerInterface::onFieldDefinitionDelete
FieldableEdgeEntityStorageBase::onFieldDefinitionUpdate public function Reacts to the update of a field. Overrides FieldDefinitionListenerInterface::onFieldDefinitionUpdate
FieldableEdgeEntityStorageBase::onFieldStorageDefinitionCreate public function Reacts to the creation of a field storage definition. Overrides FieldStorageDefinitionListenerInterface::onFieldStorageDefinitionCreate
FieldableEdgeEntityStorageBase::onFieldStorageDefinitionDelete public function Reacts to the deletion of a field storage definition. Overrides FieldStorageDefinitionListenerInterface::onFieldStorageDefinitionDelete
FieldableEdgeEntityStorageBase::onFieldStorageDefinitionUpdate public function Reacts to the update of a field storage definition. Overrides FieldStorageDefinitionListenerInterface::onFieldStorageDefinitionUpdate
FieldableEdgeEntityStorageBase::purgeFieldData public function Purges a batch of field data. Overrides FieldableEntityStorageInterface::purgeFieldData
FieldableEdgeEntityStorageBase::requiresEntityDataMigration public function Checks if existing data would be lost if the schema changes were applied. Overrides EntityStorageSchemaInterface::requiresEntityDataMigration
FieldableEdgeEntityStorageBase::requiresEntityStorageSchemaChanges public function Checks if the changes to the entity type requires storage schema changes. Overrides EntityStorageSchemaInterface::requiresEntityStorageSchemaChanges
FieldableEdgeEntityStorageBase::requiresFieldDataMigration public function Checks if existing data would be lost if the schema changes were applied. Overrides DynamicallyFieldableEntityStorageSchemaInterface::requiresFieldDataMigration
FieldableEdgeEntityStorageBase::requiresFieldStorageSchemaChanges public function Checks if the changes to the storage definition requires schema changes. Overrides DynamicallyFieldableEntityStorageSchemaInterface::requiresFieldStorageSchemaChanges
StringTranslationTrait::$stringTranslation protected property The string translation service. 1
StringTranslationTrait::formatPlural protected function Formats a string containing a count of items.
StringTranslationTrait::getNumberOfPlurals protected function Returns the number of plurals supported by a given language.
StringTranslationTrait::getStringTranslation protected function Gets the string translation service.
StringTranslationTrait::setStringTranslation public function Sets the string translation service to use. 2
StringTranslationTrait::t protected function Translates a string to the current language or to a given language.
TeamStorage::$entityTypeManager protected property The entity type manager.
TeamStorage::$logger private property The logger.
TeamStorage::$teamController private property The team controller service.
TeamStorage::createInstance public static function Instantiates a new instance of this entity handler. Overrides EdgeEntityStorageBase::createInstance
TeamStorage::doDelete protected function Performs storage-specific entity deletion. Overrides EdgeEntityStorageBase::doDelete
TeamStorage::doPostSave protected function Performs post save entity processing. Overrides EntityStorageBase::doPostSave
TeamStorage::doSave protected function Performs storage-specific saving of the entity. Overrides EdgeEntityStorageBase::doSave
TeamStorage::entityController protected function Returns the wrapped controller instance used by this storage. Overrides EdgeEntityStorageBase::entityController
TeamStorage::__construct public function Constructs an DeveloperStorage instance. Overrides EdgeEntityStorageBase::__construct