error('CLI 전용 커맨드입니다. (현재 SAPI: '.php_sapi_name().')'); return self::FAILURE; } // ② 명시 옵트인 — 환경변수 없이는 production 호출 실수 차단 if (env('G7_PLAYWRIGHT_BYPASS') !== '1') { $this->error('G7_PLAYWRIGHT_BYPASS=1 환경변수가 필요합니다. (예: PowerShell — $env:G7_PLAYWRIGHT_BYPASS=\'1\')'); return self::FAILURE; } // ③ APP_DEBUG 강제 — production + debug=false 환경에서도 sanctum 토큰 발급 + 디버그 정보 누락 방지. // SettingsServiceProvider::applyDebugConfig 는 bypass flag 가 있으면 settings JSON 덮어쓰기를 이미 건너뛴 상태. Config::set('app.debug', true); $permissions = $this->option('permissions') ?: []; $user = $this->makeAdminUser($permissions); $token = $user->createToken('playwright-'.uniqid())->plainTextToken; $this->line($token); return self::SUCCESS; } /** * 권한 식별자 배열로 관리자 유저를 생성하고 권한을 부여한다. * * 절차: * 1. User factory 로 신규 유저 생성 * 2. 권한 식별자별로 Permission 행 보장 (firstOrCreate) * 3. uniqid 접미사로 격리된 test role 생성 + 권한 sync * 4. admin role 보장 (firstOrCreate) + 유저-역할 부여 */ private function makeAdminUser(array $permissions): User { $user = User::factory()->create(); $permissionIds = []; foreach ($permissions as $identifier) { $permission = Permission::firstOrCreate( ['identifier' => $identifier], [ 'name' => json_encode(['ko' => $identifier, 'en' => $identifier]), 'description' => json_encode(['ko' => $identifier, 'en' => $identifier]), 'extension_type' => ExtensionOwnerType::Core, 'extension_identifier' => 'core', 'type' => 'admin', ] ); $permissionIds[] = $permission->id; } $testRole = Role::create([ 'identifier' => 'playwright_test_'.uniqid(), 'name' => json_encode(['ko' => 'Playwright 테스트 관리자', 'en' => 'Playwright Test Admin']), 'description' => json_encode(['ko' => 'E2E 자동화 전용', 'en' => 'E2E automation only']), 'is_active' => true, ]); $adminRole = Role::firstOrCreate( ['identifier' => 'admin'], [ 'name' => json_encode(['ko' => '관리자', 'en' => 'Admin']), 'description' => json_encode(['ko' => '시스템 관리자', 'en' => 'System Admin']), 'extension_type' => ExtensionOwnerType::Core, 'extension_identifier' => 'core', 'type' => 'admin', 'is_active' => true, ] ); if (! empty($permissionIds)) { $testRole->permissions()->sync($permissionIds); } $user->roles()->attach($adminRole->id, ['assigned_at' => now(), 'assigned_by' => null]); $user->roles()->attach($testRole->id, ['assigned_at' => now(), 'assigned_by' => null]); return $user->fresh(); } }