All Downloads are FREE. Search and download functionalities are using the official Maven repository.

io.cafienne.bounded.cargosample.domain.CargoCommandValidators.scala Maven / Gradle / Ivy

/*
 * Copyright (C) 2016-2018 Cafienne B.V. 
 */

package io.cafienne.bounded.cargosample.domain

import akka.actor.ActorSystem
import akka.stream.ActorMaterializer
import io.cafienne.bounded.akka.ActorSystemProvider
import io.cafienne.bounded.akka.persistence.ReadJournalProvider
import io.cafienne.bounded.aggregate.ValidateableCommand
import io.cafienne.bounded.cargosample.domain.CargoDomainProtocol.{
  CargoDomainCommand,
  CargoNotFound,
  PlanCargo,
  SpecifyNewRoute
}

import scala.concurrent.Future

trait CargoCommandValidators {
  implicit val PlanCargoValidator: ValidateableCommand[PlanCargo]
  implicit val SpecifyNewRouteValidator: ValidateableCommand[SpecifyNewRoute]
}

trait ExistenceChecker extends ActorSystemProvider with ReadJournalProvider {
  implicit val materializer = ActorMaterializer()
  implicit val ec           = system.dispatcher

  def exists[A <: CargoDomainCommand](cmd: A): Future[A] =
    readJournal
      .currentEventsByPersistenceId(cmd.aggregateRootId.idAsString, 0, 1)
      .runFold(false)((_, _) => true)
      .flatMap(
        f =>
          if (f) Future.successful(cmd)
          else
            Future
              .failed(CargoNotFound(s"Cargo with id ${cmd.aggregateRootId} not found while processing command $cmd"))
      )
}

class CargoCommandValidatorsImpl(actorSystem: ActorSystem) extends CargoCommandValidators {

  implicit val PlanCargoValidator = new PlanCargoValidator()
  implicit val SpecifyNewRouteValidator =
    new CargoCommandValidator[SpecifyNewRoute](actorSystem)

}

class PlanCargoValidator() extends ValidateableCommand[PlanCargo] {
  override def validate(cmd: PlanCargo): Future[PlanCargo] = {
    Future.successful(cmd)
  }
}

class CargoCommandValidator[T <: CargoDomainCommand](actorSystem: ActorSystem)
    extends ValidateableCommand[T]
    with ExistenceChecker {
  override implicit def system: ActorSystem = actorSystem

  override def validate(cmd: T): Future[T] = exists[T](cmd)
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy