import { Body, Controller, Get, HttpCode, Post, Put, Req, UseGuards } from '@nestjs/common'; import { backupConnectionTestInputSchema, backupRestoreInputSchema, backupSettingsInputSchema, type BackupConnectionTestInput, type BackupConnectionTestResult, type BackupRestoreInput, type BackupSetsView, type BackupSettingsInput, type BackupSettingsView, } from '@dorfteich/shared'; import { AuthedRequest } from '../auth/auth.guard'; import { ZodValidationPipe } from '../common/zod-validation.pipe'; import { SiteAdminGuard } from './site-admin.guard'; import { BackupAdminService } from './backup-admin.service'; /** * Site-Admin backup management (issue #103): Nextcloud target settings with * a live connection test, the manual backup trigger, and the in-app restore * (both answer 202 — the sidecar executes, progress arrives through the * status files surfaced on GET /admin/system/backup). */ @Controller('admin/system/backup') @UseGuards(SiteAdminGuard) export class BackupAdminController { constructor(private readonly backup: BackupAdminService) {} @Get('settings') settings(): Promise { return this.backup.settingsView(); } @Put('settings') saveSettings( @Body(new ZodValidationPipe(backupSettingsInputSchema)) input: BackupSettingsInput, @Req() request: AuthedRequest, ): Promise { return this.backup.saveSettings(input, request.user!); } @Post('nextcloud/test') @HttpCode(200) testConnection( @Body(new ZodValidationPipe(backupConnectionTestInputSchema)) input: BackupConnectionTestInput, ): Promise { return this.backup.testConnection(input); } @Get('sets') sets(): Promise { return this.backup.sets(); } @Post('run') @HttpCode(202) async run(@Req() request: AuthedRequest): Promise<{ requested: true }> { await this.backup.requestRun(request.user!); return { requested: true }; } @Post('restore') @HttpCode(202) async restore( @Body(new ZodValidationPipe(backupRestoreInputSchema)) input: BackupRestoreInput, @Req() request: AuthedRequest, ): Promise<{ requested: true }> { await this.backup.requestRestore(input, request.user!); return { requested: true }; } }