From 98d6e2f03e9bfd733e46cf17717f4f948dcdee8d Mon Sep 17 00:00:00 2001 From: Aman Harwara Date: Sat, 9 Dec 2023 20:05:43 +0530 Subject: [PATCH] refactor: cleanup uploaded files if parsing fails --- packages/ui-services/src/Import/Converter.ts | 3 +++ .../EvernoteConverter/EvernoteConverter.ts | 15 ++++++++++++++- packages/ui-services/src/Import/Importer.ts | 16 ++++++++++++++-- .../Application/Dependencies/WebDependencies.ts | 1 + 4 files changed, 32 insertions(+), 3 deletions(-) diff --git a/packages/ui-services/src/Import/Converter.ts b/packages/ui-services/src/Import/Converter.ts index 5780b78c577..b4de0dc1eb9 100644 --- a/packages/ui-services/src/Import/Converter.ts +++ b/packages/ui-services/src/Import/Converter.ts @@ -24,6 +24,7 @@ export interface Converter { item: DecryptedItemInterface, itemToLink: DecryptedItemInterface, ): Promise + cleanupItems(items: DecryptedItemInterface[]): Promise }, ): Promise } @@ -54,3 +55,5 @@ export type LinkItemsFn = ( item: DecryptedItemInterface, itemToLink: DecryptedItemInterface, ) => Promise + +export type CleanupItemsFn = (items: DecryptedItemInterface[]) => Promise diff --git a/packages/ui-services/src/Import/EvernoteConverter/EvernoteConverter.ts b/packages/ui-services/src/Import/EvernoteConverter/EvernoteConverter.ts index 2cbe28eda65..4894c75a9a8 100644 --- a/packages/ui-services/src/Import/EvernoteConverter/EvernoteConverter.ts +++ b/packages/ui-services/src/Import/EvernoteConverter/EvernoteConverter.ts @@ -35,7 +35,17 @@ export class EvernoteConverter implements Converter { convert: Converter['convert'] = async ( file, - { insertNote, insertTag, linkItems, canUploadFiles, canUseSuper, convertHTMLToSuper, readFileAsText, uploadFile }, + { + insertNote, + insertTag, + linkItems, + canUploadFiles, + canUseSuper, + convertHTMLToSuper, + readFileAsText, + uploadFile, + cleanupItems, + }, ) => { const content = await readFileAsText(file) @@ -50,6 +60,7 @@ export class EvernoteConverter implements Converter { } for (const [index, xmlNote] of Array.from(xmlNotes).entries()) { + const filesToPotentiallyCleanup: FileItem[] = [] try { const title = xmlNote.getElementsByTagName('title')[0].textContent const created = xmlNote.getElementsByTagName('created')[0]?.textContent @@ -86,6 +97,7 @@ export class EvernoteConverter implements Converter { canUploadFiles, uploadFile, ) + filesToPotentiallyCleanup.push(...uploadedFiles) // Some notes have tags that contain separate tags with text // which causes broken paragraphs in the note. @@ -140,6 +152,7 @@ export class EvernoteConverter implements Converter { } } catch (error) { console.error(error) + cleanupItems(filesToPotentiallyCleanup).catch(console.error) continue } } diff --git a/packages/ui-services/src/Import/Importer.ts b/packages/ui-services/src/Import/Importer.ts index 823a9ca420a..6198192c83b 100644 --- a/packages/ui-services/src/Import/Importer.ts +++ b/packages/ui-services/src/Import/Importer.ts @@ -23,12 +23,13 @@ import { SNNote, SNTag, TagContent, + isFile, isNote, } from '@standardnotes/models' import { HTMLConverter } from './HTMLConverter/HTMLConverter' import { SuperConverter } from './SuperConverter/SuperConverter' -import { Converter, InsertNoteFn, InsertTagFn, LinkItemsFn, UploadFileFn } from './Converter' -import { SuperConverterServiceInterface } from '@standardnotes/files' +import { CleanupItemsFn, Converter, InsertNoteFn, InsertTagFn, LinkItemsFn, UploadFileFn } from './Converter' +import { FilesClientInterface, SuperConverterServiceInterface } from '@standardnotes/files' import { ContentType } from '@standardnotes/domain-core' export const BYTES_IN_ONE_MEGABYTE = 1_000_000 @@ -59,6 +60,7 @@ export class Importer { ): Promise }, private _generateUuid: GenerateUuid, + private files: FilesClientInterface, ) { this.registerNativeConverters() } @@ -190,6 +192,15 @@ export class Importer { await this.linkingController.linkItems(item, itemToLink, false) } + cleanupItems: CleanupItemsFn = async (items) => { + for (const item of items) { + if (isFile(item)) { + await this.files.deleteFile(item) + } + await this.mutator.deleteItems([item]) + } + } + canUseSuper = (): boolean => { return ( this.features.getFeatureStatus( @@ -244,6 +255,7 @@ export class Importer { convertMarkdownToSuper: this.convertMarkdownToSuper, readFileAsText, linkItems: this.linkItems, + cleanupItems: this.cleanupItems, }) } diff --git a/packages/web/src/javascripts/Application/Dependencies/WebDependencies.ts b/packages/web/src/javascripts/Application/Dependencies/WebDependencies.ts index a2468cbc08a..8d2ba4b8074 100644 --- a/packages/web/src/javascripts/Application/Dependencies/WebDependencies.ts +++ b/packages/web/src/javascripts/Application/Dependencies/WebDependencies.ts @@ -68,6 +68,7 @@ export class WebDependencies extends DependencyContainer { this.get(Web_TYPES.FilesController), this.get(Web_TYPES.LinkingController), application.generateUuid, + application.files, ) })