Files
sam-manage/app/Helpers/TenantHelper.php

102 lines
3.3 KiB
PHP
Raw Normal View History

<?php
namespace App\Helpers;
/**
* 테넌트 컨텍스트 헬퍼
*
* 테넌트 콘솔(새창)에서는 URL의 tenantId를,
* 메인 관리자 페이지에서는 세션의 selected_tenant_id를 사용
*/
class TenantHelper
{
/**
* 메인 라우트명 테넌트 콘솔 라우트명 매핑
* (패턴이 다른 것만 명시, 나머지는 자동 매핑)
*/
private static array $routeMap = [
'item-management.index' => 'tenant-console.production.items.index',
'item-fields.index' => 'tenant-console.production.item-fields.index',
'quote-formulas.index' => 'tenant-console.production.quote-formulas.index',
'quote-formulas.create' => 'tenant-console.production.quote-formulas.create',
'quote-formulas.edit' => 'tenant-console.production.quote-formulas.edit',
'quote-formulas.simulator' => 'tenant-console.production.quote-formulas.simulator',
'quote-formulas.categories.index' => 'tenant-console.production.quote-formulas.categories.index',
];
/**
* 현재 유효한 테넌트 ID 반환
*
* 우선순위:
* 1. request attributes (tenant_console_id) - 테넌트 콘솔 새창
* 2. session (selected_tenant_id) - 메인 관리자 페이지
*/
public static function getEffectiveTenantId(?int $default = null): ?int
{
// 테넌트 콘솔 컨텍스트 우선
$consoleTenantId = request()->attributes->get('tenant_console_id');
if ($consoleTenantId) {
return (int) $consoleTenantId;
}
// 메인 관리자 페이지: 세션 기반
$sessionTenantId = session('selected_tenant_id');
if ($sessionTenantId && $sessionTenantId !== 'all') {
return (int) $sessionTenantId;
}
return $default;
}
/**
* 세션의 raw 반환 (all 포함)
* 메인 관리자에서 "전체" 선택 여부 판단 사용
*/
public static function getRawTenantId(): mixed
{
$consoleTenantId = request()->attributes->get('tenant_console_id');
if ($consoleTenantId) {
return (int) $consoleTenantId;
}
return session('selected_tenant_id');
}
/**
* 테넌트 콘솔(새창) 컨텍스트인지 확인
*/
public static function isTenantConsole(): bool
{
return (bool) request()->attributes->get('tenant_console_id');
}
/**
* 컨텍스트 인식 라우트 URL 생성
*
* 테넌트 콘솔이면 tenant-console.* 라우트로,
* 메인이면 기존 라우트로 URL 생성
*
* @param string $name 메인 라우트명 (: 'common-codes.index')
* @param array $parameters 추가 파라미터
*/
public static function route(string $name, array $parameters = []): string
{
if (! self::isTenantConsole()) {
return route($name, $parameters);
}
$tenantId = self::getEffectiveTenantId();
$consoleName = self::$routeMap[$name] ?? 'tenant-console.'.$name;
return route($consoleName, array_merge(['tenantId' => $tenantId], $parameters));
}
/**
* 컨텍스트 인식 리다이렉트
*/
public static function redirect(string $name, array $parameters = []): \Illuminate\Http\RedirectResponse
{
return redirect(self::route($name, $parameters));
}
}