Skip to content
Snippets Groups Projects
Commit e3aedc8b authored by Eirik Morland's avatar Eirik Morland
Browse files

Issue #3344892 by eiriksm: Create a team manager

parent 7faa1cfc
No related branches found
No related tags found
1 merge request!4Issue #3344892: Create a team manager
<?php
namespace Drupal\violinist_teams;
use Drupal\Core\Entity\EntityTypeManagerInterface;
use Drupal\user\UserInterface;
/**
* Service for all things with managing teams I guess?
*/
class TeamManager {
/**
* The entity type manager.
*
* @var \Drupal\Core\Entity\EntityTypeManagerInterface
*/
protected $entityTypeManager;
/**
* Constructs a TeamManager object.
*
* @param \Drupal\Core\Entity\EntityTypeManagerInterface $entity_type_manager
* The entity type manager.
*/
public function __construct(EntityTypeManagerInterface $entity_type_manager) {
$this->entityTypeManager = $entity_type_manager;
}
/**
* Gets all the teams for a given user.
*
* @return \Drupal\violinist_teams\TeamNode[]
* An array of teams the user belong to. Or, if none, an empty array of
* course.
*/
public function getTeamsByUser(UserInterface $user) : array {
$node_storage = $this->entityTypeManager->getStorage('node');
$nids = $node_storage
->getQuery()
->accessCheck(FALSE)
->condition('type', TeamNode::NODE_TYPE)
->condition(TeamNode::MEMBERS_FIELD, $user->id())
->execute();
return $node_storage->loadMultiple($nids);
}
}
......@@ -3,6 +3,7 @@
namespace Drupal\violinist_teams;
use Drupal\node\Entity\Node;
use Drupal\user\UserInterface;
/**
* A bundle class for our teams.
......@@ -10,6 +11,7 @@ use Drupal\node\Entity\Node;
class TeamNode extends Node {
const NODE_TYPE = 'team';
const MEMBERS_FIELD = 'field_team_members';
/**
* Get the team plan.
......@@ -29,4 +31,43 @@ class TeamNode extends Node {
}
}
/**
* Append a member.
*
* If you are trying to append a user that is already in there, it will only
* be referenced once.
*/
public function appendMember(UserInterface $user) {
if (!$user->id()) {
throw new \InvalidArgumentException('Can not reference user id 0 when setting members');
}
$members = $this->getMembers();
$already_has_it = (bool) array_filter($members, function (UserInterface $user_item) use ($user) {
return $user->id() === $user_item->id();
});
if ($already_has_it) {
return;
}
$members[] = $user;
$this->setMembers($members);
}
/**
* Set all of the members of the node.
*/
public function setMembers(array $members) {
$this->get(self::MEMBERS_FIELD)
->setValue($members);
}
/**
* Helper to get all members of this team.
*
* Basically a wrapper around ::referencedEntities but this is the beauty of
* entity bundle classes. They can have actual descriptive names.
*/
public function getMembers() : array {
return $this->get(self::MEMBERS_FIELD)->referencedEntities();
}
}
<?php
namespace Drupal\Tests\violinist_teams\Kernel;
use Drupal\field\Entity\FieldConfig;
use Drupal\field\Entity\FieldStorageConfig;
use Drupal\KernelTests\KernelTestBase as CoreKernelTestBase;
use Drupal\node\Entity\NodeType;
use Drupal\violinist_teams\TeamNode;
/**
* Base class for our tests.
*/
abstract class KernelTestBase extends CoreKernelTestBase {
/**
* Node type.
*
* @var \Drupal\node\Entity\NodeType
*/
protected $nodeType;
/**
* {@inheritdoc}
*/
protected static $modules = [
'violinist_teams',
'node',
'system',
'user',
'field',
];
/**
* {@inheritdoc}
*/
public function setUp() : void {
parent::setUp();
$this->installSchema('node', ['node_access']);
$node_type = NodeType::create([
'type' => TeamNode::NODE_TYPE,
]);
$node_type->save();
$this->nodeType = $node_type;
$this->installEntitySchema('user');
$this->installEntitySchema('node');
// Create the field for holding members.
$fieldStorage = FieldStorageConfig::create([
'field_name' => 'field_team_members',
'entity_type' => 'node',
'type' => 'entity_reference',
'settings' => [
'target_type' => 'user',
],
]);
$fieldStorage->save();
$field = FieldConfig::create([
'field_storage' => $fieldStorage,
'bundle' => $this->nodeType->id(),
'field_type' => 'entity_reference',
'required' => FALSE,
'settings' => [
['handler' => 'default:user'],
],
]);
$field->save();
}
}
<?php
namespace Drupal\Tests\violinist_teams\Kernel;
use Drupal\node\Entity\Node;
use Drupal\user\Entity\User;
/**
* Tests for the team manager.
*
* @group violinist_teams
*/
class TeamManagerTest extends KernelTestBase {
/**
* Team manager.
*
* @var \Drupal\violinist_teams\TeamManager|object|null
*/
protected $teamManager;
/**
* {@inheritdoc}
*/
public function setUp(): void {
parent::setUp();
$this->teamManager = $this->container->get('violinist_teams.team_manager');
}
/**
* Test that we can get teams from user.
*/
public function testGetTeamsFromUser() {
/** @var \Drupal\violinist_teams\TeamNode $node */
$node = Node::create([
'type' => $this->nodeType->id(),
'title' => 'test',
]);
$node->save();
$user = User::create([
'name' => 'test',
'mail' => 'test@example.com',
]);
$user->save();
$node->appendMember($user);
$node->save();
$teams = $this->teamManager->getTeamsByUser($user);
self::assertCount(1, $teams);
/** @var \Drupal\violinist_teams\TeamNode $team_node_result */
$team_node_result = reset($teams);
self::assertEquals($node->id(), $team_node_result->id());
}
}
......@@ -2,9 +2,7 @@
namespace Drupal\Tests\violinist_teams\Kernel;
use Drupal\KernelTests\KernelTestBase;
use Drupal\node\Entity\Node;
use Drupal\node\Entity\NodeType;
use Drupal\violinist_teams\TeamNode;
/**
......@@ -14,38 +12,6 @@ use Drupal\violinist_teams\TeamNode;
*/
class TeamNodeTest extends KernelTestBase {
/**
* Node type.
*
* @var \Drupal\node\Entity\NodeType
*/
protected $nodeType;
/**
* {@inheritdoc}
*/
protected static $modules = [
'violinist_teams',
'node',
'system',
'user',
];
/**
* {@inheritdoc}
*/
public function setUp() : void {
parent::setUp();
$this->installSchema('node', ['node_access']);
$node_type = NodeType::create([
'type' => TeamNode::NODE_TYPE,
]);
$node_type->save();
$this->nodeType = $node_type;
$this->installEntitySchema('user');
$this->installEntitySchema('node');
}
/**
* Test that we are getting the class we want.
*/
......
services:
violinist_teams.team_manager:
class: Drupal\violinist_teams\TeamManager
arguments: ['@entity_type.manager']
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment