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
extension ContentDatabase {
var migrator: DatabaseMigrator {
static var migrator: DatabaseMigrator {
var migrator = DatabaseMigrator()
migrator.registerMigration("0.1.0") { db in

View file

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

View file

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

View file

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

View file

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