From c2bffaa559c6e1135d7e9a1fea6e7edbb65c2d60 Mon Sep 17 00:00:00 2001 From: Laurent Date: Mon, 11 Mar 2024 21:06:54 +0100 Subject: [PATCH] Adds method to delete all collections --- LeStorage/MicroStorage.swift | 4 +-- LeStorage/Store.swift | 6 ++++ LeStorage/StoredCollection.swift | 10 ++++++- LeStorage/Utils/FileUtils.swift | 49 +++++++++++++++++--------------- 4 files changed, 43 insertions(+), 26 deletions(-) diff --git a/LeStorage/MicroStorage.swift b/LeStorage/MicroStorage.swift index 6f09975..2881852 100644 --- a/LeStorage/MicroStorage.swift +++ b/LeStorage/MicroStorage.swift @@ -19,7 +19,7 @@ public class MicroStorage { init() { var instance: T? = nil do { - let url = try FileUtils.documentDirectoryURLForFileName(T.fileName) + let url = try FileUtils.pathForFileInDocumentDirectory(T.fileName) if FileManager.default.fileExists(atPath: url.absoluteString) { let jsonString = try FileUtils.readDocumentFile(fileName: T.fileName) if let decoded: T = try jsonString.decode() { @@ -62,7 +62,7 @@ public class OptionalStorage { public init(fileName: String) { self.fileName = fileName do { - let url = try FileUtils.documentDirectoryURLForFileName(fileName) + let url = try FileUtils.pathForFileInDocumentDirectory(fileName) if FileManager.default.fileExists(atPath: url.path) { let jsonString = try FileUtils.readDocumentFile(fileName: fileName) if let decoded: T = try jsonString.decode() { diff --git a/LeStorage/Store.swift b/LeStorage/Store.swift index dd598f0..e7a9ba9 100644 --- a/LeStorage/Store.swift +++ b/LeStorage/Store.swift @@ -238,4 +238,10 @@ public class Store { return try await service.get() } + public func reset() { + for collection in self._collections.values { + collection.reset() + } + } + } diff --git a/LeStorage/StoredCollection.swift b/LeStorage/StoredCollection.swift index f3155c9..4ad0c41 100644 --- a/LeStorage/StoredCollection.swift +++ b/LeStorage/StoredCollection.swift @@ -17,6 +17,7 @@ protocol SomeCollection: Identifiable { func allItems() -> [any Storable] func deleteById(_ id: String) throws func deleteApiCallById(_ id: String) throws + func reset() } extension Notification.Name { @@ -82,7 +83,7 @@ public class StoredCollection: RandomAccessCollection, SomeCollecti /// Migrates if necessary and asynchronously decodes the json file fileprivate func _load() { do { - let url = try FileUtils.documentDirectoryURLForFileName(T.fileName()) + let url = try FileUtils.pathForFileInDocumentDirectory(T.fileName()) if FileManager.default.fileExists(atPath: url.path()) { if self.asynchronousIO { @@ -245,6 +246,13 @@ public class StoredCollection: RandomAccessCollection, SomeCollecti Logger.log("End write") } + func reset() { + try? FileUtils.removeFileFromDocumentDirectory(fileName: T.fileName()) + if let apiCallsCollection = self.apiCallsCollection { + apiCallsCollection.reset() + } + } + // MARK: - Synchronization fileprivate func _callForInstance(_ instance: T, method: Method) throws -> ApiCall? { diff --git a/LeStorage/Utils/FileUtils.swift b/LeStorage/Utils/FileUtils.swift index d9b1ddc..a2f3969 100644 --- a/LeStorage/Utils/FileUtils.swift +++ b/LeStorage/Utils/FileUtils.swift @@ -19,23 +19,15 @@ class FileUtils { } static func readDocumentFile(fileName: String) throws -> String { - let fileURL: URL = try self.documentDirectoryURLForFileName(fileName) -// Logger.log("url = \(fileURL.absoluteString)") + let fileURL: URL = try self.pathForFileInDocumentDirectory(fileName) return try String(contentsOf: fileURL, encoding: .utf8) - -// if let dir: URL = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first { -// let fileURL: URL = dir.appendingPathComponent(fileName) -// Logger.log("url = \(fileURL.absoluteString)") -// return try String(contentsOf: fileURL, encoding: .utf8) -// } -// throw FileError.documentDirectoryNotFound } static func readFile(fileURL: URL) throws -> String { return try String(contentsOf: fileURL, encoding: .utf8) } - static func documentDirectoryURLForFileName(_ fileName: String) throws -> URL { + static func pathForFileInDocumentDirectory(_ fileName: String) throws -> URL { if let dir: URL = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first { return dir.appendingPathComponent(fileName) } @@ -43,23 +35,34 @@ class FileUtils { } static func writeToDocumentDirectory(content: String, fileName: String) throws -> URL { + let fileURL = try self.pathForFileInDocumentDirectory(fileName) + try content.write(to: fileURL, atomically: false, encoding: .utf8) + return fileURL - if let dir: URL = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first { - let fileURL: URL = dir.appendingPathComponent(fileName) - try content.write(to: fileURL, atomically: false, encoding: .utf8) - return fileURL - } - throw FileError.documentDirectoryNotFound +// if let dir: URL = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first { +// let fileURL: URL = dir.appendingPathComponent(fileName) +// try content.write(to: fileURL, atomically: false, encoding: .utf8) +// return fileURL +// } +// throw FileError.documentDirectoryNotFound } @discardableResult static func writeToDocumentDirectory(data: Data, fileName: String) throws -> URL { - - if let dir: URL = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first { - let fileURL: URL = dir.appendingPathComponent(fileName) - try data.write(to: fileURL) - return fileURL - } - throw FileError.documentDirectoryNotFound + let fileURL = try self.pathForFileInDocumentDirectory(fileName) + try data.write(to: fileURL) + return fileURL + +// if let dir: URL = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first { +// let fileURL: URL = dir.appendingPathComponent(fileName) +// try data.write(to: fileURL) +// return fileURL +// } +// throw FileError.documentDirectoryNotFound + } + + static func removeFileFromDocumentDirectory(fileName: String) throws { + let fileURL = try self.pathForFileInDocumentDirectory(fileName) + try FileManager.default.removeItem(atPath: fileURL.path()) } }