refactor: begin moving code into web//services

This commit is contained in:
izzy
2026-01-06 12:20:01 +00:00
parent 428efa67cc
commit 168e355b22
5 changed files with 106 additions and 92 deletions
@@ -1,16 +1,10 @@
<script lang="ts">
import { handleDeleteDatabaseBackup, handleRestoreDatabaseBackup } from '$lib/services/database-backups.service';
import { locale } from '$lib/stores/preferences.store';
import { uploadRequest } from '$lib/utils';
import { openFilePicker } from '$lib/utils/file-uploader';
import { handleError } from '$lib/utils/handle-error';
import {
deleteDatabaseBackup,
getBaseUrl,
listDatabaseBackups,
MaintenanceAction,
setMaintenanceMode,
type DatabaseBackupUploadDto,
} from '@immich/sdk';
import { getBaseUrl, listDatabaseBackups, type DatabaseBackupUploadDto } from '@immich/sdk';
import {
Button,
Card,
@@ -18,7 +12,6 @@
HStack,
IconButton,
menuManager,
modalManager,
ProgressBar,
Stack,
Text,
@@ -61,51 +54,14 @@
}
});
async function restore(filename: string) {
const confirm = await modalManager.showDialog({
confirmText: $t('restore'),
title: $t('admin.maintenance_restore_backup'),
prompt: $t('admin.maintenance_restore_backup_description'),
});
if (confirm) {
try {
await setMaintenanceMode({
setMaintenanceModeDto: {
action: MaintenanceAction.RestoreDatabase,
restoreBackupFilename: filename,
},
});
} catch (error) {
handleError(error, $t('admin.maintenance_start_error'));
}
}
}
async function remove(filename: string) {
const confirm = await modalManager.showDialog({
confirmText: $t('delete'),
title: $t('admin.maintenance_delete_backup'),
prompt: $t('admin.maintenance_delete_backup_description'),
});
deleting.add(filename);
if (confirm) {
try {
deleting.add(filename);
await deleteDatabaseBackup({
databaseBackupDeleteDto: {
backups: [filename],
},
});
backups = backups.filter((backup) => backup.filename !== filename);
} catch (error) {
handleError(error, $t('admin.maintenance_delete_error'));
} finally {
deleting.delete(filename);
}
if (await handleDeleteDatabaseBackup(filename)) {
backups = backups.filter((backup) => backup.filename !== filename);
}
deleting.delete(filename);
}
function download(filename: string) {
@@ -191,8 +147,10 @@
{/if}
</Stack>
<Button size="small" disabled={deleting.has(backup.filename)} onclick={() => restore(backup.filename)}
>{$t('restore')}</Button
<Button
size="small"
disabled={deleting.has(backup.filename)}
onclick={() => handleRestoreDatabaseBackup(backup.filename)}>{$t('restore')}</Button
>
<IconButton
@@ -0,0 +1,53 @@
import { handleError } from '$lib/utils/handle-error';
import { getFormatter } from '$lib/utils/i18n';
import { deleteDatabaseBackup, MaintenanceAction, setMaintenanceMode } from '@immich/sdk';
import { modalManager } from '@immich/ui';
export const handleRestoreDatabaseBackup = async (filename: string) => {
const $t = await getFormatter();
const confirm = await modalManager.showDialog({
confirmText: $t('restore'),
title: $t('admin.maintenance_restore_backup'),
prompt: $t('admin.maintenance_restore_backup_description'),
});
if (!confirm) {
return;
}
try {
await setMaintenanceMode({
setMaintenanceModeDto: {
action: MaintenanceAction.RestoreDatabase,
restoreBackupFilename: filename,
},
});
} catch (error) {
handleError(error, $t('admin.maintenance_start_error'));
}
};
export const handleDeleteDatabaseBackup = async (...filenames: string[]) => {
const $t = await getFormatter();
const confirm = await modalManager.showDialog({
confirmText: $t('delete'),
title: $t('admin.maintenance_delete_backup'),
prompt: $t('admin.maintenance_delete_backup_description'),
});
if (!confirm) {
return;
}
try {
await deleteDatabaseBackup({
databaseBackupDeleteDto: {
backups: filenames,
},
});
return true;
} catch (error) {
handleError(error, $t('admin.maintenance_delete_error'));
}
};
@@ -0,0 +1,31 @@
import { handleError } from '$lib/utils/handle-error';
import { getFormatter } from '$lib/utils/i18n';
import { MaintenanceAction, setMaintenanceMode, type SetMaintenanceModeDto } from '@immich/sdk';
import type { ActionItem } from '@immich/ui';
import { mdiProgressWrench } from '@mdi/js';
import type { MessageFormatter } from 'svelte-i18n';
export const getMaintenanceAdminActions = ($t: MessageFormatter) => {
const StartMaintenance: ActionItem = {
title: $t('admin.maintenance_start'),
onAction: () =>
handleSetMaintenanceMode({
action: MaintenanceAction.Start,
}),
icon: mdiProgressWrench,
};
return { StartMaintenance };
};
export const handleSetMaintenanceMode = async (dto: SetMaintenanceModeDto) => {
const $t = await getFormatter();
try {
await setMaintenanceMode({
setMaintenanceModeDto: dto,
});
} catch (error) {
handleError(error, $t('admin.maintenance_start_error'));
}
};
+5 -26
View File
@@ -4,9 +4,8 @@
import SettingAccordionState from '$lib/components/shared-components/settings/setting-accordion-state.svelte';
import SettingAccordion from '$lib/components/shared-components/settings/setting-accordion.svelte';
import { QueryParameter } from '$lib/constants';
import { handleError } from '$lib/utils/handle-error';
import { MaintenanceAction, setMaintenanceMode } from '@immich/sdk';
import { mdiProgressWrench, mdiRefresh } from '@mdi/js';
import { getMaintenanceAdminActions } from '$lib/services/maintenance.service';
import { mdiRefresh } from '@mdi/js';
import { t } from 'svelte-i18n';
import type { PageData } from './$types';
@@ -14,31 +13,11 @@
data: PageData;
};
let { data }: Props = $props();
async function switchToMaintenance() {
try {
await setMaintenanceMode({
setMaintenanceModeDto: {
action: MaintenanceAction.Start,
},
});
} catch (error) {
handleError(error, $t('admin.maintenance_start_error'));
}
}
const { data }: Props = $props();
const { StartMaintenance } = $derived(getMaintenanceAdminActions($t));
</script>
<AdminPageLayout
breadcrumbs={[{ title: data.meta.title }]}
actions={[
{
title: $t('admin.maintenance_start'),
onAction: switchToMaintenance,
icon: mdiProgressWrench,
},
]}
>
<AdminPageLayout breadcrumbs={[{ title: data.meta.title }]} actions={[StartMaintenance]}>
<section id="setting-content" class="flex place-content-center sm:mx-4">
<section class="w-full pb-28 sm:w-5/6 md:w-[850px]">
<SettingAccordionState queryParam={QueryParameter.IS_OPEN}>
+6 -13
View File
@@ -2,9 +2,9 @@
import AuthPageLayout from '$lib/components/layouts/AuthPageLayout.svelte';
import MaintenanceRestoreFlow from '$lib/components/maintenance/MaintenanceRestoreFlow.svelte';
import FormatMessage from '$lib/elements/FormatMessage.svelte';
import { handleSetMaintenanceMode } from '$lib/services/maintenance.service';
import { maintenanceStore } from '$lib/stores/maintenance.store';
import { handleError } from '$lib/utils/handle-error';
import { MaintenanceAction, setMaintenanceMode } from '@immich/sdk';
import { MaintenanceAction } from '@immich/sdk';
import { Button, Heading, Link, ProgressBar, Scrollable, Text } from '@immich/ui';
import { t } from 'svelte-i18n';
@@ -17,17 +17,10 @@
history.replaceState({}, document.title, url);
}
async function end() {
try {
await setMaintenanceMode({
setMaintenanceModeDto: {
action: MaintenanceAction.End,
},
});
} catch (error) {
handleError(error, $t('maintenance_end_error'));
}
}
const end = () =>
handleSetMaintenanceMode({
action: MaintenanceAction.End,
});
let error = $derived(
$status?.error