feat: Waves 3+4 — frontend wiring, NATS integration, stores (19 files)
All checks were successful
Test Asgard Runner / test (push) Successful in 2s

Frontend:
- Wire Dashboard quick actions (start/stop/trigger wipe) + next wipe schedule
- Wire Console WebSocket streaming for real-time output
- Implement TOTP 2FA challenge flow in LoginView
- Wire Plugin load/unload toggle + uninstall buttons with confirmations
- Wire WipesView profile selector, disable trigger when no profiles
- Build full WipeProfiles create/edit modal with all config fields
- Wire MapsView file upload with multipart FormData
- Fix SettingsView empty catch blocks → toast error messages
- Fix stale localStorage token reads in CSV exports → auth store
- Fix auth store hardcoded permissions → JWT-decoded role permissions
- Fix wipe store onMounted lifecycle bug → explicit subscribe action
- Update EarlyAccessView from countdown to "Now Live" state

Backend:
- Wire wipe trigger to publish NATS cmd (corrosion.{id}.cmd.wipe)
- Wire plugin reload/uninstall to publish NATS cmd
- Expand NatsBridgeService: add files, wipe status, server status subs
- Add PATCH schedules/:id/toggle endpoint for task toggling

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
Vantz Stockwell
2026-02-21 13:34:09 -05:00
parent a181ed7ded
commit 8bb6cc0890
19 changed files with 776 additions and 139 deletions

View File

@@ -3,9 +3,11 @@ import {
Get,
Post,
Put,
Patch,
Delete,
Body,
Param,
ParseUUIDPipe,
UseGuards,
} from '@nestjs/common';
import {
@@ -85,6 +87,28 @@ export class SchedulesController {
return await this.schedulesService.updateTask(licenseId, taskId, dto);
}
@Patch('tasks/:id/toggle')
@RequirePermission('schedules.manage')
@ApiOperation({
summary: 'Toggle a scheduled task',
description: 'Enable or disable a scheduled task without deleting it',
})
@ApiResponse({
status: 200,
description: 'Task toggled successfully',
})
@ApiResponse({
status: 404,
description: 'Task not found',
})
async toggleTask(
@CurrentTenant() licenseId: string,
@Param('id', ParseUUIDPipe) taskId: string,
@Body('enabled') enabled: boolean,
) {
return await this.schedulesService.toggleTask(licenseId, taskId, enabled);
}
@Delete('tasks/:id')
@RequirePermission('schedules.manage')
@ApiOperation({
@@ -101,7 +125,7 @@ export class SchedulesController {
})
async deleteTask(
@CurrentTenant() licenseId: string,
@Param('id') taskId: string,
@Param('id', ParseUUIDPipe) taskId: string,
) {
return await this.schedulesService.deleteTask(licenseId, taskId);
}