Skip to content

Instantly share code, notes, and snippets.

@rbuckland
Created April 22, 2014 20:49
Show Gist options
  • Select an option

  • Save rbuckland/11193810 to your computer and use it in GitHub Desktop.

Select an option

Save rbuckland/11193810 to your computer and use it in GitHub Desktop.
Sample to show / explain CommandMessage Enrichment of MetatData
import org.joda.time.DateTime
import com.soqqo.luap.model.common.Address
import io.straight.fw.model.Uuid
import java.util.Date
import akka.actor.ActorRef
/*
* file: CampusMessages.scala
*/
sealed abstract class CampusEvent extends EventMessage
sealed abstract class CampusCommand extends CommandMessage
case class CampusESCommand(override val timestamp: Long, override val meta: MessageMetaData, override val cmd: CampusCommand) extends ESCommandMessage(timestamp,meta,cmd)
case class CampusESEvent(override val timestamp: Long, override val meta: MessageMetaData, override val event: CampusEvent) extends ESEventMessage(timestamp,meta,event)
case class AddCampus(name: String, address: Address) extends CampusCommand
case class NewCampusAdded(id: Uuid, name: String, address: Address) extends CampusEvent
/*
* file: CoreMessaging.scala
*/
abstract class ESMessage(val timestamp: Long, val meta: MessageMetaData, message:Message) extends Serializable
// this is the command we will send the Processor
abstract class ESCommandMessage(override val timestamp: Long, override val meta: MessageMetaData, val cmd:CommandMessage) extends ESMessage(timestamp, meta, cmd)
// This is the "ESEventMessage" is what akka-persistence persists
abstract class ESEventMessage(override val timestamp: Long, override val meta: MessageMetaData, val event:EventMessage) extends ESMessage(timestamp, meta, event)
/**
* All Messages will carry some Metadata contextual to the request.
* Most will be tenant/user bound.. some just tenant, and some no details
*/
abstract class MessageMetaData
case class ContextMetaData(accountTenant: Option[Uuid], user: Option[Uuid]) extends MessageMetaData
object CommandEnrichment {
implicit def wrapInESCommand(cmd: CampusCommand): ToESCommand[CampusESCommand] =
new ToESCommand[CampusESCommand]((account:Option[Uuid],user:Option[Uuid])
=> CampusESCommand(new Date().getTime,ContextMetaData(account,user),cmd))
}
class ToESCommand[A](op: (Option[Uuid], Option[Uuid]) => A) {
/** Converts a Command (as received by the client) into an ESCommand */
def toESCommand: A = op(None,None)
def toESCommand(account: Uuid): A = op(Some(account),None)
def toESCommand(account: Uuid, user: Uuid): A = op(Some(account),Some(user))
}
/*
* file: SprasyRoute.scala .. snippet.
*/
object Test {
import CommandEnrichment._
// accountId and userId are collected from Context (login etc)
val addCampusCmd = AddCampus("West Hill Campus",Address(addressType = "Actual",line1 = "West Hill",town="Downtown",postCode="AA12 6TA",country="Marvania"))
val processor: ActorRef = ...
processor ? addCampusCmd.toESCommand(accountId,userId)
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment