mirror of
https://github.com/metabolist/metatext.git
synced 2024-06-08 16:39:26 +00:00
52 lines
2 KiB
Swift
52 lines
2 KiB
Swift
// Copyright © 2020 Metabolist. All rights reserved.
|
|
|
|
import Combine
|
|
import DB
|
|
import Foundation
|
|
import Mastodon
|
|
import MastodonAPI
|
|
|
|
public struct AccountListService {
|
|
public let accountSections: AnyPublisher<[[Account]], Error>
|
|
public let nextPageMaxIDs: AnyPublisher<String?, Never>
|
|
public let navigationService: NavigationService
|
|
|
|
private let mastodonAPIClient: MastodonAPIClient
|
|
private let contentDatabase: ContentDatabase
|
|
private let requestClosure: (_ maxID: String?, _ minID: String?) -> AnyPublisher<Never, Error>
|
|
}
|
|
|
|
extension AccountListService {
|
|
init(favoritedByStatusID statusID: String, mastodonAPIClient: MastodonAPIClient, contentDatabase: ContentDatabase) {
|
|
let accountSectionsSubject = PassthroughSubject<[[Account]], Error>()
|
|
let nextPageMaxIDsSubject = PassthroughSubject<String?, Never>()
|
|
|
|
self.init(
|
|
accountSections: accountSectionsSubject.eraseToAnyPublisher(),
|
|
nextPageMaxIDs: nextPageMaxIDsSubject.eraseToAnyPublisher(),
|
|
navigationService: NavigationService(
|
|
status: nil,
|
|
mastodonAPIClient: mastodonAPIClient,
|
|
contentDatabase: contentDatabase),
|
|
mastodonAPIClient: mastodonAPIClient,
|
|
contentDatabase: contentDatabase) { maxID, minID -> AnyPublisher<Never, Error> in
|
|
mastodonAPIClient.pagedRequest(
|
|
AccountsEndpoint.statusFavouritedBy(id: statusID), maxID: maxID, minID: minID)
|
|
.handleEvents(
|
|
receiveOutput: {
|
|
nextPageMaxIDsSubject.send($0.info.maxID)
|
|
accountSectionsSubject.send([$0.result])
|
|
},
|
|
receiveCompletion: accountSectionsSubject.send)
|
|
.flatMap { contentDatabase.insert(accounts: $0.result) }
|
|
.eraseToAnyPublisher()
|
|
}
|
|
}
|
|
}
|
|
|
|
public extension AccountListService {
|
|
func request(maxID: String?, minID: String?) -> AnyPublisher<Never, Error> {
|
|
requestClosure(maxID, minID)
|
|
}
|
|
}
|