Add import/export and update system

Implement CSV/JSON import and export for domains, notification groups and tags (with masking for sensitive channel data), including size/format validation, in-memory CSV building, and logging. Add tag transfer and bulk transfer actions (admin-only). Introduce a new update system: Add UpdateController and UpdateService, migration 025_add_update_system_v1.1.3.sql, and installer changes to include the new migration and version handling; provide endpoints to check, apply, rollback and configure updates. Update helpers and UI bits: add getUpdateBadgeInfo in LayoutHelper, update notification icons/redirects, and add getMaxUploadSize in ViewHelper. Misc: add NotificationGroup::findByName, tweak .gitignore backups path, and update related views and routes.
This commit is contained in:
Hosteroid
2026-02-11 17:43:23 +02:00
parent 0c759cdd1d
commit 3688c8b71b
32 changed files with 4268 additions and 350 deletions

View File

@@ -17,6 +17,7 @@ use App\Controllers\NotificationController;
use App\Controllers\ErrorLogController;
use App\Controllers\TwoFactorController;
use App\Controllers\TagController;
use App\Controllers\UpdateController;
$router = Application::$router;
@@ -62,6 +63,8 @@ $router->get('/api/search/suggest', [SearchController::class, 'suggest']);
// Domains
$router->get('/domains', [DomainController::class, 'index']);
$router->get('/domains/export', [DomainController::class, 'export']);
$router->post('/domains/import', [DomainController::class, 'import']);
$router->get('/domains/create', [DomainController::class, 'create']);
$router->get('/domains/bulk-add', [DomainController::class, 'bulkAdd']);
$router->post('/domains/bulk-add', [DomainController::class, 'bulkAdd']);
@@ -86,6 +89,8 @@ $router->post('/domains/{id}/delete', [DomainController::class, 'delete']);
// Notification Groups
$router->get('/groups', [NotificationGroupController::class, 'index']);
$router->get('/groups/export', [NotificationGroupController::class, 'export']);
$router->post('/groups/import', [NotificationGroupController::class, 'import']);
$router->get('/groups/create', [NotificationGroupController::class, 'create']);
$router->post('/groups/store', [NotificationGroupController::class, 'store']);
$router->get('/groups/{id}/edit', [NotificationGroupController::class, 'edit']);
@@ -131,6 +136,14 @@ $router->post('/settings/test-cron', [SettingsController::class, 'testCron']);
$router->post('/settings/clear-logs', [SettingsController::class, 'clearLogs']);
$router->post('/settings/toggle-isolation', [SettingsController::class, 'toggleIsolationMode']);
// Updates (Admin Only)
$router->post('/api/updates/check', [UpdateController::class, 'check']);
$router->post('/settings/updates/apply', [UpdateController::class, 'apply']);
$router->post('/settings/updates/rollback', [UpdateController::class, 'rollback']);
$router->post('/settings/updates/preferences', [UpdateController::class, 'savePreferences']);
$router->post('/settings/updates/channel', [UpdateController::class, 'updateChannel']);
$router->post('/settings/updates/badge', [UpdateController::class, 'updateBadgePreference']);
// Profile
$router->get('/profile', [ProfileController::class, 'index']);
$router->post('/profile/update', [ProfileController::class, 'update']);
@@ -182,10 +195,14 @@ $router->post('/errors/clear-resolved', [ErrorLogController::class, 'clearResolv
// Tag Management
$router->get('/tags', [TagController::class, 'index']);
$router->get('/tags/export', [TagController::class, 'export']);
$router->post('/tags/import', [TagController::class, 'import']);
$router->post('/tags/create', [TagController::class, 'create']);
$router->post('/tags/update', [TagController::class, 'update']);
$router->post('/tags/delete', [TagController::class, 'delete']);
$router->post('/tags/bulk-delete', [TagController::class, 'bulkDelete']);
$router->post('/tags/transfer', [TagController::class, 'transfer']);
$router->post('/tags/bulk-delete', [TagController::class, 'bulkDelete']);
$router->post('/tags/bulk-transfer', [TagController::class, 'bulkTransfer']);
$router->get('/tags/{id}', [TagController::class, 'show']);
$router->post('/tags/bulk-add-to-domains', [TagController::class, 'bulkAddToDomains']);
$router->post('/tags/bulk-remove-from-domains', [TagController::class, 'bulkRemoveFromDomains']);