56 lines
2.2 KiB
PHP
56 lines
2.2 KiB
PHP
<?php
|
|
|
|
declare(strict_types=1);
|
|
|
|
namespace App\Http\Controllers\Concerns;
|
|
|
|
use Illuminate\Http\Request;
|
|
use Illuminate\Support\Facades\DB;
|
|
|
|
/**
|
|
* Резолв saas_admin_users.id для audit-trail на MVP (saas-admin SSO ⏸ Б-1).
|
|
*
|
|
* Берёт admin_user_id из request-параметра; при отсутствии валидного —
|
|
* создаёт/переиспользует системный стаб-аккаунт (не loginable, is_active=false),
|
|
* чтобы соблюсти NOT NULL + FK на saas_admin_users в saas_admin_audit_log.
|
|
*
|
|
* Паттерн ранее дублировался в AdminPricingTiersController /
|
|
* AdminSystemSettingsController; новый код использует этот трейт.
|
|
*/
|
|
trait ResolvesAdminUserId
|
|
{
|
|
protected function resolveAdminUserId(Request $request, string $stubEmail, string $stubName): int
|
|
{
|
|
// Прод: crm_app_user не имеет прав на saas_admin_users → берём системный
|
|
// admin-id из конфига, не обращаясь к таблице (фикс 500 на admin-сохранениях).
|
|
// null (dev/test, суперюзер) → fallback на старую логику ниже.
|
|
$configured = config('admin.audit_system_user_id');
|
|
if ($configured !== null) {
|
|
return (int) $configured;
|
|
}
|
|
|
|
$requested = $request->input('admin_user_id');
|
|
if (is_int($requested) || (is_string($requested) && ctype_digit($requested))) {
|
|
$existing = DB::table('saas_admin_users')->where('id', (int) $requested)->value('id');
|
|
if ($existing !== null) {
|
|
return (int) $existing;
|
|
}
|
|
}
|
|
|
|
$existingId = DB::table('saas_admin_users')->where('email', $stubEmail)->value('id');
|
|
if ($existingId !== null) {
|
|
return (int) $existingId;
|
|
}
|
|
|
|
return (int) DB::table('saas_admin_users')->insertGetId([
|
|
'email' => $stubEmail,
|
|
'full_name' => $stubName,
|
|
'password_hash' => '$2y$04$system-stub-not-loginable',
|
|
'role' => 'super_admin',
|
|
'is_active' => false,
|
|
'sso_provider' => 'local',
|
|
'is_break_glass' => false,
|
|
]);
|
|
}
|
|
}
|