73 lines
3.4 KiB
Swift
73 lines
3.4 KiB
Swift
|
//
|
||
|
// https://mczachurski.dev
|
||
|
// Copyright © 2023 Marcin Czachurski and the repository contributors.
|
||
|
// Licensed under the Apache License 2.0.
|
||
|
//
|
||
|
|
||
|
import Foundation
|
||
|
import CoreData
|
||
|
import PixelfedKit
|
||
|
|
||
|
class AccountRelationshipHandler {
|
||
|
public static let shared = AccountRelationshipHandler()
|
||
|
private init() { }
|
||
|
|
||
|
func createAccountRelationshipEntity(viewContext: NSManagedObjectContext? = nil) -> AccountRelationship {
|
||
|
let context = viewContext ?? CoreDataHandler.shared.container.viewContext
|
||
|
return AccountRelationship(context: context)
|
||
|
}
|
||
|
|
||
|
/// Check if boosted statuses from given account are muted.
|
||
|
func isBoostedStatusesMuted(accountId: String, status: Status, viewContext: NSManagedObjectContext? = nil) -> Bool {
|
||
|
if status.reblog == nil {
|
||
|
return false
|
||
|
}
|
||
|
|
||
|
let accountRelationship = self.getAccountRelationship(for: accountId, relation: status.account.id, viewContext: viewContext)
|
||
|
return accountRelationship?.boostedStatusesMuted ?? false
|
||
|
}
|
||
|
|
||
|
func isBoostedStatusesMuted(for accountId: String, relation relationAccountId: String, viewContext: NSManagedObjectContext? = nil) -> Bool {
|
||
|
let accountRelationship = self.getAccountRelationship(for: accountId, relation: relationAccountId, viewContext: viewContext)
|
||
|
return accountRelationship?.boostedStatusesMuted ?? false
|
||
|
}
|
||
|
|
||
|
func setBoostedStatusesMuted(for accountId: String, relation relationAccountId: String, boostedStatusesMuted: Bool, viewContext: NSManagedObjectContext? = nil) {
|
||
|
let context = viewContext ?? CoreDataHandler.shared.container.viewContext
|
||
|
|
||
|
var accountRelationship = self.getAccountRelationship(for: accountId, relation: relationAccountId, viewContext: context)
|
||
|
if accountRelationship == nil {
|
||
|
guard let accountDataFromDb = AccountDataHandler.shared.getAccountData(accountId: accountId, viewContext: context) else {
|
||
|
return
|
||
|
}
|
||
|
|
||
|
let newAccountRelationship = AccountRelationshipHandler.shared.createAccountRelationshipEntity(viewContext: context)
|
||
|
newAccountRelationship.accountId = relationAccountId
|
||
|
newAccountRelationship.pixelfedAccount = accountDataFromDb
|
||
|
accountDataFromDb.addToAccountRelationships(newAccountRelationship)
|
||
|
|
||
|
accountRelationship = newAccountRelationship
|
||
|
}
|
||
|
|
||
|
accountRelationship?.boostedStatusesMuted = boostedStatusesMuted
|
||
|
CoreDataHandler.shared.save(viewContext: context)
|
||
|
}
|
||
|
|
||
|
private func getAccountRelationship(for accountId: String, relation relationAccountId: String, viewContext: NSManagedObjectContext? = nil) -> AccountRelationship? {
|
||
|
let context = viewContext ?? CoreDataHandler.shared.container.viewContext
|
||
|
let fetchRequest = AccountRelationship.fetchRequest()
|
||
|
|
||
|
fetchRequest.fetchLimit = 1
|
||
|
let statusAccountIddPredicate = NSPredicate(format: "accountId = %@", relationAccountId)
|
||
|
let accountPredicate = NSPredicate(format: "pixelfedAccount.id = %@", accountId)
|
||
|
fetchRequest.predicate = NSCompoundPredicate.init(type: .and, subpredicates: [statusAccountIddPredicate, accountPredicate])
|
||
|
|
||
|
do {
|
||
|
return try context.fetch(fetchRequest).first
|
||
|
} catch {
|
||
|
CoreDataError.shared.handle(error, message: "Error during fetching account relationship (isBoostedMutedForAccount).")
|
||
|
return nil
|
||
|
}
|
||
|
}
|
||
|
}
|