import Foundation extension Content { func saveToDisk() { //print("Starting save") for page in pages { storage.save(pageMetadata: page.pageFile, for: page.id) } for post in posts { storage.save(post: post.postFile, for: post.id) } for tag in tags { storage.save(tagMetadata: tag.tagFile, for: tag.id) } storage.save(websiteData: websiteData.dataFile) do { try storage.deletePostFiles(notIn: posts.map { $0.id }) try storage.deletePageFiles(notIn: pages.map { $0.id }) try storage.deleteTagFiles(notIn: tags.map { $0.id }) let allFiles = files.map { $0.uniqueId } + images.map { $0.id } + videos try storage.deleteFiles(notIn: allFiles) } catch { print("Failed to remove unused files: \(error)") } // TODO: Remove all files that are no longer in use (they belong to deleted items) //print("Finished save") } } private extension Page { var pageFile: PageFile { .init(isDraft: isDraft, tags: tags.map { $0.id }, createdDate: createdDate, startDate: startDate, endDate: hasEndDate ? endDate : nil, german: german.pageFile, english: english.pageFile) } } private extension LocalizedPage { var pageFile: LocalizedPageFile { .init(url: urlString, files: files.sorted(), externalFiles: externalFiles.sorted(), requiredFiles: requiredFiles.sorted(), title: title, linkPreviewImage: linkPreviewImage, linkPreviewTitle: linkPreviewTitle, linkPreviewDescription: linkPreviewDescription, lastModifiedDate: lastModified, originalURL: originalUrl) } } private extension Post { var postFile: PostFile { .init( isDraft: isDraft, createdDate: createdDate, startDate: startDate, endDate: hasEndDate ? endDate : nil, tags: tags.map { $0.id }, german: german.postFile, english: english.postFile, linkedPageId: linkedPage?.id) } } private extension LocalizedPost { var postFile: LocalizedPostFile { .init(images: images.map { $0.id }, title: title.nonEmpty, content: content, lastModifiedDate: lastModified, linkPreviewImage: linkPreviewImage?.id, linkPreviewTitle: linkPreviewTitle, linkPreviewDescription: linkPreviewDescription) } } private extension Tag { var tagFile: TagFile { .init(id: id, isVisible: isVisible, german: german.tagFile, english: english.tagFile) } } private extension LocalizedTag { var tagFile: LocalizedTagFile { .init(urlComponent: urlComponent, name: name, subtitle: subtitle, description: description, thumbnail: thumbnail?.id, originalURL: originalUrl) } } private extension WebsiteData { var dataFile: WebsiteDataFile { .init( navigationTags: navigationTags.map { $0.id }, german: german.dataFile, english: english.dataFile) } } private extension LocalizedWebsiteData { var dataFile: LocalizedWebsiteDataFile { .init(title: title, description: description, iconDescription: iconDescription) } }