mastodon-ios/Mastodon/Protocol/Provider/DataSourceFacade+SearchHist...

117 lines
5.0 KiB
Swift

//
// DataSourceFacade+SearchHistory.swift
// Mastodon
//
// Created by MainasuK on 2022-1-20.
//
import Foundation
import CoreDataStack
extension DataSourceFacade {
static func responseToCreateSearchHistory(
provider: DataSourceProvider,
item: DataSourceItem
) async {
switch item {
case .status:
break // not create search history for status
case .user(let record):
let authenticationBox = provider.context.authenticationService.activeMastodonAuthenticationBox.value
let managedObjectContext = provider.context.backgroundManagedObjectContext
try? await managedObjectContext.performChanges {
guard let me = authenticationBox?.authenticationRecord.object(in: managedObjectContext)?.user else { return }
guard let user = record.object(in: managedObjectContext) else { return }
_ = Persistence.SearchHistory.createOrMerge(
in: managedObjectContext,
context: Persistence.SearchHistory.PersistContext(
entity: .user(user),
me: me,
now: Date()
)
)
} // end try? await managedObjectContext.performChanges { }
case .hashtag(let tag):
let _authenticationBox = provider.context.authenticationService.activeMastodonAuthenticationBox.value
let managedObjectContext = provider.context.backgroundManagedObjectContext
switch tag {
case .entity(let entity):
try? await managedObjectContext.performChanges {
guard let authenticationBox = _authenticationBox else { return }
guard let me = authenticationBox.authenticationRecord.object(in: managedObjectContext)?.user else { return }
let now = Date()
let result = Persistence.Tag.createOrMerge(
in: managedObjectContext,
context: Persistence.Tag.PersistContext(
domain: authenticationBox.domain,
entity: entity,
me: me,
networkDate: now
)
)
_ = Persistence.SearchHistory.createOrMerge(
in: managedObjectContext,
context: Persistence.SearchHistory.PersistContext(
entity: .hashtag(result.tag),
me: me,
now: now
)
)
} // end try? await managedObjectContext.performChanges { }
case .record(let record):
try? await managedObjectContext.performChanges {
guard let authenticationBox = _authenticationBox else { return }
guard let me = authenticationBox.authenticationRecord.object(in: managedObjectContext)?.user else { return }
guard let tag = record.object(in: managedObjectContext) else { return }
let now = Date()
_ = Persistence.SearchHistory.createOrMerge(
in: managedObjectContext,
context: Persistence.SearchHistory.PersistContext(
entity: .hashtag(tag),
me: me,
now: now
)
)
} // end try? await managedObjectContext.performChanges { }
} // end switch tag { }
case .notification:
assertionFailure()
} // end switch item { }
} // end func
}
extension DataSourceFacade {
static func responseToDeleteSearchHistory(
provider: DataSourceProvider
) async throws {
let _authenticationBox = provider.context.authenticationService.activeMastodonAuthenticationBox.value
let managedObjectContext = provider.context.backgroundManagedObjectContext
try await managedObjectContext.performChanges {
guard let authenticationBox = _authenticationBox else { return }
guard let me = authenticationBox.authenticationRecord.object(in: managedObjectContext)?.user else { return }
let request = SearchHistory.sortedFetchRequest
request.predicate = SearchHistory.predicate(
domain: authenticationBox.domain,
userID: authenticationBox.userID
)
let searchHistories = managedObjectContext.safeFetch(request)
for searchHistory in searchHistories {
managedObjectContext.delete(searchHistory)
}
} // end try await managedObjectContext.performChanges { }
} // end func
}