Refactoring

This commit is contained in:
Justin Mazzocchi 2020-10-03 13:50:46 -07:00
parent 8d1f94d449
commit 758c375547
No known key found for this signature in database
GPG key ID: E223E6937AAFB01C
5 changed files with 35 additions and 43 deletions

View file

@ -3,7 +3,7 @@
import GRDB import GRDB
extension ContentDatabase { extension ContentDatabase {
var migrator: DatabaseMigrator { static var migrator: DatabaseMigrator {
var migrator = DatabaseMigrator() var migrator = DatabaseMigrator()
migrator.registerMigration("0.1.0") { db in migrator.registerMigration("0.1.0") { db in

View file

@ -8,6 +8,8 @@ import Mastodon
import Secrets import Secrets
public struct ContentDatabase { public struct ContentDatabase {
public let activeFiltersPublisher: AnyPublisher<[Filter], Error>
private let databaseWriter: DatabaseWriter private let databaseWriter: DatabaseWriter
public init(identityID: UUID, inMemory: Bool, keychain: Keychain.Type) throws { public init(identityID: UUID, inMemory: Bool, keychain: Keychain.Type) throws {
@ -24,8 +26,15 @@ public struct ContentDatabase {
databaseWriter = try DatabasePool(path: path, configuration: configuration) databaseWriter = try DatabasePool(path: path, configuration: configuration)
} }
try migrator.migrate(databaseWriter) try Self.migrator.migrate(databaseWriter)
try clean() try Self.clean(databaseWriter)
activeFiltersPublisher = ValueObservation.tracking {
try Filter.filter(Filter.Columns.expiresAt == nil || Filter.Columns.expiresAt > Date()).fetchAll($0)
}
.removeDuplicates()
.publisher(in: databaseWriter)
.eraseToAnyPublisher()
} }
} }
@ -173,26 +182,23 @@ public extension ContentDatabase {
} }
func observation(timeline: Timeline) -> AnyPublisher<[[Timeline.Item]], Error> { func observation(timeline: Timeline) -> AnyPublisher<[[Timeline.Item]], Error> {
ValueObservation.tracking { db -> (TimelineItemsInfo?, [Filter]) in ValueObservation.tracking(
(try TimelineItemsInfo.request( TimelineItemsInfo.request(TimelineRecord.filter(TimelineRecord.Columns.id == timeline.id)).fetchOne)
TimelineRecord.filter(TimelineRecord.Columns.id == timeline.id)).fetchOne(db), .removeDuplicates()
try Filter.active.fetchAll(db)) .publisher(in: databaseWriter)
} .combineLatest(activeFiltersPublisher)
.map { $0?.items(filters: $1) ?? [] } .compactMap { $0?.items(filters: $1) }
.removeDuplicates() .eraseToAnyPublisher()
.publisher(in: databaseWriter)
.eraseToAnyPublisher()
} }
func contextObservation(parentID: String) -> AnyPublisher<[[Timeline.Item]], Error> { func contextObservation(parentID: String) -> AnyPublisher<[[Timeline.Item]], Error> {
ValueObservation.tracking { db -> (ContextItemsInfo?, [Filter]) in ValueObservation.tracking(
(try ContextItemsInfo.request(StatusRecord.filter(StatusRecord.Columns.id == parentID)).fetchOne(db), ContextItemsInfo.request(StatusRecord.filter(StatusRecord.Columns.id == parentID)).fetchOne)
try Filter.active.fetchAll(db)) .removeDuplicates()
} .publisher(in: databaseWriter)
.map { $0?.items(filters: $1) ?? [] } .combineLatest(activeFiltersPublisher)
.removeDuplicates() .compactMap { $0?.items(filters: $1) }
.publisher(in: databaseWriter) .eraseToAnyPublisher()
.eraseToAnyPublisher()
} }
func listsObservation() -> AnyPublisher<[Timeline], Error> { func listsObservation() -> AnyPublisher<[Timeline], Error> {
@ -205,16 +211,8 @@ public extension ContentDatabase {
.eraseToAnyPublisher() .eraseToAnyPublisher()
} }
func activeFiltersObservation(date: Date) -> AnyPublisher<[Filter], Error> { func expiredFiltersObservation() -> AnyPublisher<[Filter], Error> {
ValueObservation.tracking( ValueObservation.tracking { try Filter.filter(Filter.Columns.expiresAt < Date()).fetchAll($0) }
Filter.filter(Filter.Columns.expiresAt == nil || Filter.Columns.expiresAt > date).fetchAll)
.removeDuplicates()
.publisher(in: databaseWriter)
.eraseToAnyPublisher()
}
func expiredFiltersObservation(date: Date) -> AnyPublisher<[Filter], Error> {
ValueObservation.tracking(Filter.filter(Filter.Columns.expiresAt < date).fetchAll)
.removeDuplicates() .removeDuplicates()
.publisher(in: databaseWriter) .publisher(in: databaseWriter)
.eraseToAnyPublisher() .eraseToAnyPublisher()
@ -248,7 +246,7 @@ private extension ContentDatabase {
try FileManager.default.databaseDirectoryURL(name: identityID.uuidString) try FileManager.default.databaseDirectoryURL(name: identityID.uuidString)
} }
func clean() throws { static func clean(_ databaseWriter: DatabaseWriter) throws {
try databaseWriter.write { try databaseWriter.write {
try TimelineRecord.deleteAll($0) try TimelineRecord.deleteAll($0)
try StatusRecord.deleteAll($0) try StatusRecord.deleteAll($0)

View file

@ -23,10 +23,6 @@ extension Filter {
case irreversible case irreversible
case wholeWord case wholeWord
} }
static var active: QueryInterfaceRequest<Self> {
filter(Filter.Columns.expiresAt == nil || Filter.Columns.expiresAt > Date())
}
} }
extension Array where Element == StatusInfo { extension Array where Element == StatusInfo {

View file

@ -128,12 +128,12 @@ public extension IdentityService {
.eraseToAnyPublisher() .eraseToAnyPublisher()
} }
func activeFiltersObservation(date: Date) -> AnyPublisher<[Filter], Error> { func activeFiltersObservation() -> AnyPublisher<[Filter], Error> {
contentDatabase.activeFiltersObservation(date: date) contentDatabase.activeFiltersPublisher
} }
func expiredFiltersObservation(date: Date) -> AnyPublisher<[Filter], Error> { func expiredFiltersObservation() -> AnyPublisher<[Filter], Error> {
contentDatabase.expiredFiltersObservation(date: date) contentDatabase.expiredFiltersObservation()
} }
func updatePreferences(_ preferences: Identity.Preferences) -> AnyPublisher<Never, Error> { func updatePreferences(_ preferences: Identity.Preferences) -> AnyPublisher<Never, Error> {

View file

@ -16,13 +16,11 @@ public final class FiltersViewModel: ObservableObject {
public init(identification: Identification) { public init(identification: Identification) {
self.identification = identification self.identification = identification
let now = Date() identification.service.activeFiltersObservation()
identification.service.activeFiltersObservation(date: now)
.assignErrorsToAlertItem(to: \.alertItem, on: self) .assignErrorsToAlertItem(to: \.alertItem, on: self)
.assign(to: &$activeFilters) .assign(to: &$activeFilters)
identification.service.expiredFiltersObservation(date: now) identification.service.expiredFiltersObservation()
.assignErrorsToAlertItem(to: \.alertItem, on: self) .assignErrorsToAlertItem(to: \.alertItem, on: self)
.assign(to: &$expiredFilters) .assign(to: &$expiredFilters)
} }