netgescon-day0/app/Services/Admin/AdministratorProvisioningService.php

58 lines
1.9 KiB
PHP

<?php
namespace App\Services\Admin;
use App\Models\Amministratore;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Log;
use Illuminate\Support\Facades\Storage;
class AdministratorProvisioningService
{
public function provision(Amministratore $amministratore, bool $createDatabase = true, bool $force = false): array
{
$changed = false;
// 1. Cartelle
if ($force || empty($amministratore->cartella_dati) || !is_dir($amministratore->cartella_dati)) {
$amministratore->provisionArchiveIfMissing();
$changed = true;
}
// 2. Database dedicato
$dbName = $amministratore->getDatabaseName();
if ($createDatabase && $this->ensureDatabaseExists($dbName)) {
$changed = true;
}
// 3. Flag provisioned_at
if ($changed || $force || !$amministratore->provisioned_at) {
$amministratore->provisioned_at = now();
$amministratore->saveQuietly();
}
return [
'amministratore_id' => $amministratore->id,
'database' => $dbName,
'archive_path' => $amministratore->cartella_dati,
'provisioned_at' => $amministratore->provisioned_at,
'changed' => $changed,
];
}
protected function ensureDatabaseExists(string $dbName): bool
{
try {
$exists = DB::select("SELECT SCHEMA_NAME FROM INFORMATION_SCHEMA.SCHEMATA WHERE SCHEMA_NAME = ?", [$dbName]);
if (!$exists) {
DB::statement("CREATE DATABASE `{$dbName}` CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci");
Log::info('[Provisioning] Created database: ' . $dbName);
return true;
}
} catch (\Throwable $e) {
Log::error('[Provisioning] Error ensuring database ' . $dbName . ': ' . $e->getMessage());
}
return false;
}
}