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:
@@ -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');
|
||||
});
|
||||
}
|
||||
};
|
||||
Reference in New Issue
Block a user