mirror of
https://github.com/metabolist/metatext.git
synced 2024-06-03 05:59:24 +00:00
Refactoring
This commit is contained in:
parent
8d1f94d449
commit
758c375547
|
@ -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
|
||||||
|
|
|
@ -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)
|
||||||
|
|
|
@ -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 {
|
||||||
|
|
|
@ -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> {
|
||||||
|
|
|
@ -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)
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue