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

<?php

use App\BitrixCore;
use Bitrix\Main\GroupTable;
use Illuminate\Database\Migrations\Migration;

return new class extends Migration {
    private const SORT_STEP = 100;
    
    public function __construct()
    {
        BitrixCore::load();
    }
    
    public function up(): void
    {
        $userGroups = $this->getPreparedUserGroups();
        foreach ($userGroups as $userGroup) {
            $this->addUserGroup($userGroup);
        }
    }
    
    public function down(): void
    {
        
        $userGroups = $this->getUserGroups();
        foreach ($userGroups as $userGroup) {
            $this->deleteUserGroup($userGroup['STRING_ID']);
        }
    }
    
    private function getUserGroups(): array
    {
        return [
            [
                'ACTIVE'      => 'Y',
                //'C_SORT'          => 0, //рассчитывается
                'NAME'        => 'Тест',
                'DESCRIPTION' => 'Пользователи, пришедшие из Тест',
                'USER_ID'     => [],
                'STRING_ID'   => 'LICARD',
                'IS_SYSTEM'   => 'N',
                //тут удалил установку прав на модули, как было в миграции одиночной группы, потому что считаю лучше делать это в отдельной миграции
            ],
            [
                'ACTIVE'      => 'Y',
                //'C_SORT'          => 0, //рассчитывается
                'NAME'        => 'Тест: сегмент 1',
                'DESCRIPTION' => '',
                'USER_ID'     => [],
                'STRING_ID'   => 'SEGMENT_1',
                'IS_SYSTEM'   => 'N',
                //тут удалил установку прав на модули, как было в миграции одиночной группы, потому что считаю лучше делать это в отдельной миграции
            ],
            [
                'ACTIVE'      => 'Y',
                //'C_SORT'          => 0, //рассчитывается
                'NAME'        => 'Тест: сегмент 2',
                'DESCRIPTION' => '',
                'USER_ID'     => [],
                'STRING_ID'   => 'SEGMENT_2',
                'IS_SYSTEM'   => 'N',
                //тут удалил установку прав на модули, как было в миграции одиночной группы, потому что считаю лучше делать это в отдельной миграции
            ],
            [
                'ACTIVE'      => 'Y',
                //'C_SORT'          => 0, //рассчитывается
                'NAME'        => 'Тест: сегмент 3',
                'DESCRIPTION' => '',
                'USER_ID'     => [],
                'STRING_ID'   => 'SEGMENT_3',
                'IS_SYSTEM'   => 'N',
                //тут удалил установку прав на модули, как было в миграции одиночной группы, потому что считаю лучше делать это в отдельной миграции
            ],
        ];
    }
    

    private function deleteUserGroup(string $stringId): void
    {
        global $APPLICATION;
        $userGroupObject = GroupTable::query()
            ->addSelect('ID')
            ->where('STRING_ID', $stringId)
            ->setLimit(1)
            ->fetchObject();
        if ($userGroupObject === null) {
            throw new RuntimeException('Не найдена группа пользователей с STRING_ID = ' . $stringId);
        }
        /** @noinspection NotOptimalIfConditionsInspection */
        if (CGroup::Delete($userGroupObject->getId()) === false && ($bitrixException = $APPLICATION->GetException())) {
            throw new RuntimeException($bitrixException->GetString());
        }
    }
    
    private function addUserGroup(array $params): void
    {
        $group   = new CGroup;
        $groupId = $group->Add($params);
        if ($groupId === false) {
            throw new RuntimeException($group->LAST_ERROR);
        }
    }
    
    private function getPreparedUserGroups(): array
    {
        $userGroups = $this->getUserGroups();
        $sort       = $this->getMaxSort() + self::SORT_STEP;
        foreach ($userGroups as $key => $userGroup) {
            $userGroups[$key]['C_SORT'] = $sort;
            $sort                       += self::SORT_STEP;
        }
        return $userGroups;
    }
    
    private function getMaxSort(): int
    {
        $groupWithMaxSortObject = GroupTable::query()
            ->addSelect('C_SORT')
            ->addOrder('C_SORT', 'desc')
            ->setLimit(1)
            ->fetchObject();
        return $groupWithMaxSortObject?->getCSort() ?? 0;
    }
};

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

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