<?php

namespace Drupal\Core\Cache\Context;

use Drupal\Core\Cache\CacheableMetadata;

/**
 * Defines the UserRolesCacheContext service, for "per role" caching.
 *
 * Only use this cache context when checking explicitly for certain roles. Use
 * user.permissions for anything that checks permissions.
 *
 * Cache context ID: 'user.roles' (to vary by all roles of the current user).
 * Calculated cache context ID: 'user.roles:%role', e.g. 'user.roles:anonymous'
 * (to vary by the presence/absence of a specific role).
 */
class UserRolesCacheContext extends UserCacheContextBase implements CalculatedCacheContextInterface {

  /**
   * {@inheritdoc}
   */
  public static function getLabel() {
    return t("User's roles");
  }

  /**
   * {@inheritdoc}
   */
  public function getContext($role = NULL) {
    if ($role === NULL) {
      return implode(',', $this->user->getRoles());
    }

    return in_array($role, $this->user->getRoles(), TRUE) ? 'true' : 'false';
  }

  /**
   * {@inheritdoc}
   */
  public function getCacheableMetadata($role = NULL) {
    // The list of roles for the anonymous user can never change.
    if ($this->user->isAuthenticated()) {
      return (new CacheableMetadata())->setCacheTags(['user:' . $this->user->id()]);
    }
    return new CacheableMetadata();
  }

}
