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
|
2020-11-11 08:31:56 +01:00
|
|
|
public let relationship: Relationship?
|
|
|
|
public let identityProofs: [IdentityProof]
|
2021-01-18 08:17:45 +01:00
|
|
|
public let featuredTags: [FeaturedTag]
|
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
|
|
|
|
|
2020-11-30 03:54:11 +01:00
|
|
|
public init(account: Account,
|
|
|
|
relationship: Relationship? = nil,
|
|
|
|
identityProofs: [IdentityProof] = [],
|
2021-01-18 08:17:45 +01:00
|
|
|
featuredTags: [FeaturedTag] = [],
|
2020-11-30 03:54:11 +01:00
|
|
|
mastodonAPIClient: MastodonAPIClient,
|
|
|
|
contentDatabase: ContentDatabase) {
|
2020-09-23 03:00:56 +02:00
|
|
|
self.account = account
|
2020-11-11 08:31:56 +01:00
|
|
|
self.relationship = relationship
|
|
|
|
self.identityProofs = identityProofs
|
2021-01-18 08:17:45 +01:00
|
|
|
self.featuredTags = featuredTags
|
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 {
|
2020-11-30 03:54:11 +01:00
|
|
|
var isLocal: Bool {
|
|
|
|
account.url.host == mastodonAPIClient.instanceURL.host
|
|
|
|
}
|
|
|
|
|
2020-12-04 04:13:18 +01:00
|
|
|
var domain: String? { account.url.host }
|
|
|
|
|
2020-11-12 09:32:18 +01:00
|
|
|
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))
|
|
|
|
}
|
2020-11-30 03:54:11 +01:00
|
|
|
|
|
|
|
func report(_ elements: ReportElements) -> AnyPublisher<Never, Error> {
|
|
|
|
mastodonAPIClient.request(ReportEndpoint.create(elements)).ignoreOutput().eraseToAnyPublisher()
|
|
|
|
}
|
2020-12-03 02:06:46 +01:00
|
|
|
|
2020-12-04 04:13:18 +01:00
|
|
|
func domainBlock() -> AnyPublisher<Never, Error> {
|
|
|
|
guard let domain = domain else { return Fail(error: URLError(.badURL)).eraseToAnyPublisher() }
|
|
|
|
|
|
|
|
return domainAction(EmptyEndpoint.blockDomain(domain))
|
|
|
|
}
|
|
|
|
|
|
|
|
func domainUnblock() -> AnyPublisher<Never, Error> {
|
|
|
|
guard let domain = domain else { return Fail(error: URLError(.badURL)).eraseToAnyPublisher() }
|
|
|
|
|
|
|
|
return domainAction(EmptyEndpoint.unblockDomain(domain))
|
|
|
|
}
|
|
|
|
|
2020-12-03 02:06:46 +01:00
|
|
|
func followingService() -> AccountListService {
|
|
|
|
AccountListService(
|
|
|
|
endpoint: .accountsFollowing(id: account.id),
|
|
|
|
mastodonAPIClient: mastodonAPIClient,
|
2020-12-03 02:41:22 +01:00
|
|
|
contentDatabase: contentDatabase,
|
|
|
|
titleComponents: ["account.followed-by-%@", "@".appending(account.acct)])
|
2020-12-03 02:06:46 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
func followersService() -> AccountListService {
|
|
|
|
AccountListService(
|
|
|
|
endpoint: .accountsFollowers(id: account.id),
|
|
|
|
mastodonAPIClient: mastodonAPIClient,
|
2020-12-03 02:41:22 +01:00
|
|
|
contentDatabase: contentDatabase,
|
|
|
|
titleComponents: ["account.%@-followers", "@".appending(account.acct)])
|
2020-12-03 02:06:46 +01:00
|
|
|
}
|
2020-11-17 07:46:48 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
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()
|
|
|
|
}
|
2020-12-04 04:13:18 +01:00
|
|
|
|
|
|
|
func domainAction(_ endpoint: EmptyEndpoint) -> AnyPublisher<Never, Error> {
|
|
|
|
mastodonAPIClient.request(endpoint)
|
|
|
|
.flatMap { _ in mastodonAPIClient.request(RelationshipsEndpoint.relationships(ids: [account.id])) }
|
|
|
|
.flatMap { contentDatabase.insert(relationships: $0) }
|
|
|
|
.ignoreOutput()
|
|
|
|
.eraseToAnyPublisher()
|
|
|
|
}
|
2020-11-12 09:32:18 +01:00
|
|
|
}
|