Миграции Bitrix Phinx. Добавить пользователей в группу

<?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();
    }
};

Оставьте комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *