bp/app/Database/Migrations/2026-01-12-000001_AddInvite...

76 lines
3.4 KiB
PHP
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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