77namespace Chamilo \CoreBundle \Command ;
88
99use Chamilo \CoreBundle \Entity \AzureSyncState ;
10+ use Chamilo \CoreBundle \Helpers \AccessUrlHelper ;
1011use Chamilo \CoreBundle \Helpers \AuthenticationConfigHelper ;
1112use Chamilo \CoreBundle \Helpers \AzureAuthenticatorHelper ;
13+ use Chamilo \CoreBundle \Helpers \UserHelper ;
1214use Chamilo \CoreBundle \Repository \AzureSyncStateRepository ;
15+ use Chamilo \CoreBundle \Repository \Node \UsergroupRepository ;
1316use Chamilo \CoreBundle \Repository \Node \UserRepository ;
17+ use Chamilo \CoreBundle \Settings \SettingsManager ;
1418use Doctrine \ORM \EntityManagerInterface ;
1519use Exception ;
1620use Generator ;
@@ -39,6 +43,10 @@ public function __construct(
3943 readonly protected AzureSyncStateRepository $ syncStateRepo ,
4044 protected readonly EntityManagerInterface $ entityManager ,
4145 protected readonly UserRepository $ userRepository ,
46+ protected readonly UsergroupRepository $ usergroupRepository ,
47+ protected readonly AccessUrlHelper $ accessUrlHelper ,
48+ protected readonly SettingsManager $ settingsManager ,
49+ protected readonly UserHelper $ userHelper ,
4250 ) {
4351 parent ::__construct ();
4452
@@ -74,12 +82,12 @@ protected function getAzureUsers(): Generator
7482
7583 $ query = $ usersDeltaLink
7684 ? $ usersDeltaLink ->getValue ()
77- : \sprintf ('$select=%s ' , implode (', ' , AzureAuthenticatorHelper::QUERY_FIELDS ));
85+ : \sprintf ('$select=%s ' , implode (', ' , AzureAuthenticatorHelper::QUERY_USER_FIELDS ));
7886 } else {
7987 $ query = \sprintf (
8088 '$top=%d&$select=%s ' ,
8189 AzureSyncState::API_PAGE_SIZE ,
82- implode (', ' , AzureAuthenticatorHelper::QUERY_FIELDS )
90+ implode (', ' , AzureAuthenticatorHelper::QUERY_USER_FIELDS )
8391 );
8492 }
8593
@@ -128,16 +136,10 @@ protected function getAzureUsers(): Generator
128136 */
129137 protected function getAzureGroupMembers (string $ groupUid ): Generator
130138 {
131- $ userFields = [
132- 'mail ' ,
133- 'mailNickname ' ,
134- 'id ' ,
135- ];
136-
137139 $ query = \sprintf (
138140 '$top=%d&$select=%s ' ,
139141 AzureSyncState::API_PAGE_SIZE ,
140- implode (', ' , $ userFields )
142+ implode (', ' , AzureAuthenticatorHelper:: QUERY_GROUP_MEMBERS_FIELDS )
141143 );
142144
143145 $ token = null ;
@@ -147,14 +149,14 @@ protected function getAzureGroupMembers(string $groupUid): Generator
147149 $ this ->generateOrRefreshToken ($ token );
148150
149151 $ azureGroupMembersRequest = $ this ->provider ->get (
150- "groups/ $ groupUid/members? $ query " ,
152+ "/v1.0/ groups/$ groupUid/members? $ query " ,
151153 $ token
152154 );
153155 } catch (GuzzleException |Exception $ e ) {
154156 throw new Exception ('Exception when requesting group members from Azure: ' .$ e ->getMessage ());
155157 }
156158
157- $ azureGroupMembers = $ azureGroupMembersRequest[ ' value ' ] ?? [];
159+ $ azureGroupMembers = $ azureGroupMembersRequest ?? [];
158160
159161 foreach ($ azureGroupMembers as $ azureGroupMember ) {
160162 yield $ azureGroupMember ;
@@ -166,6 +168,69 @@ protected function getAzureGroupMembers(string $groupUid): Generator
166168 $ hasNextLink = true ;
167169 $ query = parse_url ($ azureGroupMembersRequest ['@odata.nextLink ' ], PHP_URL_QUERY );
168170 }
169- } while ($ hasNextLink = false );
171+ } while ($ hasNextLink );
172+ }
173+
174+ /**
175+ * @throws Exception
176+ */
177+ protected function getAzureGroups (): Generator
178+ {
179+ $ getUsergroupsDelta = 'true ' === $ this ->providerParams ['script_usergroups_delta ' ];
180+
181+ if ($ getUsergroupsDelta ) {
182+ $ usergroupsDeltaLink = $ this ->syncStateRepo ->findOneBy (['title ' => AzureSyncState::USERGROUPS_DATALINK ]);
183+
184+ $ query = $ usergroupsDeltaLink
185+ ? $ usergroupsDeltaLink ->getValue ()
186+ : sprintf ('$select=%s ' , implode (', ' , AzureAuthenticatorHelper::QUERY_GROUP_FIELDS ));
187+ } else {
188+ $ query = sprintf (
189+ '$top=%d&$select=%s ' ,
190+ AzureSyncState::API_PAGE_SIZE ,
191+ implode (', ' , AzureAuthenticatorHelper::QUERY_GROUP_FIELDS )
192+ );
193+ }
194+
195+ $ token = null ;
196+
197+ do {
198+ try {
199+ $ this ->generateOrRefreshToken ($ token );
200+
201+ $ azureGroupsRequest = $ this ->provider ->get (
202+ $ getUsergroupsDelta ? "/v1.0/groups/delta? $ query " : "/v1.0/groups? $ query " ,
203+ $ token
204+ );
205+ } catch (Exception |GuzzleException $ e ) {
206+ throw new Exception ('Exception when requesting groups from Azure: ' .$ e ->getMessage ());
207+ }
208+
209+ $ azureGroupsInfo = $ azureGroupsRequest ?? [];
210+
211+ foreach ($ azureGroupsInfo as $ azureGroupInfo ) {
212+ if (!empty ($ this ->providerParams ['group_filter_regex ' ]) &&
213+ !preg_match ("/ {$ this ->providerParams ['group_filter_regex ' ]}/ " , $ azureGroupInfo ['displayName ' ])
214+ ) {
215+ continue ;
216+ }
217+
218+ yield $ azureGroupInfo ;
219+ }
220+
221+ $ hasNextLink = false ;
222+
223+ if (!empty ($ azureGroupsRequest ['@odata.nextLink ' ])) {
224+ $ hasNextLink = true ;
225+ $ query = parse_url ($ azureGroupsRequest ['@odata.nextLink ' ], PHP_URL_QUERY );
226+ }
227+
228+ if ($ getUsergroupsDelta && !empty ($ azureGroupsRequest ['@odata.deltaLink ' ])) {
229+ $ this ->syncStateRepo ->save (
230+ AzureSyncState::USERGROUPS_DATALINK ,
231+ parse_url ($ azureGroupsRequest ['@odata.deltaLink ' ], PHP_URL_QUERY ),
232+ );
233+ }
234+ } while ($ hasNextLink );
170235 }
171236}
0 commit comments