c99362a3e5
Каждый логин (admin/manager1-4) → своя компания/тенант. Идемпотентный: firstOrCreate + reassign tenant_id. Запуск: php artisan tinker storage/_demo_split_tenants.php Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
118 lines
4.5 KiB
PHP
118 lines
4.5 KiB
PHP
<?php
|
|
|
|
declare(strict_types=1);
|
|
|
|
/**
|
|
* ВРЕМЕННЫЙ demo-скрипт — разбивает 5 тестовых пользователей на 5 отдельных тенантов.
|
|
* Каждый логин = своя компания, данные изолированы.
|
|
* Идемпотентный: повторный запуск не дублирует тенанты.
|
|
* Запуск: php artisan tinker storage/_demo_split_tenants.php
|
|
*/
|
|
|
|
use App\Models\Project;
|
|
use App\Models\Tenant;
|
|
use App\Models\User;
|
|
use Illuminate\Support\Str;
|
|
|
|
// -------------------------------------------------------------------
|
|
// 1. Проверяем исходное состояние
|
|
// -------------------------------------------------------------------
|
|
$totalBefore = User::count();
|
|
$tenantsBefore = Tenant::count();
|
|
echo "=== ДО: {$totalBefore} пользователей, {$tenantsBefore} тенант(ов) ===\n\n";
|
|
|
|
// -------------------------------------------------------------------
|
|
// 2. Описание каждого пользователя и его будущего тенанта
|
|
// -------------------------------------------------------------------
|
|
$accounts = [
|
|
[
|
|
'email' => 'admin@demo.local',
|
|
'tenant_subdomain' => 'demo', // оставляем существующий тенант
|
|
'org_name' => null, // null = взять из существующего
|
|
'create_new_tenant' => false,
|
|
],
|
|
[
|
|
'email' => 'manager1@demo.local',
|
|
'tenant_subdomain' => 'ivan-demo',
|
|
'org_name' => 'Компания Ивана',
|
|
'create_new_tenant' => true,
|
|
],
|
|
[
|
|
'email' => 'manager2@demo.local',
|
|
'tenant_subdomain' => 'anna-demo',
|
|
'org_name' => 'Компания Анны',
|
|
'create_new_tenant' => true,
|
|
],
|
|
[
|
|
'email' => 'manager3@demo.local',
|
|
'tenant_subdomain' => 'petr-demo',
|
|
'org_name' => 'Компания Петра',
|
|
'create_new_tenant' => true,
|
|
],
|
|
[
|
|
'email' => 'manager4@demo.local',
|
|
'tenant_subdomain' => 'mariya-demo',
|
|
'org_name' => 'Компания Марии',
|
|
'create_new_tenant' => true,
|
|
],
|
|
];
|
|
|
|
// -------------------------------------------------------------------
|
|
// 3. Создаём тенанты и переназначаем пользователей
|
|
// -------------------------------------------------------------------
|
|
foreach ($accounts as $a) {
|
|
$user = User::query()->where('email', $a['email'])->firstOrFail();
|
|
|
|
if (! $a['create_new_tenant']) {
|
|
// Demo Admin остаётся в tenant "demo"
|
|
$tenant = Tenant::query()->where('subdomain', $a['tenant_subdomain'])->firstOrFail();
|
|
echo "SKIP {$user->email} → тенант «{$tenant->organization_name}» (id={$tenant->id}) — без изменений\n";
|
|
|
|
continue;
|
|
}
|
|
|
|
// Создаём новый тенант, если ещё не существует
|
|
$tenant = Tenant::query()->firstOrCreate(
|
|
['subdomain' => $a['tenant_subdomain']],
|
|
[
|
|
'organization_name' => $a['org_name'],
|
|
'contact_email' => $user->email,
|
|
'webhook_token' => Str::random(64),
|
|
'timezone' => 'Europe/Moscow',
|
|
'locale' => 'ru',
|
|
'is_trial' => true,
|
|
'api_key_limit' => 5,
|
|
]
|
|
);
|
|
|
|
// Переназначаем пользователя в новый тенант
|
|
$user->tenant_id = $tenant->id;
|
|
$user->save();
|
|
|
|
echo "OK {$user->email} → новый тенант «{$tenant->organization_name}» (id={$tenant->id}, subdomain={$tenant->subdomain})\n";
|
|
}
|
|
|
|
// -------------------------------------------------------------------
|
|
// 4. Итоговый отчёт
|
|
// -------------------------------------------------------------------
|
|
echo "\n=== ИТОГО: изоляция тенантов ===\n";
|
|
$tenants = Tenant::query()
|
|
->whereIn('subdomain', ['demo', 'ivan-demo', 'anna-demo', 'petr-demo', 'mariya-demo'])
|
|
->orderBy('id')
|
|
->get();
|
|
|
|
foreach ($tenants as $t) {
|
|
$users = User::query()->where('tenant_id', $t->id)->pluck('email')->implode(', ');
|
|
$projects = Project::query()->where('tenant_id', $t->id)->count();
|
|
echo sprintf(
|
|
" Тенант %-12s (id=%-2d) — пользователи: %-40s | проектов: %d\n",
|
|
$t->subdomain,
|
|
$t->id,
|
|
$users ?: '(нет)',
|
|
$projects
|
|
);
|
|
}
|
|
|
|
echo "\nГотово. Каждый логин теперь в отдельной компании.\n";
|
|
echo "Пароль для всех: password\n";
|