PutPasswordService.kt

package de.pflugradts.passbird.domain.service.password
import de.pflugradts.kotlinextensions.TryResult
import de.pflugradts.kotlinextensions.TryResult.Companion.success
import de.pflugradts.passbird.domain.model.egg.Egg.Companion.createEgg
import de.pflugradts.passbird.domain.model.shell.Shell
import de.pflugradts.passbird.domain.model.shell.ShellPair
import de.pflugradts.passbird.domain.model.slot.Slot
import de.pflugradts.passbird.domain.service.eventhandling.EventRegistry
import de.pflugradts.passbird.domain.service.nest.NestService
import de.pflugradts.passbird.domain.service.password.PasswordService.EggNotExistsAction.CREATE_ENTRY_NOT_EXISTS_EVENT
import de.pflugradts.passbird.domain.service.password.encryption.CryptoProvider
import de.pflugradts.passbird.domain.service.password.tree.EggRepository
import java.util.stream.Stream
class PutPasswordService constructor(
    cryptoProvider: CryptoProvider,
    eggRepository: EggRepository,
    eventRegistry: EventRegistry,
    private val nestService: NestService,
) : CommonPasswordServiceCapabilities(cryptoProvider, eggRepository, eventRegistry) {
    fun putEggs(shellPairs: Stream<ShellPair>): TryResult<Unit> {
        shellPairs.forEach { putEgg(it.first, it.second, false) }
        return processEventsAndSync()
    }
    fun putEgg(eggIdShell: Shell, passwordShell: Shell, sync: Boolean = true): TryResult<Unit> {
        challengeEggId(eggIdShell)
        val encryptedPasswordShell = encrypted(passwordShell)
        val nestSlot = nestService.currentNest().slot
        findWithoutUpdatingMemory(eggIdShell).ifPresentOrElse(
            {
                it.updatePassword(encryptedPasswordShell)
                updateMemory(it, sync = false)
            },
            { eggRepository.add(createEgg(nestSlot, encrypted(eggIdShell), encryptedPasswordShell)) },
        )
        return if (sync) processEventsAndSync() else success(Unit)
    }
    fun putProtein(eggIdShell: Shell, slot: Slot, typeShell: Shell, structureShell: Shell): TryResult<Unit> {
        if (eggExists(eggIdShell, CREATE_ENTRY_NOT_EXISTS_EVENT)) {
            findWithoutUpdatingMemory(eggIdShell).get().updateProtein(slot, encrypted(typeShell), encrypted(structureShell))
        }
        return processEventsAndSync()
    }
}