<?php
use App\BitrixCore;
use Bitrix\Main\GroupTable;
use Bitrix\Main\UserGroupTable;
use Bitrix\Main\UserTable;
use Illuminate\Database\Migrations\Migration;
/**
* Миграция добавления пользователей в группы пользователей
*/
return new class extends Migration {
public function __construct()
{
BitrixCore::load();
}
/**
* Ключ - id пользователя
* @return array[]
*/
private function getUserNewGroups(): array
{
return [
$this->getUserId('test@test.ru') => [
$this->getUserGroupId('SPECIALGROUP_ALL_SPECIAL_GOODS'),
],
];
}
public function up(): void
{
$userGroupsToAdd = $this->getUserNewGroups();
foreach ($userGroupsToAdd as $userId => $userGroupIds) {
$this->addUserToGroups($userId, $userGroupIds);
}
}
public function down(): void
{
$userGroupsToDelete = $this->getUserNewGroups();
foreach ($userGroupsToDelete as $userId => $userGroupIds) {
$this->deleteUserFromGroups($userId, $userGroupIds);
}
}
private function deleteUserFromGroups($userId, array $groupIds): void
{
if (count($groupIds) <= 0) {
throw new \RuntimeException('Параметр $groupStringIds не должен быть пустым', 400);
}
$userGroupIds = $this->getGroupIdsByUser($userId);
$newUserGroupIds = [];
foreach ($userGroupIds as $userGroupId) {
if (in_array($userGroupId, $groupIds, true)) {
continue;
}
$newUserGroupIds[] = $userGroupId;
}
CUser::SetUserGroup($userId, $newUserGroupIds);
}
private function addUserToGroups(int $userId, array $groupIds): void
{
if (count($groupIds) <= 0) {
throw new \RuntimeException('Параметр $groupIds не должен быть пустым', 400);
}
$userGroupIds = $this->getGroupIdsByUser($userId);
$newUserGroupIds = array_unique(array_merge($userGroupIds, $groupIds));
CUser::SetUserGroup($userId, $newUserGroupIds);
}
private function getGroupIdsByUser(int $userId): array
{
$groupObjects = UserGroupTable::query()
->addSelect('GROUP_ID')
->where('USER_ID', $userId)
->fetchCollection();
$groupIds = [];
foreach ($groupObjects as $groupObject) {
$groupIds[] = $groupObject->getGroupId();
}
return $groupIds;
}
private function getUserGroupId(string $stringId): int
{
$userGroupObject = GroupTable::query()
->addSelect('ID')
->where('STRING_ID', $stringId)
->fetchObject();
if ($userGroupObject === null) {
throw new RuntimeException('Не удалось получить группу пользователей с STRING_ID ' . $stringId, 400);
}
return $userGroupObject->getId();
}
private function getUserId(string $login): int
{
$login = trim($login);
if ($login === '') {
throw new \RuntimeException('Некорректное значение параметра $login', 400);
}
$userObject = UserTable::query()
->addSelect('ID')
->where('LOGIN', $login)
->fetchObject();
if ($userObject === null) {
throw new RuntimeException('Не удалось получить пользователя с LOGIN ' . $login, 400);
}
return $userObject->getId();
}
};