refactor: rename db backup routes

This commit is contained in:
izzy
2025-12-03 11:47:48 +00:00
parent fe8eb85e37
commit a63b418507
14 changed files with 168 additions and 146 deletions

View File

@@ -133,11 +133,11 @@ Class | Method | HTTP request | Description
*AuthenticationApi* | [**unlockAuthSession**](doc//AuthenticationApi.md#unlockauthsession) | **POST** /auth/session/unlock | Unlock auth session
*AuthenticationApi* | [**validateAccessToken**](doc//AuthenticationApi.md#validateaccesstoken) | **POST** /auth/validateToken | Validate access token
*AuthenticationAdminApi* | [**unlinkAllOAuthAccountsAdmin**](doc//AuthenticationAdminApi.md#unlinkalloauthaccountsadmin) | **POST** /admin/auth/unlink-all | Unlink all OAuth accounts
*DatabaseBackupsAdminApi* | [**deleteBackup**](doc//DatabaseBackupsAdminApi.md#deletebackup) | **DELETE** /admin/database-backups/{filename} | Delete backup
*DatabaseBackupsAdminApi* | [**downloadBackup**](doc//DatabaseBackupsAdminApi.md#downloadbackup) | **GET** /admin/database-backups/{filename} | Download backup
*DatabaseBackupsAdminApi* | [**listBackups**](doc//DatabaseBackupsAdminApi.md#listbackups) | **GET** /admin/database-backups | List backups
*DatabaseBackupsAdminApi* | [**startRestoreFlow**](doc//DatabaseBackupsAdminApi.md#startrestoreflow) | **POST** /admin/database-backups/start-restore | Start backup restore flow
*DatabaseBackupsAdminApi* | [**uploadBackup**](doc//DatabaseBackupsAdminApi.md#uploadbackup) | **POST** /admin/database-backups/upload | Upload database backup
*DatabaseBackupsAdminApi* | [**deleteDatabaseBackup**](doc//DatabaseBackupsAdminApi.md#deletedatabasebackup) | **DELETE** /admin/database-backups/{filename} | Delete database backup
*DatabaseBackupsAdminApi* | [**downloadDatabaseBackup**](doc//DatabaseBackupsAdminApi.md#downloaddatabasebackup) | **GET** /admin/database-backups/{filename} | Download database backup
*DatabaseBackupsAdminApi* | [**listDatabaseBackups**](doc//DatabaseBackupsAdminApi.md#listdatabasebackups) | **GET** /admin/database-backups | List database backups
*DatabaseBackupsAdminApi* | [**startDatabaseRestoreFlow**](doc//DatabaseBackupsAdminApi.md#startdatabaserestoreflow) | **POST** /admin/database-backups/start-restore | Start database backup restore flow
*DatabaseBackupsAdminApi* | [**uploadDatabaseBackup**](doc//DatabaseBackupsAdminApi.md#uploaddatabasebackup) | **POST** /admin/database-backups/upload | Upload database backup
*DeprecatedApi* | [**createPartnerDeprecated**](doc//DeprecatedApi.md#createpartnerdeprecated) | **POST** /partners/{id} | Create a partner
*DeprecatedApi* | [**getAllUserAssetsByDeviceId**](doc//DeprecatedApi.md#getalluserassetsbydeviceid) | **GET** /assets/device/{deviceId} | Retrieve assets by device ID
*DeprecatedApi* | [**getDeltaSync**](doc//DeprecatedApi.md#getdeltasync) | **POST** /sync/delta-sync | Get delta sync for user
@@ -423,11 +423,11 @@ Class | Method | HTTP request | Description
- [MachineLearningAvailabilityChecksDto](doc//MachineLearningAvailabilityChecksDto.md)
- [MaintenanceAction](doc//MaintenanceAction.md)
- [MaintenanceAuthDto](doc//MaintenanceAuthDto.md)
- [MaintenanceIntegrityResponseDto](doc//MaintenanceIntegrityResponseDto.md)
- [MaintenanceDetectInstallResponseDto](doc//MaintenanceDetectInstallResponseDto.md)
- [MaintenanceDetectInstallStorageFolderDto](doc//MaintenanceDetectInstallStorageFolderDto.md)
- [MaintenanceListBackupsResponseDto](doc//MaintenanceListBackupsResponseDto.md)
- [MaintenanceLoginDto](doc//MaintenanceLoginDto.md)
- [MaintenanceStatusResponseDto](doc//MaintenanceStatusResponseDto.md)
- [MaintenanceStorageFolderIntegrityDto](doc//MaintenanceStorageFolderIntegrityDto.md)
- [ManualJobName](doc//ManualJobName.md)
- [MapMarkerResponseDto](doc//MapMarkerResponseDto.md)
- [MapReverseGeocodeResponseDto](doc//MapReverseGeocodeResponseDto.md)

View File

@@ -169,11 +169,11 @@ part 'model/logout_response_dto.dart';
part 'model/machine_learning_availability_checks_dto.dart';
part 'model/maintenance_action.dart';
part 'model/maintenance_auth_dto.dart';
part 'model/maintenance_integrity_response_dto.dart';
part 'model/maintenance_detect_install_response_dto.dart';
part 'model/maintenance_detect_install_storage_folder_dto.dart';
part 'model/maintenance_list_backups_response_dto.dart';
part 'model/maintenance_login_dto.dart';
part 'model/maintenance_status_response_dto.dart';
part 'model/maintenance_storage_folder_integrity_dto.dart';
part 'model/manual_job_name.dart';
part 'model/map_marker_response_dto.dart';
part 'model/map_reverse_geocode_response_dto.dart';

View File

@@ -16,7 +16,7 @@ class DatabaseBackupsAdminApi {
final ApiClient apiClient;
/// Delete backup
/// Delete database backup
///
/// Delete a backup by its filename
///
@@ -25,7 +25,7 @@ class DatabaseBackupsAdminApi {
/// Parameters:
///
/// * [String] filename (required):
Future<Response> deleteBackupWithHttpInfo(String filename,) async {
Future<Response> deleteDatabaseBackupWithHttpInfo(String filename,) async {
// ignore: prefer_const_declarations
final apiPath = r'/admin/database-backups/{filename}'
.replaceAll('{filename}', filename);
@@ -51,21 +51,21 @@ class DatabaseBackupsAdminApi {
);
}
/// Delete backup
/// Delete database backup
///
/// Delete a backup by its filename
///
/// Parameters:
///
/// * [String] filename (required):
Future<void> deleteBackup(String filename,) async {
final response = await deleteBackupWithHttpInfo(filename,);
Future<void> deleteDatabaseBackup(String filename,) async {
final response = await deleteDatabaseBackupWithHttpInfo(filename,);
if (response.statusCode >= HttpStatus.badRequest) {
throw ApiException(response.statusCode, await _decodeBodyBytes(response));
}
}
/// Download backup
/// Download database backup
///
/// Downloads the database backup file
///
@@ -74,7 +74,7 @@ class DatabaseBackupsAdminApi {
/// Parameters:
///
/// * [String] filename (required):
Future<Response> downloadBackupWithHttpInfo(String filename,) async {
Future<Response> downloadDatabaseBackupWithHttpInfo(String filename,) async {
// ignore: prefer_const_declarations
final apiPath = r'/admin/database-backups/{filename}'
.replaceAll('{filename}', filename);
@@ -100,15 +100,15 @@ class DatabaseBackupsAdminApi {
);
}
/// Download backup
/// Download database backup
///
/// Downloads the database backup file
///
/// Parameters:
///
/// * [String] filename (required):
Future<MultipartFile?> downloadBackup(String filename,) async {
final response = await downloadBackupWithHttpInfo(filename,);
Future<MultipartFile?> downloadDatabaseBackup(String filename,) async {
final response = await downloadDatabaseBackupWithHttpInfo(filename,);
if (response.statusCode >= HttpStatus.badRequest) {
throw ApiException(response.statusCode, await _decodeBodyBytes(response));
}
@@ -122,12 +122,12 @@ class DatabaseBackupsAdminApi {
return null;
}
/// List backups
/// List database backups
///
/// Get the list of the successful and failed backups
///
/// Note: This method returns the HTTP [Response].
Future<Response> listBackupsWithHttpInfo() async {
Future<Response> listDatabaseBackupsWithHttpInfo() async {
// ignore: prefer_const_declarations
final apiPath = r'/admin/database-backups';
@@ -152,11 +152,11 @@ class DatabaseBackupsAdminApi {
);
}
/// List backups
/// List database backups
///
/// Get the list of the successful and failed backups
Future<MaintenanceListBackupsResponseDto?> listBackups() async {
final response = await listBackupsWithHttpInfo();
Future<MaintenanceListBackupsResponseDto?> listDatabaseBackups() async {
final response = await listDatabaseBackupsWithHttpInfo();
if (response.statusCode >= HttpStatus.badRequest) {
throw ApiException(response.statusCode, await _decodeBodyBytes(response));
}
@@ -170,12 +170,12 @@ class DatabaseBackupsAdminApi {
return null;
}
/// Start backup restore flow
/// Start database backup restore flow
///
/// Put Immich into maintenance mode to restore a backup (Immich must not be configured)
///
/// Note: This method returns the HTTP [Response].
Future<Response> startRestoreFlowWithHttpInfo() async {
Future<Response> startDatabaseRestoreFlowWithHttpInfo() async {
// ignore: prefer_const_declarations
final apiPath = r'/admin/database-backups/start-restore';
@@ -200,11 +200,11 @@ class DatabaseBackupsAdminApi {
);
}
/// Start backup restore flow
/// Start database backup restore flow
///
/// Put Immich into maintenance mode to restore a backup (Immich must not be configured)
Future<void> startRestoreFlow() async {
final response = await startRestoreFlowWithHttpInfo();
Future<void> startDatabaseRestoreFlow() async {
final response = await startDatabaseRestoreFlowWithHttpInfo();
if (response.statusCode >= HttpStatus.badRequest) {
throw ApiException(response.statusCode, await _decodeBodyBytes(response));
}
@@ -219,7 +219,7 @@ class DatabaseBackupsAdminApi {
/// Parameters:
///
/// * [MultipartFile] file:
Future<Response> uploadBackupWithHttpInfo({ MultipartFile? file, }) async {
Future<Response> uploadDatabaseBackupWithHttpInfo({ MultipartFile? file, }) async {
// ignore: prefer_const_declarations
final apiPath = r'/admin/database-backups/upload';
@@ -261,8 +261,8 @@ class DatabaseBackupsAdminApi {
/// Parameters:
///
/// * [MultipartFile] file:
Future<void> uploadBackup({ MultipartFile? file, }) async {
final response = await uploadBackupWithHttpInfo( file: file, );
Future<void> uploadDatabaseBackup({ MultipartFile? file, }) async {
final response = await uploadDatabaseBackupWithHttpInfo( file: file, );
if (response.statusCode >= HttpStatus.badRequest) {
throw ApiException(response.statusCode, await _decodeBodyBytes(response));
}

View File

@@ -49,7 +49,7 @@ class MaintenanceAdminApi {
/// Detect existing install
///
/// Collect integrity checks and other heuristics about local data.
Future<MaintenanceIntegrityResponseDto?> detectPriorInstall() async {
Future<MaintenanceDetectInstallResponseDto?> detectPriorInstall() async {
final response = await detectPriorInstallWithHttpInfo();
if (response.statusCode >= HttpStatus.badRequest) {
throw ApiException(response.statusCode, await _decodeBodyBytes(response));
@@ -58,7 +58,7 @@ class MaintenanceAdminApi {
// At the time of writing this, `dart:convert` will throw an "Unexpected end of input"
// FormatException when trying to decode an empty string.
if (response.body.isNotEmpty && response.statusCode != HttpStatus.noContent) {
return await apiClient.deserializeAsync(await _decodeBodyBytes(response), 'MaintenanceIntegrityResponseDto',) as MaintenanceIntegrityResponseDto;
return await apiClient.deserializeAsync(await _decodeBodyBytes(response), 'MaintenanceDetectInstallResponseDto',) as MaintenanceDetectInstallResponseDto;
}
return null;

View File

@@ -384,16 +384,16 @@ class ApiClient {
return MaintenanceActionTypeTransformer().decode(value);
case 'MaintenanceAuthDto':
return MaintenanceAuthDto.fromJson(value);
case 'MaintenanceIntegrityResponseDto':
return MaintenanceIntegrityResponseDto.fromJson(value);
case 'MaintenanceDetectInstallResponseDto':
return MaintenanceDetectInstallResponseDto.fromJson(value);
case 'MaintenanceDetectInstallStorageFolderDto':
return MaintenanceDetectInstallStorageFolderDto.fromJson(value);
case 'MaintenanceListBackupsResponseDto':
return MaintenanceListBackupsResponseDto.fromJson(value);
case 'MaintenanceLoginDto':
return MaintenanceLoginDto.fromJson(value);
case 'MaintenanceStatusResponseDto':
return MaintenanceStatusResponseDto.fromJson(value);
case 'MaintenanceStorageFolderIntegrityDto':
return MaintenanceStorageFolderIntegrityDto.fromJson(value);
case 'ManualJobName':
return ManualJobNameTypeTransformer().decode(value);
case 'MapMarkerResponseDto':

View File

@@ -10,16 +10,16 @@
part of openapi.api;
class MaintenanceIntegrityResponseDto {
/// Returns a new [MaintenanceIntegrityResponseDto] instance.
MaintenanceIntegrityResponseDto({
class MaintenanceDetectInstallResponseDto {
/// Returns a new [MaintenanceDetectInstallResponseDto] instance.
MaintenanceDetectInstallResponseDto({
this.storage = const [],
});
List<MaintenanceStorageFolderIntegrityDto> storage;
List<MaintenanceDetectInstallStorageFolderDto> storage;
@override
bool operator ==(Object other) => identical(this, other) || other is MaintenanceIntegrityResponseDto &&
bool operator ==(Object other) => identical(this, other) || other is MaintenanceDetectInstallResponseDto &&
_deepEquality.equals(other.storage, storage);
@override
@@ -28,7 +28,7 @@ class MaintenanceIntegrityResponseDto {
(storage.hashCode);
@override
String toString() => 'MaintenanceIntegrityResponseDto[storage=$storage]';
String toString() => 'MaintenanceDetectInstallResponseDto[storage=$storage]';
Map<String, dynamic> toJson() {
final json = <String, dynamic>{};
@@ -36,26 +36,26 @@ class MaintenanceIntegrityResponseDto {
return json;
}
/// Returns a new [MaintenanceIntegrityResponseDto] instance and imports its values from
/// Returns a new [MaintenanceDetectInstallResponseDto] instance and imports its values from
/// [value] if it's a [Map], null otherwise.
// ignore: prefer_constructors_over_static_methods
static MaintenanceIntegrityResponseDto? fromJson(dynamic value) {
upgradeDto(value, "MaintenanceIntegrityResponseDto");
static MaintenanceDetectInstallResponseDto? fromJson(dynamic value) {
upgradeDto(value, "MaintenanceDetectInstallResponseDto");
if (value is Map) {
final json = value.cast<String, dynamic>();
return MaintenanceIntegrityResponseDto(
storage: MaintenanceStorageFolderIntegrityDto.listFromJson(json[r'storage']),
return MaintenanceDetectInstallResponseDto(
storage: MaintenanceDetectInstallStorageFolderDto.listFromJson(json[r'storage']),
);
}
return null;
}
static List<MaintenanceIntegrityResponseDto> listFromJson(dynamic json, {bool growable = false,}) {
final result = <MaintenanceIntegrityResponseDto>[];
static List<MaintenanceDetectInstallResponseDto> listFromJson(dynamic json, {bool growable = false,}) {
final result = <MaintenanceDetectInstallResponseDto>[];
if (json is List && json.isNotEmpty) {
for (final row in json) {
final value = MaintenanceIntegrityResponseDto.fromJson(row);
final value = MaintenanceDetectInstallResponseDto.fromJson(row);
if (value != null) {
result.add(value);
}
@@ -64,12 +64,12 @@ class MaintenanceIntegrityResponseDto {
return result.toList(growable: growable);
}
static Map<String, MaintenanceIntegrityResponseDto> mapFromJson(dynamic json) {
final map = <String, MaintenanceIntegrityResponseDto>{};
static Map<String, MaintenanceDetectInstallResponseDto> mapFromJson(dynamic json) {
final map = <String, MaintenanceDetectInstallResponseDto>{};
if (json is Map && json.isNotEmpty) {
json = json.cast<String, dynamic>(); // ignore: parameter_assignments
for (final entry in json.entries) {
final value = MaintenanceIntegrityResponseDto.fromJson(entry.value);
final value = MaintenanceDetectInstallResponseDto.fromJson(entry.value);
if (value != null) {
map[entry.key] = value;
}
@@ -78,14 +78,14 @@ class MaintenanceIntegrityResponseDto {
return map;
}
// maps a json object with a list of MaintenanceIntegrityResponseDto-objects as value to a dart map
static Map<String, List<MaintenanceIntegrityResponseDto>> mapListFromJson(dynamic json, {bool growable = false,}) {
final map = <String, List<MaintenanceIntegrityResponseDto>>{};
// maps a json object with a list of MaintenanceDetectInstallResponseDto-objects as value to a dart map
static Map<String, List<MaintenanceDetectInstallResponseDto>> mapListFromJson(dynamic json, {bool growable = false,}) {
final map = <String, List<MaintenanceDetectInstallResponseDto>>{};
if (json is Map && json.isNotEmpty) {
// ignore: parameter_assignments
json = json.cast<String, dynamic>();
for (final entry in json.entries) {
map[entry.key] = MaintenanceIntegrityResponseDto.listFromJson(entry.value, growable: growable,);
map[entry.key] = MaintenanceDetectInstallResponseDto.listFromJson(entry.value, growable: growable,);
}
}
return map;

View File

@@ -10,9 +10,9 @@
part of openapi.api;
class MaintenanceStorageFolderIntegrityDto {
/// Returns a new [MaintenanceStorageFolderIntegrityDto] instance.
MaintenanceStorageFolderIntegrityDto({
class MaintenanceDetectInstallStorageFolderDto {
/// Returns a new [MaintenanceDetectInstallStorageFolderDto] instance.
MaintenanceDetectInstallStorageFolderDto({
required this.files,
required this.folder,
required this.readable,
@@ -28,7 +28,7 @@ class MaintenanceStorageFolderIntegrityDto {
bool writable;
@override
bool operator ==(Object other) => identical(this, other) || other is MaintenanceStorageFolderIntegrityDto &&
bool operator ==(Object other) => identical(this, other) || other is MaintenanceDetectInstallStorageFolderDto &&
other.files == files &&
other.folder == folder &&
other.readable == readable &&
@@ -43,7 +43,7 @@ class MaintenanceStorageFolderIntegrityDto {
(writable.hashCode);
@override
String toString() => 'MaintenanceStorageFolderIntegrityDto[files=$files, folder=$folder, readable=$readable, writable=$writable]';
String toString() => 'MaintenanceDetectInstallStorageFolderDto[files=$files, folder=$folder, readable=$readable, writable=$writable]';
Map<String, dynamic> toJson() {
final json = <String, dynamic>{};
@@ -54,15 +54,15 @@ class MaintenanceStorageFolderIntegrityDto {
return json;
}
/// Returns a new [MaintenanceStorageFolderIntegrityDto] instance and imports its values from
/// Returns a new [MaintenanceDetectInstallStorageFolderDto] instance and imports its values from
/// [value] if it's a [Map], null otherwise.
// ignore: prefer_constructors_over_static_methods
static MaintenanceStorageFolderIntegrityDto? fromJson(dynamic value) {
upgradeDto(value, "MaintenanceStorageFolderIntegrityDto");
static MaintenanceDetectInstallStorageFolderDto? fromJson(dynamic value) {
upgradeDto(value, "MaintenanceDetectInstallStorageFolderDto");
if (value is Map) {
final json = value.cast<String, dynamic>();
return MaintenanceStorageFolderIntegrityDto(
return MaintenanceDetectInstallStorageFolderDto(
files: num.parse('${json[r'files']}'),
folder: StorageFolder.fromJson(json[r'folder'])!,
readable: mapValueOfType<bool>(json, r'readable')!,
@@ -72,11 +72,11 @@ class MaintenanceStorageFolderIntegrityDto {
return null;
}
static List<MaintenanceStorageFolderIntegrityDto> listFromJson(dynamic json, {bool growable = false,}) {
final result = <MaintenanceStorageFolderIntegrityDto>[];
static List<MaintenanceDetectInstallStorageFolderDto> listFromJson(dynamic json, {bool growable = false,}) {
final result = <MaintenanceDetectInstallStorageFolderDto>[];
if (json is List && json.isNotEmpty) {
for (final row in json) {
final value = MaintenanceStorageFolderIntegrityDto.fromJson(row);
final value = MaintenanceDetectInstallStorageFolderDto.fromJson(row);
if (value != null) {
result.add(value);
}
@@ -85,12 +85,12 @@ class MaintenanceStorageFolderIntegrityDto {
return result.toList(growable: growable);
}
static Map<String, MaintenanceStorageFolderIntegrityDto> mapFromJson(dynamic json) {
final map = <String, MaintenanceStorageFolderIntegrityDto>{};
static Map<String, MaintenanceDetectInstallStorageFolderDto> mapFromJson(dynamic json) {
final map = <String, MaintenanceDetectInstallStorageFolderDto>{};
if (json is Map && json.isNotEmpty) {
json = json.cast<String, dynamic>(); // ignore: parameter_assignments
for (final entry in json.entries) {
final value = MaintenanceStorageFolderIntegrityDto.fromJson(entry.value);
final value = MaintenanceDetectInstallStorageFolderDto.fromJson(entry.value);
if (value != null) {
map[entry.key] = value;
}
@@ -99,14 +99,14 @@ class MaintenanceStorageFolderIntegrityDto {
return map;
}
// maps a json object with a list of MaintenanceStorageFolderIntegrityDto-objects as value to a dart map
static Map<String, List<MaintenanceStorageFolderIntegrityDto>> mapListFromJson(dynamic json, {bool growable = false,}) {
final map = <String, List<MaintenanceStorageFolderIntegrityDto>>{};
// maps a json object with a list of MaintenanceDetectInstallStorageFolderDto-objects as value to a dart map
static Map<String, List<MaintenanceDetectInstallStorageFolderDto>> mapListFromJson(dynamic json, {bool growable = false,}) {
final map = <String, List<MaintenanceDetectInstallStorageFolderDto>>{};
if (json is Map && json.isNotEmpty) {
// ignore: parameter_assignments
json = json.cast<String, dynamic>();
for (final entry in json.entries) {
map[entry.key] = MaintenanceStorageFolderIntegrityDto.listFromJson(entry.value, growable: growable,);
map[entry.key] = MaintenanceDetectInstallStorageFolderDto.listFromJson(entry.value, growable: growable,);
}
}
return map;

View File

@@ -325,7 +325,7 @@
"/admin/database-backups": {
"get": {
"description": "Get the list of the successful and failed backups",
"operationId": "listBackups",
"operationId": "listDatabaseBackups",
"parameters": [],
"responses": {
"200": {
@@ -350,7 +350,7 @@
"api_key": []
}
],
"summary": "List backups",
"summary": "List database backups",
"tags": [
"Database Backups (admin)"
],
@@ -372,14 +372,14 @@
"/admin/database-backups/start-restore": {
"post": {
"description": "Put Immich into maintenance mode to restore a backup (Immich must not be configured)",
"operationId": "startRestoreFlow",
"operationId": "startDatabaseRestoreFlow",
"parameters": [],
"responses": {
"201": {
"description": ""
}
},
"summary": "Start backup restore flow",
"summary": "Start database backup restore flow",
"tags": [
"Database Backups (admin)"
],
@@ -399,7 +399,7 @@
"/admin/database-backups/upload": {
"post": {
"description": "Uploads .sql/.sql.gz file to restore backup from",
"operationId": "uploadBackup",
"operationId": "uploadDatabaseBackup",
"parameters": [],
"requestBody": {
"content": {
@@ -450,7 +450,7 @@
"/admin/database-backups/{filename}": {
"delete": {
"description": "Delete a backup by its filename",
"operationId": "deleteBackup",
"operationId": "deleteDatabaseBackup",
"parameters": [
{
"name": "filename",
@@ -478,7 +478,7 @@
"api_key": []
}
],
"summary": "Delete backup",
"summary": "Delete database backup",
"tags": [
"Database Backups (admin)"
],
@@ -498,7 +498,7 @@
},
"get": {
"description": "Downloads the database backup file",
"operationId": "downloadBackup",
"operationId": "downloadDatabaseBackup",
"parameters": [
{
"name": "filename",
@@ -534,7 +534,7 @@
"api_key": []
}
],
"summary": "Download backup",
"summary": "Download database backup",
"tags": [
"Database Backups (admin)"
],

View File

@@ -50,14 +50,14 @@ export type SetMaintenanceModeDto = {
action: MaintenanceAction;
restoreBackupFilename?: string;
};
export type MaintenanceStorageFolderIntegrityDto = {
export type MaintenanceDetectInstallStorageFolderDto = {
files: number;
folder: StorageFolder;
readable: boolean;
writable: boolean;
};
export type MaintenanceIntegrityResponseDto = {
storage: MaintenanceStorageFolderIntegrityDto[];
export type MaintenanceDetectInstallResponseDto = {
storage: MaintenanceDetectInstallStorageFolderDto[];
};
export type MaintenanceLoginDto = {
token?: string;
@@ -1874,9 +1874,9 @@ export function unlinkAllOAuthAccountsAdmin(opts?: Oazapfts.RequestOpts) {
}));
}
/**
* List backups
* List database backups
*/
export function listBackups(opts?: Oazapfts.RequestOpts) {
export function listDatabaseBackups(opts?: Oazapfts.RequestOpts) {
return oazapfts.ok(oazapfts.fetchJson<{
status: 200;
data: MaintenanceListBackupsResponseDto;
@@ -1885,9 +1885,9 @@ export function listBackups(opts?: Oazapfts.RequestOpts) {
}));
}
/**
* Start backup restore flow
* Start database backup restore flow
*/
export function startRestoreFlow(opts?: Oazapfts.RequestOpts) {
export function startDatabaseRestoreFlow(opts?: Oazapfts.RequestOpts) {
return oazapfts.ok(oazapfts.fetchText("/admin/database-backups/start-restore", {
...opts,
method: "POST"
@@ -1896,7 +1896,7 @@ export function startRestoreFlow(opts?: Oazapfts.RequestOpts) {
/**
* Upload database backup
*/
export function uploadBackup({ maintenanceUploadBackupDto }: {
export function uploadDatabaseBackup({ maintenanceUploadBackupDto }: {
maintenanceUploadBackupDto: MaintenanceUploadBackupDto;
}, opts?: Oazapfts.RequestOpts) {
return oazapfts.ok(oazapfts.fetchText("/admin/database-backups/upload", oazapfts.multipart({
@@ -1906,9 +1906,9 @@ export function uploadBackup({ maintenanceUploadBackupDto }: {
})));
}
/**
* Delete backup
* Delete database backup
*/
export function deleteBackup({ filename }: {
export function deleteDatabaseBackup({ filename }: {
filename: string;
}, opts?: Oazapfts.RequestOpts) {
return oazapfts.ok(oazapfts.fetchText(`/admin/database-backups/${encodeURIComponent(filename)}`, {
@@ -1917,9 +1917,9 @@ export function deleteBackup({ filename }: {
}));
}
/**
* Download backup
* Download database backup
*/
export function downloadBackup({ filename }: {
export function downloadDatabaseBackup({ filename }: {
filename: string;
}, opts?: Oazapfts.RequestOpts) {
return oazapfts.ok(oazapfts.fetchBlob<{
@@ -1947,7 +1947,7 @@ export function setMaintenanceMode({ setMaintenanceModeDto }: {
export function detectPriorInstall(opts?: Oazapfts.RequestOpts) {
return oazapfts.ok(oazapfts.fetchJson<{
status: 200;
data: MaintenanceIntegrityResponseDto;
data: MaintenanceDetectInstallResponseDto;
}>("/admin/maintenance/detect-install", {
...opts
}));

View File

@@ -25,24 +25,24 @@ export class DatabaseBackupController {
@Get()
@Endpoint({
summary: 'List backups',
summary: 'List database backups',
description: 'Get the list of the successful and failed backups',
history: new HistoryBuilder().added('v2.4.0').alpha('v2.4.0'),
})
@Authenticated({ permission: Permission.Maintenance, admin: true })
listBackups(): Promise<MaintenanceListBackupsResponseDto> {
listDatabaseBackups(): Promise<MaintenanceListBackupsResponseDto> {
return this.service.listBackups();
}
@Get(':filename')
@FileResponse()
@Endpoint({
summary: 'Download backup',
summary: 'Download database backup',
description: 'Downloads the database backup file',
history: new HistoryBuilder().added('v2.4.0').alpha('v2.4.0'),
})
@Authenticated({ permission: Permission.BackupDownload, admin: true })
async downloadBackup(
async downloadDatabaseBackup(
@Param() { filename }: FilenameParamDto,
@Res() res: Response,
@Next() next: NextFunction,
@@ -52,22 +52,22 @@ export class DatabaseBackupController {
@Delete(':filename')
@Endpoint({
summary: 'Delete backup',
summary: 'Delete database backup',
description: 'Delete a backup by its filename',
history: new HistoryBuilder().added('v2.4.0').alpha('v2.4.0'),
})
@Authenticated({ permission: Permission.BackupDelete, admin: true })
async deleteBackup(@Param() { filename }: FilenameParamDto): Promise<void> {
async deleteDatabaseBackup(@Param() { filename }: FilenameParamDto): Promise<void> {
return this.service.deleteBackup(filename);
}
@Post('start-restore')
@Endpoint({
summary: 'Start backup restore flow',
summary: 'Start database backup restore flow',
description: 'Put Immich into maintenance mode to restore a backup (Immich must not be configured)',
history: new HistoryBuilder().added('v2.4.0').alpha('v2.4.0'),
})
async startRestoreFlow(
async startDatabaseRestoreFlow(
@GetLoginDetails() loginDetails: LoginDetails,
@Res({ passthrough: true }) res: Response,
): Promise<void> {
@@ -88,7 +88,7 @@ export class DatabaseBackupController {
history: new HistoryBuilder().added('v2.4.0').alpha('v2.4.0'),
})
@UseInterceptors(FileInterceptor('file'))
uploadBackup(
uploadDatabaseBackup(
@UploadedFile()
file: Express.Multer.File,
): Promise<void> {

View File

@@ -32,6 +32,9 @@ import { sendFile } from 'src/utils/file';
import { respondWithCookie } from 'src/utils/response';
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';
@Controller()
export class MaintenanceWorkerController {
constructor(
@@ -39,11 +42,58 @@ export class MaintenanceWorkerController {
private service: MaintenanceWorkerService,
) {}
/**
* {@link _ServerController.getServerConfig }
*/
@Get('server/config')
getServerConfig(): ServerConfigDto {
return this.service.getSystemConfig();
}
/**
* {@link _DatabaseBackupController.listDatabaseBackups}
*/
@Get('admin/database-backups')
@MaintenanceRoute()
listDatabaseBackups(): Promise<MaintenanceListBackupsResponseDto> {
return this.service.listBackups();
}
/**
* {@link _DatabaseBackupController.downloadDatabaseBackup}
*/
@Get('admin/database-backups/:filename')
@MaintenanceRoute()
async downloadDatabaseBackup(
@Param() { filename }: FilenameParamDto,
@Res() res: Response,
@Next() next: NextFunction,
) {
await sendFile(res, next, () => this.service.downloadBackup(filename), this.logger);
}
/**
* {@link _DatabaseBackupController.deleteDatabaseBackup}
*/
@Delete('admin/database-backups/:filename')
@MaintenanceRoute()
async deleteDatabaseBackup(@Param() { filename }: FilenameParamDto): Promise<void> {
return this.service.deleteBackup(filename);
}
/**
* {@link _DatabaseBackupController.uploadDatabaseBackup}
*/
@Post('admin/database-backups/upload')
@MaintenanceRoute()
@UseInterceptors(FileInterceptor('file'))
uploadDatabaseBackup(
@UploadedFile()
file: Express.Multer.File,
): Promise<void> {
return this.service.uploadBackup(file);
}
@Get('admin/maintenance/status')
maintenanceStatus(@Req() request: Request): Promise<MaintenanceStatusResponseDto> {
return this.service.status(request.cookies[ImmichCookie.MaintenanceToken]);
@@ -74,32 +124,4 @@ export class MaintenanceWorkerController {
setMaintenanceMode(@Body() dto: SetMaintenanceModeDto): void {
void this.service.setAction(dto);
}
@Get('admin/database-backups')
@MaintenanceRoute()
listBackups(): Promise<MaintenanceListBackupsResponseDto> {
return this.service.listBackups();
}
@Get('admin/database-backups/:filename')
@MaintenanceRoute()
async downloadBackup(@Param() { filename }: FilenameParamDto, @Res() res: Response, @Next() next: NextFunction) {
await sendFile(res, next, () => this.service.downloadBackup(filename), this.logger);
}
@Delete('admin/database-backups/:filename')
@MaintenanceRoute()
async deleteBackup(@Param() { filename }: FilenameParamDto): Promise<void> {
return this.service.deleteBackup(filename);
}
@Post('admin/database-backups/upload')
@MaintenanceRoute()
@UseInterceptors(FileInterceptor('file'))
uploadBackup(
@UploadedFile()
file: Express.Multer.File,
): Promise<void> {
return this.service.uploadBackup(file);
}
}

View File

@@ -3,9 +3,9 @@
import { openFilePicker } from '$lib/utils/file-uploader';
import { handleError } from '$lib/utils/handle-error';
import {
deleteBackup,
deleteDatabaseBackup,
getBaseUrl,
listBackups,
listDatabaseBackups,
MaintenanceAction,
setMaintenanceMode,
type MaintenanceUploadBackupDto,
@@ -55,7 +55,7 @@
onMount(async () => {
if (!props.backups) {
const result = await listBackups();
const result = await listDatabaseBackups();
backups = mapBackups(result.backups);
}
});
@@ -92,7 +92,7 @@
try {
deleting.add(filename);
await deleteBackup({
await deleteDatabaseBackup({
filename,
});
@@ -151,7 +151,7 @@
uploadProgress = 1;
const { backups: newList } = await listBackups();
const { backups: newList } = await listDatabaseBackups();
backups = mapBackups(newList);
} catch (error) {
handleError(error, $t('admin.maintenance_upload_backup_error'));

View File

@@ -3,7 +3,7 @@
import { AppRoute } from '$lib/constants';
import { websocketStore } from '$lib/stores/websocket';
import { handleError } from '$lib/utils/handle-error';
import { startRestoreFlow } from '@immich/sdk';
import { startDatabaseRestoreFlow } from '@immich/sdk';
import { Button, Heading, Stack } from '@immich/ui';
import { t } from 'svelte-i18n';
@@ -13,7 +13,7 @@
isMaintenanceMode: true,
});
await startRestoreFlow();
await startDatabaseRestoreFlow();
} catch (error) {
handleError(error, $t('admin.maintenance_start_error'));
}

View File

@@ -1,11 +1,11 @@
import { authenticate } from '$lib/utils/auth';
import { getFormatter } from '$lib/utils/i18n';
import { listBackups } from '@immich/sdk';
import { listDatabaseBackups } from '@immich/sdk';
import type { PageLoad } from './$types';
export const load = (async ({ url }) => {
await authenticate(url, { admin: true });
const { backups } = await listBackups();
const { backups } = await listDatabaseBackups();
const $t = await getFormatter();
return {