Files
bp/app/Database/Migrations/2026-01-12-000001_AddInviteFieldsToOrganizationUsers.php
T
2026-01-13 07:11:21 +03:00

76 lines
3.4 KiB
PHP

<?php
namespace App\Database\Migrations;
use CodeIgniter\Database\Migration;
class AddInviteFieldsToOrganizationUsers extends Migration
{
public function up()
{
// Примечание: Таблица уже создана с полями:
// id, organization_id, user_id, role, status, joined_at, created_at
//
// Добавляем только недостающие поля для системы приглашений:
// - invite_token: токен для принятия приглашения
// - invited_by: кто отправил приглашение
// - invited_at: когда отправлено приглашение
// Проверяем, существует ли уже колонка invite_token
$fields = $this->db->getFieldData('organization_users');
$existingFields = array_column($fields, 'name');
if (!in_array('invite_token', $existingFields)) {
$this->db->simpleQuery("ALTER TABLE organization_users ADD COLUMN invite_token VARCHAR(64) NULL AFTER role");
}
if (!in_array('invited_by', $existingFields)) {
$this->db->simpleQuery("ALTER TABLE organization_users ADD COLUMN invited_by INT UNSIGNED NULL AFTER invite_token");
}
if (!in_array('invited_at', $existingFields)) {
$this->db->simpleQuery("ALTER TABLE organization_users ADD COLUMN invited_at DATETIME NULL AFTER invited_by");
}
// Индекс для быстрого поиену (еска по токсли ещё нет)
$indexes = $this->db->getIndexData('organization_users');
$hasTokenIndex = false;
foreach ($indexes as $index) {
if ($index->name === 'idx_org_users_token') {
$hasTokenIndex = true;
break;
}
}
if (!$hasTokenIndex) {
$this->db->simpleQuery("CREATE INDEX idx_org_users_token ON organization_users(invite_token)");
}
// Изменяем поле status, чтобы включить 'pending' и установить его как значение по умолчанию
// Используем прямой SQL для модификации ENUM
$this->db->simpleQuery("ALTER TABLE organization_users MODIFY COLUMN status ENUM('active', 'pending', 'invited', 'blocked') NOT NULL DEFAULT 'pending'");
}
public function down()
{
// Удаление полей и индекса при откате миграции
$fields = $this->db->getFieldData('organization_users');
$existingFields = array_column($fields, 'name');
// Удаляем только если поля существуют
$this->db->simpleQuery("DROP INDEX IF EXISTS idx_org_users_token ON organization_users");
if (in_array('invited_at', $existingFields)) {
$this->db->simpleQuery("ALTER TABLE organization_users DROP COLUMN invited_at");
}
if (in_array('invited_by', $existingFields)) {
$this->db->simpleQuery("ALTER TABLE organization_users DROP COLUMN invited_by");
}
if (in_array('invite_token', $existingFields)) {
$this->db->simpleQuery("ALTER TABLE organization_users DROP COLUMN invite_token");
}
}
}