Skip to content
This repository was archived by the owner on Mar 31, 2022. It is now read-only.

Commit 61a606e

Browse files
committed
WIP group manager
1 parent df50c8c commit 61a606e

File tree

7 files changed

+187
-6
lines changed

7 files changed

+187
-6
lines changed

.circleci/config.yml

+37
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
# PHP CircleCI 2.0 configuration file
2+
#
3+
# Check https://circleci.com/docs/2.0/language-php/ for more details
4+
#
5+
version: 2
6+
jobs:
7+
build:
8+
docker:
9+
# specify the version you desire here
10+
- image: circleci/php:7.1.5-browsers
11+
12+
# Specify service dependencies here if necessary
13+
# CircleCI maintains a library of pre-built images
14+
# documented at https://circleci.com/docs/2.0/circleci-images/
15+
# - image: circleci/mysql:9.4
16+
17+
working_directory: ~/repo
18+
19+
steps:
20+
- checkout
21+
22+
# Download and cache dependencies
23+
- restore_cache:
24+
keys:
25+
- v1-dependencies-{{ checksum "composer.json" }}
26+
# fallback to using the latest cache if no exact match is found
27+
- v1-dependencies-
28+
29+
- run: composer install -n --prefer-dist
30+
31+
- save_cache:
32+
paths:
33+
- ./vendor
34+
key: v1-dependencies-{{ checksum "composer.json" }}
35+
36+
# run tests!
37+
- run: phpunit

DependencyInjection/USJGSuiteExtension.php

+21-3
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,10 @@
77
use Symfony\Component\DependencyInjection\Definition;
88
use Symfony\Component\DependencyInjection\Reference;
99
use Symfony\Component\HttpKernel\DependencyInjection\Extension;
10+
use USJ\GSuiteBundle\Manager\GroupManager;
1011
use USJ\GSuiteBundle\Manager\UserManager;
11-
use USJ\USJGSuiteBundle\Model\UserManagerInterface;
12+
use USJ\GSuiteBundle\Model\GroupManagerInterface;
13+
use USJ\GSuiteBundle\Model\UserManagerInterface;
1214

1315
class USJGSuiteExtension extends Extension
1416
{
@@ -38,14 +40,30 @@ protected function loadClientConfig(array $config, ContainerBuilder $container)
3840
\Google_Client::class => 'usj_gsuite.client.default'
3941
]);
4042

43+
// User Manager
4144
$userDefinition = $this->createUserDefinition('default', $container);
42-
4345
$container->addDefinitions(['usj_gsuite.default.user' => $userDefinition]);
44-
4546
$container->addAliases([
4647
'usj_gsuite.user' => 'usj_gsuite.default.user',
4748
UserManagerInterface::class => 'usj_gsuite.default.user'
4849
]);
50+
51+
// Group Manager
52+
$groupDefinition = $this->createGroupManagerDef('default', $container);
53+
$container->addDefinitions(['usj_gsuite.default.group' => $groupDefinition]);
54+
$container->addAliases([
55+
'usj_gsuite.group' => 'usj_gsuite.default.group',
56+
GroupManagerInterface::class => 'usj_gsuite.default.group'
57+
]);
58+
}
59+
60+
protected function createGroupManagerDef($clientId, ContainerBuilder $container)
61+
{
62+
$definition = new Definition(GroupManager::class);
63+
$definition->setArgument(0, new Reference(sprintf('usj_gsuite.client.%s', $clientId)));
64+
$container->setDefinition(sprintf('usj_gsuite.%s.group', $clientId), $definition);
65+
66+
return $definition;
4967
}
5068

5169
protected function createUserDefinition($clientId, ContainerBuilder $container)

Manager/GroupManager.php

+99
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,99 @@
1+
<?php
2+
3+
4+
namespace USJ\GSuiteBundle\Manager;
5+
6+
7+
use Google_Service_Directory;
8+
use USJ\GSuiteBundle\Model\GroupManagerInterface;
9+
use USJ\GSuiteBundle\Model\UserInterface;
10+
11+
class GroupManager implements GroupManagerInterface
12+
{
13+
/**
14+
* @var Google_Service_Directory
15+
*/
16+
protected $directoryService;
17+
18+
/**
19+
* @var \Google_Client
20+
*/
21+
private $client;
22+
23+
public function __construct(\Google_Client $client)
24+
{
25+
$this->client = $client;
26+
}
27+
28+
public function list($params): \Iterator
29+
{
30+
return $this->getDirectoryService()->groups->listGroups($params);
31+
}
32+
33+
public function remove($groupEmail): void
34+
{
35+
$this->getDirectoryService()->groups->delete($groupEmail);
36+
}
37+
38+
public function get($groupEmail): \Google_Service_Directory_Group
39+
{
40+
return $this->getDirectoryService()->groups->get($groupEmail);
41+
}
42+
43+
public function listMembersInGroup($groupEmail): \Iterator
44+
{
45+
$nextPageToken = null;
46+
47+
do {
48+
$result = $this->getDirectoryService()->members->listMembers(
49+
$groupEmail,
50+
$nextPageToken ? ['pageToken' => $nextPageToken] : []
51+
);
52+
53+
foreach ($result as $item) {
54+
yield $item;
55+
}
56+
} while ($nextPageToken = $result->nextPageToken);
57+
}
58+
59+
public function isUserInGroup($groupEmail, UserInterface $user): boolean
60+
{
61+
return (bool)$this->getDirectoryService()->members
62+
->hasMember($groupEmail, $user->getGoogleEmail())
63+
->getIsMember();
64+
}
65+
66+
public function findGroupsByUser(UserInterface $user): \Iterator
67+
{
68+
return $this->getDirectoryService()->groups->listGroups(['userKey' => $user->getGoogleEmail()]);
69+
}
70+
71+
public function addUserToGroup($groupEmail, UserInterface $user, $role = "MEMBER"): void
72+
{
73+
$member = new \Google_Service_Directory_Member();
74+
$member->setEmail($user->getGoogleEmail());
75+
$member->setRole($role);
76+
77+
$this->getDirectoryService()->members->insert(
78+
$groupEmail,
79+
$member
80+
);
81+
}
82+
83+
public function removeUserFromGroup($groupEmail, UserInterface $user): void
84+
{
85+
$this->getDirectoryService()->members->delete($groupEmail, $user->getGoogleEmail());
86+
}
87+
88+
/**
89+
* @return Google_Service_Directory
90+
*/
91+
private function getDirectoryService()
92+
{
93+
if (!$this->directoryService) {
94+
$this->directoryService = new Google_Service_Directory($this->client);
95+
}
96+
97+
return $this->directoryService;
98+
}
99+
}

Manager/UserManager.php

+1-1
Original file line numberDiff line numberDiff line change
@@ -90,7 +90,7 @@ public function getById(string $id): Google_Service_Directory_User
9090
/**
9191
* {@inheritdoc}
9292
*/
93-
public function has(string $id): boolean
93+
public function has(string $id): bool
9494
{
9595
return (bool) $this->getDirectoryService()->users->get($id);
9696
}

Model/GroupManagerInterface.php

+27
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
<?php
2+
3+
4+
namespace USJ\GSuiteBundle\Model;
5+
6+
7+
interface GroupManagerInterface
8+
{
9+
const ROLE_MEMBER = "MEMBER";
10+
const ROLE_MANAGER = "MANAGER";
11+
12+
public function list($params): \Iterator;
13+
14+
public function remove($groupEmail): void;
15+
16+
public function get($groupEmail): \Google_Service_Directory_Group;
17+
18+
public function listMembersInGroup($groupEmail): \Iterator;
19+
20+
public function isUserInGroup($groupEmail, UserInterface $user): boolean;
21+
22+
public function findGroupsByUser(UserInterface $user): \Iterator;
23+
24+
public function addUserToGroup($groupEmail, UserInterface $user, $role = "MEMBER"): void;
25+
26+
public function removeUserFromGroup($groupEmail, UserInterface $user): void;
27+
}

Model/UserManagerInterface.php

+1-1
Original file line numberDiff line numberDiff line change
@@ -64,5 +64,5 @@ public function deleteById(string $id): void;
6464
*
6565
* @return bool
6666
*/
67-
public function has(string $id): boolean;
67+
public function has(string $id): bool;
6868
}

Tests/Manager/UserManagerTest.php

+1-1
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ class UserManagerTest extends TestCase
1313
public function testTransformUserWhenInsert()
1414
{
1515
$userMock = $this->createMock(TestUser::class);
16-
$userMock->method('getGoogleDirectoryName')->expects($this->once());
16+
$userMock->expects($this->once())->method('getGoogleDirectoryName');
1717

1818
$subject = new UserManager($this->createMock(\Google_Client::class));
1919

0 commit comments

Comments
 (0)