146 lines
4.0 KiB
Swift
146 lines
4.0 KiB
Swift
//
|
|
// NameFile.swift
|
|
// CapFinder
|
|
//
|
|
// Created by User on 23.04.18.
|
|
// Copyright © 2018 User. All rights reserved.
|
|
//
|
|
|
|
import Foundation
|
|
import SwiftyDropbox
|
|
|
|
final class NameFile: Logger {
|
|
|
|
static let logToken = "[NameFile]"
|
|
|
|
/// The name of the file
|
|
private static let fileName = "names.txt"
|
|
|
|
private static let path = "/" + fileName
|
|
|
|
/// The url of the file on disk
|
|
private static let url = DiskManager.documentsDirectory.appendingPathComponent(fileName)
|
|
|
|
private static let fm = FileManager.default
|
|
|
|
// MARK: - Reading from disk
|
|
|
|
/// Indicates if the name list was written to disk
|
|
private static var nameFileExistsOnDisk: Bool {
|
|
return fm.fileExists(atPath: url.path)
|
|
}
|
|
|
|
// MARK: - Public API
|
|
|
|
@discardableResult static func save(names: String) -> Bool {
|
|
let data = names.data(using: .utf8)!
|
|
return save(names: data)
|
|
}
|
|
|
|
static func saveAndUpload(names: String, completion: @escaping (Bool) -> Void) {
|
|
let data = names.data(using: .utf8)!
|
|
guard save(names: data) else {
|
|
return
|
|
}
|
|
|
|
let client = DropboxController.client
|
|
client.files.upload(path: path, mode: .overwrite, input: data).response { _ , error in
|
|
if let error = error {
|
|
self.error("Error uploading name list: \(error)")
|
|
completion(false)
|
|
} else {
|
|
self.event("Uploaded name list")
|
|
completion(true)
|
|
}
|
|
}
|
|
}
|
|
|
|
// MARK: - Private
|
|
|
|
/// The content of the name file as a String
|
|
private static var content: String? {
|
|
do {
|
|
return try String(contentsOf: url, encoding: .utf8)
|
|
} catch {
|
|
self.error("Error reading \(url): \(error)")
|
|
return nil
|
|
}
|
|
}
|
|
|
|
/**
|
|
Save the name file to disk
|
|
- parameter names: The new name file content
|
|
- returns: True, if the data was written to disk
|
|
*/
|
|
@discardableResult private static func save(names: Data) -> Bool {
|
|
do {
|
|
try names.write(to: url, options: .atomic)
|
|
event("Name file saved to disk")
|
|
return true
|
|
} catch {
|
|
self.error("Could not save names to file: \(error)")
|
|
return false
|
|
}
|
|
}
|
|
|
|
|
|
static func makeAvailable(completion: ((String?) -> Void)? = nil) {
|
|
if nameFileExistsOnDisk {
|
|
completion?(self.content)
|
|
} else {
|
|
download() { success in
|
|
guard success else {
|
|
completion?(nil)
|
|
return
|
|
}
|
|
completion?(self.content)
|
|
}
|
|
}
|
|
}
|
|
|
|
/// The data of the name list
|
|
private static var data: Data? {
|
|
guard nameFileExistsOnDisk else { return nil }
|
|
do {
|
|
return try Data(contentsOf: url)
|
|
} catch {
|
|
self.error("Could not read data from \(url): \(error)")
|
|
return nil
|
|
}
|
|
}
|
|
|
|
/**
|
|
Delete the file on disk
|
|
- returns: True, if the file no longer exists on disk
|
|
*/
|
|
@discardableResult private static func delete() -> Bool {
|
|
guard nameFileExistsOnDisk else {
|
|
event("No name file to delete")
|
|
return true
|
|
}
|
|
|
|
do {
|
|
try fm.removeItem(at: url)
|
|
} catch {
|
|
self.error("Could not delete name file: \(error)")
|
|
return false
|
|
}
|
|
event("Deleted name file on disk")
|
|
return true
|
|
}
|
|
|
|
private static func download(completion: ((Bool) -> Void)? = nil) {
|
|
let client = DropboxController.client
|
|
event("Downloading names from Dropbox")
|
|
client.files.download(path: path).response { response, error in
|
|
guard let data = response?.1 else {
|
|
self.error("Error downloading file: \(error!)")
|
|
completion?(false)
|
|
return
|
|
}
|
|
self.event("Downloaded name file")
|
|
completion?(NameFile.save(names: data))
|
|
}
|
|
}
|
|
}
|