Skip to content

Commit

Permalink
Update Item date modified with each saved change
Browse files Browse the repository at this point in the history
  • Loading branch information
mvasilak committed Jan 9, 2025
1 parent bbffc40 commit 2d1430f
Show file tree
Hide file tree
Showing 3 changed files with 91 additions and 26 deletions.
49 changes: 41 additions & 8 deletions Zotero/Controllers/Database/Requests/EditItemFieldsDbRequest.swift
Original file line number Diff line number Diff line change
Expand Up @@ -10,16 +10,18 @@ import Foundation

import RealmSwift

struct EditItemFieldsDbRequest: DbRequest {
let key: String
let libraryId: LibraryIdentifier
let fieldValues: [KeyBaseKeyPair: String]
let dateParser: DateParser
protocol EditItemFieldsBaseRequest {
var key: String { get }
var libraryId: LibraryIdentifier { get }
var fieldValues: [KeyBaseKeyPair: String] { get }
var dateParser: DateParser { get }

var needsWrite: Bool { return true }
func processAndReturnResponse(in database: Realm) throws -> Date?
}

func process(in database: Realm) throws {
guard !fieldValues.isEmpty, let item = database.objects(RItem.self).uniqueObject(key: key, libraryId: libraryId) else { return }
extension EditItemFieldsBaseRequest {
func processAndReturnResponse(in database: Realm) throws -> Date? {
guard !fieldValues.isEmpty, let item = database.objects(RItem.self).uniqueObject(key: key, libraryId: libraryId) else { return nil }

var didChange = false

Expand Down Expand Up @@ -60,6 +62,37 @@ struct EditItemFieldsDbRequest: DbRequest {
item.changes.append(RObjectChange.create(changes: RItemChanges.fields))
item.changeType = .user
item.dateModified = Date()
return item.dateModified
}

return nil
}
}

struct EditItemFieldsDbRequest: EditItemFieldsBaseRequest, DbRequest {
let key: String
let libraryId: LibraryIdentifier
let fieldValues: [KeyBaseKeyPair: String]
let dateParser: DateParser

var needsWrite: Bool { return true }

func process(in database: Realm) throws {
_ = try processAndReturnResponse(in: database)
}
}

struct EditItemFieldsDbResponseRequest: EditItemFieldsBaseRequest, DbResponseRequest {
typealias Response = Date?

let key: String
let libraryId: LibraryIdentifier
let fieldValues: [KeyBaseKeyPair: String]
let dateParser: DateParser

var needsWrite: Bool { return true }

func process(in database: Realm) throws -> Date? {
return try processAndReturnResponse(in: database)
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,6 @@ struct EndItemDetailEditingDbRequest: DbRequest {

func process(in database: Realm) throws {
guard let item = database.objects(RItem.self).uniqueObject(key: itemKey, libraryId: libraryId) else { return }
item.dateModified = Date()
item.changesSyncPaused = false
item.changeType = .user
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -712,13 +712,19 @@ struct ItemDetailActionHandler: ViewModelActionHandler, BackgroundDbProcessingAc
newState.data.fields[updated.key] = updated
}

var requests: [DbRequest] = [EndItemDetailEditingDbRequest(libraryId: state.library.identifier, itemKey: state.key)]
if !updatedFields.isEmpty {
requests.insert(EditItemFieldsDbRequest(key: state.key, libraryId: state.library.identifier, fieldValues: updatedFields, dateParser: dateParser), at: 0)
let endEditingRequest = EndItemDetailEditingDbRequest(libraryId: state.library.identifier, itemKey: state.key)
var dateModified: Date?
try dbStorage.perform(on: queue) { coordinator in
if !updatedFields.isEmpty {
let request = EditItemFieldsDbResponseRequest(key: state.key, libraryId: state.library.identifier, fieldValues: updatedFields, dateParser: dateParser)
dateModified = try coordinator.perform(request: request)
}
try coordinator.perform(request: endEditingRequest)
}
try self.dbStorage.perform(writeRequests: requests, on: queue)

newState.data.dateModified = Date()
if let dateModified {
newState.data.dateModified = dateModified
}
newState.snapshot = nil
newState.presentedFieldIds = ItemDetailDataCreator.filteredFieldKeys(from: newState.data.fields)
newState.isEditing = false
Expand Down Expand Up @@ -967,10 +973,19 @@ struct ItemDetailActionHandler: ViewModelActionHandler, BackgroundDbProcessingAc
}

let keyPair = KeyBaseKeyPair(key: key, baseKey: (key != FieldKeys.Item.title ? FieldKeys.Item.title : nil))
let request = EditItemFieldsDbRequest(key: viewModel.state.key, libraryId: viewModel.state.library.identifier, fieldValues: [keyPair: viewModel.state.data.title], dateParser: dateParser)
self.perform(request: request) { error in
guard let error else { return }
DDLogError("ItemDetailActionHandler: can't store title - \(error)")
let request = EditItemFieldsDbResponseRequest(key: viewModel.state.key, libraryId: viewModel.state.library.identifier, fieldValues: [keyPair: viewModel.state.data.title], dateParser: dateParser)
perform(request: request, invalidateRealm: false) { [weak viewModel] result in
switch result {
case .success(let dateModified):
guard let viewModel, let dateModified else { return }
update(viewModel: viewModel) { state in
state.data.dateModified = dateModified
state.reload = .section(.dates)
}

case .failure(let error):
DDLogError("ItemDetailActionHandler: can't store title - \(error)")
}
}
}

Expand All @@ -980,15 +995,24 @@ struct ItemDetailActionHandler: ViewModelActionHandler, BackgroundDbProcessingAc
state.reload = .row(.abstract)
}

let request = EditItemFieldsDbRequest(
let request = EditItemFieldsDbResponseRequest(
key: viewModel.state.key,
libraryId: viewModel.state.library.identifier,
fieldValues: [KeyBaseKeyPair(key: FieldKeys.Item.abstract, baseKey: nil): abstract],
dateParser: dateParser
)
self.perform(request: request) { error in
guard let error else { return }
DDLogError("ItemDetailActionHandler: can't store abstract - \(error)")
perform(request: request, invalidateRealm: false) { [weak viewModel] result in
switch result {
case .success(let dateModified):
guard let viewModel, let dateModified else { return }
update(viewModel: viewModel) { state in
state.data.dateModified = dateModified
state.reload = .section(.dates)
}

case .failure(let error):
DDLogError("ItemDetailActionHandler: can't store abstract - \(error)")
}
}
}

Expand All @@ -1011,15 +1035,24 @@ struct ItemDetailActionHandler: ViewModelActionHandler, BackgroundDbProcessingAc
state.reload = .row(.field(key: field.key, multiline: (field.id == FieldKeys.Item.extra)))
}

let request = EditItemFieldsDbRequest(
let request = EditItemFieldsDbResponseRequest(
key: viewModel.state.key,
libraryId: viewModel.state.library.identifier,
fieldValues: [KeyBaseKeyPair(key: field.key, baseKey: field.baseField): field.value],
dateParser: dateParser
)
self.perform(request: request) { error in
guard let error else { return }
DDLogError("ItemDetailActionHandler: can't store field \(error)")
perform(request: request, invalidateRealm: false) { [weak viewModel] result in
switch result {
case .success(let dateModified):
guard let viewModel, let dateModified else { return }
update(viewModel: viewModel) { state in
state.data.dateModified = dateModified
state.reload = .section(.dates)
}

case .failure(let error):
DDLogError("ItemDetailActionHandler: can't store field - \(error)")
}
}
}

Expand Down

0 comments on commit 2d1430f

Please sign in to comment.