FavoritePasswordService.kt

package de.pflugradts.passbird.domain.service.password
import de.pflugradts.kotlinextensions.Option
import de.pflugradts.kotlinextensions.TryResult
import de.pflugradts.kotlinextensions.TryResult.Companion.success
import de.pflugradts.passbird.domain.model.shell.Shell
import de.pflugradts.passbird.domain.model.slot.Slot
import de.pflugradts.passbird.domain.model.slot.Slots
import de.pflugradts.passbird.domain.service.eventhandling.EventRegistry
import de.pflugradts.passbird.domain.service.password.encryption.CryptoProvider
import de.pflugradts.passbird.domain.service.password.tree.EggRepository
class FavoritePasswordService constructor(
    cryptoProvider: CryptoProvider,
    eggRepository: EggRepository,
    eventRegistry: EventRegistry,
) : CommonPasswordServiceCapabilities(cryptoProvider, eggRepository, eventRegistry) {
    fun viewFavorites() = Slots<Shell>().apply {
        eggRepository.favorites().forEachIndexed { index, favorite ->
            favorite.map(::decrypted).ifPresent { this[index] = it }
        }
    }
    fun viewFavoriteEntry(slot: Slot): Option<Shell> = eggRepository.favorites()[slot].map(::decrypted)
    fun putFavorite(slot: Slot, eggIdShell: Shell): TryResult<Unit> = findWithoutUpdatingMemory(eggIdShell).let { egg ->
        if (egg.isPresent) {
            eggRepository.putFavorite(slot, egg.get().viewEggId())
            processEventsAndSync()
        } else {
            registerEggNotFound(eggIdShell)
            success(Unit)
        }
    }
    fun discardFavorite(slot: Slot): TryResult<Unit> {
        eggRepository.discardFavorite(slot)
        return processEventsAndSync()
    }
}