forked from shadowfacts/Tusker
53 lines
2.1 KiB
Swift
53 lines
2.1 KiB
Swift
//
|
|
// UpdateFilterService.swift
|
|
// Tusker
|
|
//
|
|
// Created by Shadowfacts on 12/3/22.
|
|
// Copyright © 2022 Shadowfacts. All rights reserved.
|
|
//
|
|
|
|
import Foundation
|
|
import Pachyderm
|
|
|
|
@MainActor
|
|
class UpdateFilterService {
|
|
private let filter: EditedFilter
|
|
private let mastodonController: MastodonController
|
|
|
|
init(filter: EditedFilter, mastodonController: MastodonController) {
|
|
self.filter = filter
|
|
self.mastodonController = mastodonController
|
|
}
|
|
|
|
func run() async throws {
|
|
let context = mastodonController.persistentContainer.viewContext
|
|
let mo = try context.fetch(FilterMO.fetchRequest(id: filter.id!)).first!
|
|
|
|
let updateFrom: AnyFilter
|
|
if mastodonController.instanceFeatures.filtersV2 {
|
|
var updates = filter.keywords.map {
|
|
if let id = $0.id {
|
|
return FilterV2.KeywordUpdate.update(id: id, keyword: $0.keyword, wholeWord: $0.wholeWord)
|
|
} else {
|
|
return FilterV2.KeywordUpdate.add(keyword: $0.keyword, wholeWord: $0.wholeWord)
|
|
}
|
|
}
|
|
for existing in mo.keywordMOs where !filter.keywords.contains(where: { existing.id == $0.id }) {
|
|
if let id = existing.id {
|
|
updates.append(.destroy(id: id))
|
|
}
|
|
}
|
|
let req = FilterV2.update(filter.id!, title: filter.title ?? "", context: filter.contexts, expiresIn: filter.expiresIn, action: filter.action, keywords: updates)
|
|
let (updated, _) = try await mastodonController.run(req)
|
|
updateFrom = .v2(updated)
|
|
} else {
|
|
let req = FilterV1.update(filter.id!, phrase: filter.keywords.first!.keyword, context: filter.contexts, irreversible: false, wholeWord: filter.keywords.first!.wholeWord, expiresIn: filter.expiresIn)
|
|
let (updated, _) = try await mastodonController.run(req)
|
|
updateFrom = .v1(updated)
|
|
}
|
|
|
|
mo.updateFrom(apiFilter: updateFrom, context: context)
|
|
mastodonController.persistentContainer.save(context: context)
|
|
}
|
|
}
|