metatext-app-ios-iphone-ipad/ServiceLayer/Sources/ServiceLayer/Services/AccountService.swift

94 lines
3.0 KiB
Swift
Raw Normal View History

2020-09-23 03:00:56 +02:00
// Copyright © 2020 Metabolist. All rights reserved.
import Combine
import DB
import Foundation
import Mastodon
import MastodonAPI
public struct AccountService {
public let account: Account
public let relationship: Relationship?
public let identityProofs: [IdentityProof]
2020-09-25 07:39:06 +02:00
public let navigationService: NavigationService
2020-10-05 21:58:03 +02:00
2020-09-23 03:00:56 +02:00
private let mastodonAPIClient: MastodonAPIClient
private let contentDatabase: ContentDatabase
init(account: Account,
relationship: Relationship? = nil,
identityProofs: [IdentityProof] = [],
mastodonAPIClient: MastodonAPIClient,
contentDatabase: ContentDatabase) {
2020-09-23 03:00:56 +02:00
self.account = account
self.relationship = relationship
self.identityProofs = identityProofs
2020-10-05 21:58:03 +02:00
navigationService = NavigationService(mastodonAPIClient: mastodonAPIClient, contentDatabase: contentDatabase)
2020-09-23 03:00:56 +02:00
self.mastodonAPIClient = mastodonAPIClient
self.contentDatabase = contentDatabase
}
}
2020-11-12 09:32:18 +01:00
public extension AccountService {
func follow() -> AnyPublisher<Never, Error> {
2020-11-17 07:46:48 +01:00
relationshipAction(.accountsFollow(id: account.id))
2020-11-12 09:32:18 +01:00
}
func unfollow() -> AnyPublisher<Never, Error> {
2020-11-17 07:46:48 +01:00
relationshipAction(.accountsUnfollow(id: account.id))
.collect()
.flatMap { _ in contentDatabase.unfollow(id: account.id) }
.eraseToAnyPublisher()
}
func hideReblogs() -> AnyPublisher<Never, Error> {
relationshipAction(.accountsFollow(id: account.id, showReblogs: false))
}
func showReblogs() -> AnyPublisher<Never, Error> {
relationshipAction(.accountsFollow(id: account.id, showReblogs: true))
}
func block() -> AnyPublisher<Never, Error> {
relationshipAction(.accountsBlock(id: account.id))
.collect()
.flatMap { _ in contentDatabase.block(id: account.id) }
.eraseToAnyPublisher()
}
func unblock() -> AnyPublisher<Never, Error> {
relationshipAction(.accountsUnblock(id: account.id))
}
func mute() -> AnyPublisher<Never, Error> {
relationshipAction(.accountsMute(id: account.id))
.collect()
.flatMap { _ in contentDatabase.mute(id: account.id) }
.eraseToAnyPublisher()
}
func unmute() -> AnyPublisher<Never, Error> {
relationshipAction(.accountsUnmute(id: account.id))
}
func pin() -> AnyPublisher<Never, Error> {
relationshipAction(.accountsPin(id: account.id))
}
func unpin() -> AnyPublisher<Never, Error> {
relationshipAction(.accountsUnpin(id: account.id))
}
func set(note: String) -> AnyPublisher<Never, Error> {
relationshipAction(.note(note, id: account.id))
}
}
private extension AccountService {
func relationshipAction(_ endpoint: RelationshipEndpoint) -> AnyPublisher<Never, Error> {
mastodonAPIClient.request(endpoint)
.flatMap { contentDatabase.insert(relationships: [$0]) }
2020-11-12 09:32:18 +01:00
.eraseToAnyPublisher()
}
}