refactor(server): move database restores code into a service (#25918)

* fix(server): use provided database name/username for restore & ensure name is not mangled

fixes #25633

Signed-off-by: izzy <me@insrt.uk>

* chore: add db switch back but with comments

Signed-off-by: izzy <me@insrt.uk>

* refactor: no need to restore database since it's not technically possible
chore: late fallback for username in parameter builder

Signed-off-by: izzy <me@insrt.uk>

* chore: type fix

Signed-off-by: izzy <me@insrt.uk>

* refactor: move db backup code into service

* test: check SQL sent to psql

* chore: remove todo

Signed-off-by: izzy <me@insrt.uk>

---------

Signed-off-by: izzy <me@insrt.uk>
This commit is contained in:
Paul Makles
2026-02-10 12:12:27 -05:00
committed by GitHub
parent 280174026f
commit caeba5063b
11 changed files with 1379 additions and 1099 deletions
@@ -34,12 +34,14 @@ import { FilenameParamDto } from 'src/validation';
import type { DatabaseBackupController as _DatabaseBackupController } from 'src/controllers/database-backup.controller';
import type { ServerController as _ServerController } from 'src/controllers/server.controller';
import { DatabaseBackupDeleteDto, DatabaseBackupListResponseDto } from 'src/dtos/database-backup.dto';
import { DatabaseBackupService } from 'src/services/database-backup.service';
@Controller()
export class MaintenanceWorkerController {
constructor(
private logger: LoggingRepository,
private service: MaintenanceWorkerService,
private databaseBackupService: DatabaseBackupService,
) {}
/**
@@ -61,7 +63,7 @@ export class MaintenanceWorkerController {
@Get('admin/database-backups')
@MaintenanceRoute()
listDatabaseBackups(): Promise<DatabaseBackupListResponseDto> {
return this.service.listBackups();
return this.databaseBackupService.listBackups();
}
/**
@@ -74,7 +76,7 @@ export class MaintenanceWorkerController {
@Res() res: Response,
@Next() next: NextFunction,
) {
await sendFile(res, next, () => this.service.downloadBackup(filename), this.logger);
await sendFile(res, next, () => this.databaseBackupService.downloadBackup(filename), this.logger);
}
/**
@@ -83,7 +85,7 @@ export class MaintenanceWorkerController {
@Delete('admin/database-backups')
@MaintenanceRoute()
async deleteDatabaseBackup(@Body() dto: DatabaseBackupDeleteDto): Promise<void> {
return this.service.deleteBackup(dto.backups);
return this.databaseBackupService.deleteBackup(dto.backups);
}
/**
@@ -96,7 +98,7 @@ export class MaintenanceWorkerController {
@UploadedFile()
file: Express.Multer.File,
): Promise<void> {
return this.service.uploadBackup(file);
return this.databaseBackupService.uploadBackup(file);
}
@Get('admin/maintenance/status')