93 lines
2.8 KiB
Swift
93 lines
2.8 KiB
Swift
import Foundation
|
|
import SwiftData
|
|
|
|
@Model
|
|
final class SyncJob {
|
|
var id: UUID
|
|
var name: String
|
|
var sourcePath: String
|
|
var destinationPath: String
|
|
var isRemote: Bool
|
|
var remoteHost: String
|
|
var remoteUser: String
|
|
var remotePort: Int
|
|
var sshKeyPath: String
|
|
var archive: Bool
|
|
var compress: Bool
|
|
var deleteExtraneous: Bool
|
|
var preservePermissions: Bool
|
|
var preserveExtendedAttributes: Bool
|
|
var showProgress: Bool
|
|
var exclusionsText: String
|
|
var additionalArguments: String
|
|
var isEnabled: Bool
|
|
var createdAt: Date
|
|
var updatedAt: Date
|
|
var lastRunAt: Date?
|
|
var lastExitCode: Int?
|
|
var scheduleEnabled: Bool = false
|
|
var scheduleKindRaw: String = SyncScheduleKind.manual.rawValue
|
|
var scheduleStartAt: Date = Date().addingTimeInterval(3600)
|
|
var scheduleIntervalMinutes: Int = 30
|
|
var nextRunAt: Date? = nil
|
|
var watchEnabled: Bool = false
|
|
var watchPath: String = ""
|
|
var watchDebounceSeconds: Int = 3
|
|
var lastWatchEventAt: Date? = nil
|
|
var allowUnattendedDelete: Bool = false
|
|
|
|
init(
|
|
name: String = "New Sync Job",
|
|
sourcePath: String = "",
|
|
destinationPath: String = ""
|
|
) {
|
|
self.id = UUID()
|
|
self.name = name
|
|
self.sourcePath = sourcePath
|
|
self.destinationPath = destinationPath
|
|
self.isRemote = false
|
|
self.remoteHost = ""
|
|
self.remoteUser = ""
|
|
self.remotePort = 22
|
|
self.sshKeyPath = ""
|
|
self.archive = true
|
|
self.compress = false
|
|
self.deleteExtraneous = false
|
|
self.preservePermissions = true
|
|
self.preserveExtendedAttributes = true
|
|
self.showProgress = true
|
|
self.exclusionsText = ""
|
|
self.additionalArguments = ""
|
|
self.isEnabled = true
|
|
self.createdAt = Date()
|
|
self.updatedAt = Date()
|
|
self.lastRunAt = nil
|
|
self.lastExitCode = nil
|
|
self.scheduleEnabled = false
|
|
self.scheduleKindRaw = SyncScheduleKind.manual.rawValue
|
|
self.scheduleStartAt = Date().addingTimeInterval(3600)
|
|
self.scheduleIntervalMinutes = 30
|
|
self.nextRunAt = nil
|
|
self.watchEnabled = false
|
|
self.watchPath = ""
|
|
self.watchDebounceSeconds = 3
|
|
self.lastWatchEventAt = nil
|
|
self.allowUnattendedDelete = false
|
|
}
|
|
|
|
var exclusions: [String] {
|
|
exclusionsText
|
|
.split(whereSeparator: \.isNewline)
|
|
.map { $0.trimmingCharacters(in: .whitespacesAndNewlines) }
|
|
.filter { !$0.isEmpty }
|
|
}
|
|
|
|
var destinationDisplay: String {
|
|
if isRemote {
|
|
let userPrefix = remoteUser.isEmpty ? "" : "\(remoteUser)@"
|
|
return "\(userPrefix)\(remoteHost):\(destinationPath)"
|
|
}
|
|
return destinationPath
|
|
}
|
|
}
|