Created
April 22, 2014 20:49
-
-
Save rbuckland/11193810 to your computer and use it in GitHub Desktop.
Sample to show / explain CommandMessage Enrichment of MetatData
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| 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