3 namespace Drupal\permissions_by_term\Service;
5 use Drupal\Core\Entity\EntityTypeManagerInterface;
6 use Drupal\permissions_by_term\Factory\NodeAccessRecordFactory;
7 use Drupal\node\Entity\Node;
8 use Drupal\Core\Database\Connection;
9 use Drupal\permissions_by_term\Model\NodeAccessRecordModel;
10 use Drupal\user\Entity\User;
15 * @package Drupal\permissions_by_term
22 private $uniqueGid = 0;
25 * @var AccessStorage $accessStorage
27 private $accessStorage;
30 * @var User $userEntityStorage
32 private $userEntityStorage;
40 * @var EntityTypeManagerInterface $entityTypeManager
42 private $entityTypeManager;
45 * @var AccessCheck $accessCheck
55 * @var User $userInstance
57 private $userInstance;
60 * The database connection.
67 * NodeAccess constructor.
69 * @param AccessStorage $accessStorage
70 * @param NodeAccessRecordFactory $nodeAccessRecordFactory
71 * @param EntityTypeManagerInterface $entityTypeManager
72 * @param AccessCheck $accessCheck
73 * @param Connection $database
75 public function __construct(
76 AccessStorage $accessStorage,
77 NodeAccessRecordFactory $nodeAccessRecordFactory,
78 EntityTypeManagerInterface $entityTypeManager,
79 AccessCheck $accessCheck,
82 $this->accessStorage = $accessStorage;
83 $this->nodeAccessRecordFactory = $nodeAccessRecordFactory;
84 $this->entityTypeManager = $entityTypeManager;
85 $this->userEntityStorage = $this->entityTypeManager->getStorage('user');
86 $this->node = $this->entityTypeManager->getStorage('node');
87 $this->accessCheck = $accessCheck;
88 $this->database = $database;
92 * @return NodeAccessRecordModel
94 public function createGrant($nid, $gid) {
95 return $this->nodeAccessRecordFactory->create(
96 AccessStorage::NODE_ACCESS_REALM,
99 $this->accessStorage->getLangCode($nid),
108 public function getUniqueGid() {
109 return $this->uniqueGid;
113 * @param int $uniqueGid
115 public function setUniqueGid($uniqueGid) {
116 $this->uniqueGid = $uniqueGid;
126 public function canUserUpdateNode($uid, $nodeType, $nid) {
127 $user = $this->getUserInstance($uid);
129 $this->setLoadedUid($uid);
131 if ($user->hasPermission('edit any ' . $nodeType . ' content')) {
135 if ($this->isNodeOwner($nid, $uid) && $this->canUpdateOwnNode($uid, $nodeType)) {
142 public function canUserBypassNodeAccess($uid) {
143 $user = $this->getUserInstance($uid);
144 if ($user->hasPermission('bypass node access')) {
158 public function canUserDeleteNode($uid, $nodeType, $nid) {
159 $user = $this->getUserInstance($uid);
160 if ($user->hasPermission('delete any ' . $nodeType . ' content')) {
164 if ($this->isNodeOwner($nid, $uid) && $this->canDeleteOwnNode($uid, $nodeType)) {
171 private function getGrantDelete($uid, $nodeType, $nid) {
172 if ($this->canUserBypassNodeAccess($uid)) {
176 if ($this->canUserDeleteNode($uid, $nodeType, $nid)) {
183 private function getGrantUpdate($uid, $nodeType, $nid) {
184 if ($this->canUserBypassNodeAccess($uid)) {
188 if ($this->canUserUpdateNode($uid, $nodeType, $nid)) {
201 public function isNodeOwner($nid, $uid) {
202 $node = $this->node->load($nid);
203 if (intval($node->getOwnerId()) == intval($uid)) {
210 private function canUpdateOwnNode($uid, $nodeType) {
211 $user = $this->getUserInstance($uid);
212 if ($user->hasPermission('edit own ' . $nodeType . ' content')) {
219 private function canDeleteOwnNode($uid, $nodeType) {
220 $user = $this->getUserInstance($uid);
221 if ($user->hasPermission('delete own ' . $nodeType . ' content')) {
233 public function getGrantsByNid($nid) {
235 foreach ($this->grants as $grant) {
236 if ($grant->nid == $nid) {
247 public function getLoadedUid() {
248 return $this->loadedUid;
252 * @param int $loadedUid
254 public function setLoadedUid($loadedUid) {
255 $this->loadedUid = $loadedUid;
261 public function getUserInstance($uid) {
262 if ($this->getLoadedUid() !== $uid) {
263 $user = $this->userEntityStorage->load($uid);
264 $this->setUserInstance($user);
268 return $this->userInstance;
272 * @param User $userInstance
274 public function setUserInstance($userInstance) {
275 $this->userInstance = $userInstance;
283 public function isAccessRecordExisting($nid) {
284 $query = $this->database->select('node_access', 'na')
285 ->fields('na', ['nid'])
286 ->condition('na.nid', $nid)
287 ->condition('na.realm', AccessStorage::NODE_ACCESS_REALM);
289 $result = $query->execute()
292 if (empty($result)) {