Files
Immich/web/src/lib/services/integrity.service.ts
T

126 lines
3.4 KiB
TypeScript

import { eventManager } from '#lib/managers/event-manager.svelte.ts';
import { Route } from '#lib/route.ts';
import { handleError } from '#lib/utils/handle-error.ts';
import { getFormatter } from '#lib/utils/i18n.ts';
import { IntegrityReport, ManualJobName, createJob, deleteIntegrityReport } from '@immich/sdk';
import { modalManager, toastManager, type ActionItem } from '@immich/ui';
import { mdiDownload, mdiTrashCanOutline } from '@mdi/js';
import type { MessageFormatter } from 'svelte-i18n';
import { goto } from '$app/navigation';
export const getIntegrityReportActions = ($t: MessageFormatter, reportType: IntegrityReport) => {
const Download: ActionItem = {
title: $t('admin.download_csv'),
icon: mdiDownload,
onAction: () => goto(Route.integrityReportCsv(reportType)),
};
const Delete: ActionItem = {
title: $t('trash_page_delete_all'),
icon: mdiTrashCanOutline,
color: 'danger',
onAction: () => handleRemoveAllIntegrityReportItems(reportType),
};
return { Download, Delete };
};
export const getIntegrityReportItemActions = ($t: MessageFormatter, reportId: string, reportType: IntegrityReport) => {
const Download: ActionItem = {
title: $t('download'),
icon: mdiDownload,
onAction: () => goto(Route.integrityReportFile(reportId)),
$if: () => reportType === IntegrityReport.UntrackedFile || reportType === IntegrityReport.ChecksumMismatch,
};
const Delete: ActionItem = {
title: $t('delete'),
icon: mdiTrashCanOutline,
color: 'danger',
onAction: () => handleRemoveIntegrityReportItem(reportId),
};
return { Download, Delete };
};
export const handleRemoveAllIntegrityReportItems = async (reportType: IntegrityReport) => {
const $t = await getFormatter();
const confirm = await modalManager.showDialog({
confirmText: $t('delete'),
});
if (!confirm) {
return;
}
let name: ManualJobName;
switch (reportType) {
case IntegrityReport.UntrackedFile: {
name = ManualJobName.IntegrityUntrackedFilesDeleteAll;
break;
}
case IntegrityReport.MissingFile: {
name = ManualJobName.IntegrityMissingFilesDeleteAll;
break;
}
case IntegrityReport.ChecksumMismatch: {
name = ManualJobName.IntegrityChecksumMismatchDeleteAll;
break;
}
}
try {
eventManager.emit('IntegrityReportDeleteStatus', {
type: reportType,
isDeleting: true,
});
await createJob({ jobCreateDto: { name } });
toastManager.success($t('admin.job_created'));
eventManager.emit('IntegrityReportDeleted', {
type: reportType,
});
} catch (error) {
handleError(error, $t('failed_to_delete_file'));
eventManager.emit('IntegrityReportDeleteStatus', {
type: reportType,
isDeleting: false,
});
}
};
export const handleRemoveIntegrityReportItem = async (reportId: string) => {
const $t = await getFormatter();
const confirm = await modalManager.showDialog({
confirmText: $t('delete'),
});
if (!confirm) {
return;
}
try {
eventManager.emit('IntegrityReportDeleteStatus', {
id: reportId,
isDeleting: true,
});
await deleteIntegrityReport({
id: reportId,
});
eventManager.emit('IntegrityReportDeleted', {
id: reportId,
});
} catch (error) {
handleError(error, $t('failed_to_delete_file'));
eventManager.emit('IntegrityReportDeleteStatus', {
id: reportId,
isDeleting: false,
});
}
};