PassbirdMigration.kt
package de.pflugradts.passbird.application.boot.migration
import de.pflugradts.passbird.application.UserInterfaceAdapterPort
import de.pflugradts.passbird.application.boot.Bootable
import de.pflugradts.passbird.application.process.migration.AuthenticatedMigrationLocator
import de.pflugradts.passbird.application.process.migration.MigrationAuthenticationService
import de.pflugradts.passbird.application.process.migration.MigrationRequest
import de.pflugradts.passbird.application.process.migration.MigrationRunner
import de.pflugradts.passbird.application.util.SystemOperation
import de.pflugradts.passbird.domain.model.shell.Shell.Companion.shellOf
import de.pflugradts.passbird.domain.model.transfer.Output.Companion.outputOf
private const val MIGRATION_PROMPT =
"Migration required before using Passbird. Migration will run automatically. Make sure you have an up to date backup. " +
"If something goes wrong, revert to the previous version. Continue Y/n? "
private const val MIGRATION_SUCCESS = "Migration successful. Please start Passbird again"
class PassbirdMigration constructor(
private val authenticatedMigrationLocator: AuthenticatedMigrationLocator,
private val migrationAuthenticationService: MigrationAuthenticationService,
private val migrationRequest: MigrationRequest,
private val migrationRunner: MigrationRunner,
private val userInterfaceAdapterPort: UserInterfaceAdapterPort,
private val systemOperation: SystemOperation,
) : Bootable {
override fun boot() {
try {
if (migrationRequest.required && userInterfaceAdapterPort.receiveYes(outputOf(shellOf(MIGRATION_PROMPT)))) {
val pendingMigrations = migrationRequest + authenticatedMigrationLocator.detect()
migrationRunner.run(pendingMigrations)
userInterfaceAdapterPort.send(outputOf(shellOf(MIGRATION_SUCCESS)))
}
} finally {
migrationAuthenticationService.invalidate()
systemOperation.exit()
}
}
}