Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
20 changes: 20 additions & 0 deletions iOSClient/Data/NCManageDatabase+AutoUpload.swift
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,26 @@ extension NCManageDatabase {

// MARK: - Realm Write

/// Records a resource already present on the server without treating it as a new upload.
func completeExistingAutoUploadAsync(_ metadata: tableMetadata) async {
let detached = metadata.detachedCopy()
await core.performRealmWriteAsync { realm in
guard let transfer = realm.object(ofType: tableMetadata.self, forPrimaryKey: detached.ocId),
transfer.sessionSelector == NCGlobal.shared.selectorUploadAutoUpload,
let account = realm.objects(tableAccount.self).filter("account == %@", detached.account).first,
account.autoUploadStart else { return }
if let serverUrlBase = transfer.autoUploadServerUrlBase {
let completed = tableAutoUploadTransfer(account: transfer.account,
serverUrlBase: serverUrlBase,
fileName: transfer.fileNameView,
assetLocalIdentifier: transfer.assetLocalIdentifier,
date: transfer.creationDate as Date)
realm.add(completed, update: .all)
}
realm.delete(transfer)
}
}

func addAutoUploadTransferAsync(account: String,
serverUrlBase: String,
fileName: String,
Expand Down
26 changes: 19 additions & 7 deletions iOSClient/Networking/NCAutoUpload.swift
Original file line number Diff line number Diff line change
Expand Up @@ -115,10 +115,8 @@ class NCAutoUpload: NSObject {
let formatCompatibility = NCPreferences().formatCompatibility
let keychainLivePhoto = NCPreferences().livePhoto
let fileSystem = NCUtilityFileSystem()
let knownFileNames = await self.database.fetchAutoUploadFileNamesAsync(account: tblAccount.account,
autoUploadServerUrlBase: autoUploadServerUrlBase)
let knownFileNames = await self.database.fetchAutoUploadFileNamesAsync(account: tblAccount.account, autoUploadServerUrlBase: autoUploadServerUrlBase)

let skipFileNames = knownFileNames.queued.union(knownFileNames.uploaded)
var lastUploadedDate: Date?
var canAdvanceSinceDate = true

Expand Down Expand Up @@ -149,7 +147,8 @@ class NCAutoUpload: NSObject {

// A later success cannot move the restart date past an unfinished photo or Live Photo.
canAdvanceSinceDate = false
if skipFileNames.contains(fileNameCompatible) || skipFileNames.contains(fileName) {
if knownFileNames.queued.contains(fileNameCompatible) || knownFileNames.queued.contains(fileName) ||
(isLivePhoto && knownFileNames.queued.contains(pairedFileName)) {
continue
}
let serverUrl = tblAccount.autoUploadCreateSubfolder
Expand Down Expand Up @@ -417,10 +416,10 @@ class NCAutoUpload: NSObject {
account: metadata.account
)

if existsResult == .success {
await NCManageDatabase.shared.deleteMetadataAsync(id: metadata.ocId)
if existsResult == .success && !metadata.isLivePhoto {
await database.completeExistingAutoUploadAsync(metadata)
continue
} else if existsResult.errorCode != 404 {
} else if existsResult != .success && existsResult.errorCode != 404 {
continue
}

Expand All @@ -435,6 +434,19 @@ class NCAutoUpload: NSObject {
for extractedMetadata in extractedMetadatas {
guard !Task.isCancelled else { return }

if extractedMetadata.isLivePhoto {
let resourceExists = await NCNetworking.shared.fileExists(
serverUrlFileName: extractedMetadata.serverUrlFileName,
account: extractedMetadata.account
)
if resourceExists == .success {
await database.completeExistingAutoUploadAsync(extractedMetadata)
continue
} else if resourceExists.errorCode != 404 {
continue
}
}

let err = await NCNetworking.shared.uploadFileInBackground(
metadata: extractedMetadata.detachedCopy()
)
Expand Down
4 changes: 2 additions & 2 deletions iOSClient/Networking/NCNetworkingProcess.swift
Original file line number Diff line number Diff line change
Expand Up @@ -554,8 +554,8 @@ actor NCNetworkingProcess {
if metadata.sessionSelector == global.selectorUploadAutoUpload {
let existsResult = await networking.fileExists(serverUrlFileName: metadata.serverUrlFileName, account: metadata.account)
if existsResult == .success {
// File exists → delete from local metadata and skip
await NCManageDatabase.shared.deleteMetadataAsync(id: metadata.ocId)
// Preserve completion in the incremental upload history before removing the transfer.
await database.completeExistingAutoUploadAsync(metadata)
continue
} else if existsResult.errorCode == 404 {
// 404 Not Found → file does not exist
Expand Down
2 changes: 2 additions & 0 deletions iOSClient/Utility/NCCameraRoll.swift
Original file line number Diff line number Diff line change
Expand Up @@ -486,6 +486,7 @@ final class NCCameraRoll: CameraRollExtractor {
let capturedSceneIdentifier = metadata.sceneIdentifier
let capturedLivePhotoFile = metadata.fileName
let capturedAssetLocalIdentifier = metadata.assetLocalIdentifier
let capturedAutoUploadServerUrlBase = metadata.autoUploadServerUrlBase
let capturedSession = metadata.session
let capturedSessionSelector = metadata.sessionSelector
let capturedStatus = metadata.status
Expand All @@ -509,6 +510,7 @@ final class NCCameraRoll: CameraRollExtractor {
sceneIdentifier: capturedSceneIdentifier) { metadataLivePhoto in
metadataLivePhoto.livePhotoFile = capturedLivePhotoFile
metadataLivePhoto.assetLocalIdentifier = capturedAssetLocalIdentifier
metadataLivePhoto.autoUploadServerUrlBase = capturedAutoUploadServerUrlBase
metadataLivePhoto.isExtractFile = true
metadataLivePhoto.session = capturedSession
metadataLivePhoto.sessionSelector = capturedSessionSelector
Expand Down
Loading