Piantine pubblicate anche dopo un ripristino; posto unico senza gare

- Lo stato "Pubblicata" non dipende più dall'id del territorio, che il
  ripristino ricrea: l'impronta usa il numero, e la piantina ricorda il
  percorso del PDF pubblicato (pdf_pubblicato, con migrazione che riconosce
  le piantine già pubblicate).
- BackupOperationState: corrente() in sola lettura e liberaCorrente() sotto
  lo stesso mutex di occupa(), così una lettura non cancella il puntatore
  di un'operazione appena avviata.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
2026-10-12 15:33:07 +02:00
parent 426a95211d
commit e7148c7b32
8 changed files with 143 additions and 22 deletions

View File

@@ -0,0 +1,68 @@
<?php
use App\Models\TerritorioMappa;
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
/**
* La piantina ricorda il percorso del PDF che ha pubblicato.
*
* Prima "Pubblicata" si riconosceva dall'id del territorio, sia
* nell'impronta sia nel nome del file (territori-pdf/piantina-{id}-…): il
* ripristino di un backup ricrea i territori con id nuovi, e ogni piantina
* pubblicata tornava "da pubblicare". Ora l'impronta usa il numero e lo stato
* confronta il percorso del PDF in vigore con quello registrato qui; entrambi
* attraversano il ripristino intatti.
*
* Le piantine già pubblicate restano tali solo se lo erano davvero: impronta
* corrispondente (con la formula di prima, o con la nuova se la migrazione
* precedente gira adesso su un'installazione nuova) e PDF in vigore composto
* da questa piantina.
*/
return new class extends Migration
{
public function up(): void
{
Schema::table('territorio_mappe', function (Blueprint $table) {
$table->string('pdf_pubblicato')->nullable()->after('impronta_pubblicata');
});
TerritorioMappa::with('territorio.zona')
->whereNotNull('pubblicata_at')
->whereNotNull('territorio_id')
->get()
->each(function (TerritorioMappa $mappa) {
$territorio = $mappa->territorio;
$pdf = (string) $territorio?->pdf_path;
$improntaVecchia = hash('sha256', json_encode([
$mappa->geometria(),
$mappa->territorio_id,
$territorio ? trim((string) $territorio->numero) : null,
$territorio?->zona?->nome,
$territorio ? trim((string) $territorio->confini) : null,
]));
$improntaNuova = $mappa->impronta();
$eraPubblicata = in_array($mappa->impronta_pubblicata, [$improntaVecchia, $improntaNuova], true)
&& str_starts_with($pdf, 'territori-pdf/piantina-' . $mappa->territorio_id . '-');
if (! $eraPubblicata) {
return;
}
$mappa->forceFill([
'impronta_pubblicata' => $improntaNuova,
'pdf_pubblicato' => $pdf,
])->saveQuietly();
});
}
public function down(): void
{
Schema::table('territorio_mappe', function (Blueprint $table) {
$table->dropColumn('pdf_pubblicato');
});
}
};