Files
2026-09-08 20:06:58 +01:00

111 lines
3.4 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
var retryCount: Int = 2
var retryDelaySeconds: Int = 10
var notifyOnFailure: Bool = true
var notifyOnSuccess: Bool = false
var requireExpectedVolume: Bool = false
var expectedVolumeIdentifier: String = ""
var minimumFreeSpaceMB: Int = 512
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
self.retryCount = 2
self.retryDelaySeconds = 10
self.notifyOnFailure = true
self.notifyOnSuccess = false
self.requireExpectedVolume = false
self.expectedVolumeIdentifier = ""
self.minimumFreeSpaceMB = 512
}
var exclusions: [String] {
exclusionsText
.split(whereSeparator: \.isNewline)
.map { $0.trimmingCharacters(in: .whitespacesAndNewlines) }
.filter { !$0.isEmpty }
}
var expectedVolumeDisplay: String {
expectedVolumeIdentifier.isEmpty ? "Not pinned" : expectedVolumeIdentifier
}
var destinationDisplay: String {
if isRemote {
let userPrefix = remoteUser.isEmpty ? "" : "\(remoteUser)@"
return "\(userPrefix)\(remoteHost):\(destinationPath)"
}
return destinationPath
}
}