182 lines
4.8 KiB
Swift
182 lines
4.8 KiB
Swift
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(settings: settings.file)
|
|
|
|
let imageDescriptions: [ImageDescriptions] = images.sorted().compactMap { image in
|
|
guard !image.englishDescription.isEmpty || !image.germanDescription.isEmpty else {
|
|
return nil
|
|
}
|
|
return ImageDescriptions(
|
|
imageId: image.id,
|
|
german: image.germanDescription.nonEmpty,
|
|
english: image.englishDescription.nonEmpty)
|
|
}
|
|
|
|
storage.save(imageDescriptions: imageDescriptions)
|
|
|
|
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 }
|
|
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 NavigationBarSettings {
|
|
|
|
var file: NavigationBarSettingsFile {
|
|
.init(navigationIconPath: iconPath,
|
|
navigationTags: tags.map { $0.id })
|
|
}
|
|
}
|
|
|
|
extension Settings {
|
|
|
|
var file: SettingsFile {
|
|
.init(
|
|
outputDirectoryPath: outputDirectoryPath,
|
|
navigationBar: navigationBar.file,
|
|
posts: posts.file,
|
|
pages: pages.file,
|
|
german: german.file,
|
|
english: english.file)
|
|
}
|
|
}
|
|
|
|
private extension PostSettings {
|
|
|
|
var file: PostSettingsFile {
|
|
.init(postsPerPage: postsPerPage,
|
|
contentWidth: contentWidth)
|
|
}
|
|
}
|
|
|
|
private extension PageSettings {
|
|
|
|
var file: PageSettingsFile {
|
|
.init(pageUrlPrefix: pageUrlPrefix,
|
|
contentWidth: contentWidth)
|
|
}
|
|
}
|
|
|
|
private extension LocalizedSettings {
|
|
|
|
var file: LocalizedSettingsFile {
|
|
.init(navigationBarIconDescription: navigationBarIconDescription,
|
|
posts: posts.file)
|
|
}
|
|
}
|
|
|
|
private extension LocalizedPostSettings {
|
|
|
|
var file: LocalizedPostSettingsFile {
|
|
.init(
|
|
feedTitle: title,
|
|
feedDescription: description,
|
|
feedUrlPrefix: feedUrlPrefix)
|
|
}
|
|
}
|