Scaffold per sostituire il modulo whistleblowing interno (plaintext) con Vocea (nexus-whistleblowing-ms), prodotto zero-knowledge della suite. Modalita C (integrazione verticale, nessuna crypto re-implementata). DORMIENTE: VOCEA_ENABLED =false di default -> zero impatto sul modulo legacy. - docs/sql/063_vocea_channel.sql + application/cli/migrate_063_vocea_channel.php (idempotente): organizations += vocea_tenant_slug/channel_status/enrolled_at. NON ancora applicata al DB. - application/services/VoceaService.php (nuovo): client API integratori (X-API-Key su api.vocea.cloud) per submit/status/reports/keyholders + portalUrl (embed wb-link.js). Guard enabled()/isEnabledForOrg(): se OFF/non provisioned ritorna DISABLED/NOT_PROVISIONED senza chiamate di rete. - config.php: costanti VOCEA_ENABLED/BASE_URL/API_KEY/PORTAL_URL (default off). - WhistleblowingController: branch dormiente in list() (delega a Vocea se attivo) + endpoint GET channelStatus + helper voceaOrg/listViaVocea. Modulo legacy invariato. - public/index.php: route GET:channelStatus. - docs handoff: richiesta a VIGILE (OUTGOING) + risposta VIGILE (INCOMING). Attivazione a MS live: applicare migrate_063 + VOCEA_ENABLED=true + VOCEA_API_KEY (vault tier1__nis2-agile__vocea__*) + slug canale su organizations. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
37 lines
1.6 KiB
PHP
37 lines
1.6 KiB
PHP
<?php
|
|
/**
|
|
* migrate_063_vocea_channel.php — Integrazione Vocea (whistleblowing zero-knowledge).
|
|
* organizations += vocea_tenant_slug, vocea_channel_status, vocea_enrolled_at. IDEMPOTENTE.
|
|
* SCAFFOLD DORMIENTE: nessun effetto funzionale finché VOCEA_ENABLED=false (default).
|
|
*
|
|
* Eseguire (host): docker exec nis2-app php /var/www/nis2-agile/application/cli/migrate_063_vocea_channel.php
|
|
*/
|
|
if (PHP_SAPI !== 'cli') { http_response_code(403); exit("CLI only\n"); }
|
|
require_once __DIR__ . '/../config/env.php';
|
|
require_once __DIR__ . '/../config/database.php';
|
|
|
|
$pdo = Database::getInstance();
|
|
|
|
function colExists(PDO $pdo, string $table, string $col): bool {
|
|
$st = $pdo->prepare(
|
|
"SELECT 1 FROM information_schema.COLUMNS
|
|
WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = ? AND COLUMN_NAME = ?"
|
|
);
|
|
$st->execute([$table, $col]);
|
|
return (bool)$st->fetchColumn();
|
|
}
|
|
|
|
$adds = [
|
|
'vocea_tenant_slug' => "ADD COLUMN vocea_tenant_slug VARCHAR(64) NULL COMMENT 'Slug canale Vocea (NULL=nessuno)'",
|
|
'vocea_channel_status' => "ADD COLUMN vocea_channel_status ENUM('none','provisioning','active','suspended') NOT NULL DEFAULT 'none'",
|
|
'vocea_enrolled_at' => "ADD COLUMN vocea_enrolled_at TIMESTAMP NULL COMMENT 'Enrollment canale + key holder'",
|
|
];
|
|
|
|
foreach ($adds as $col => $clause) {
|
|
if (colExists($pdo, 'organizations', $col)) { echo " - $col gia presente, skip\n"; continue; }
|
|
$pdo->exec("ALTER TABLE organizations $clause");
|
|
echo " + aggiunta colonna organizations.$col\n";
|
|
}
|
|
|
|
echo "Migrazione 063 — organizations.vocea_* OK. Prossima mig=064.\n";
|