Search code examples
scalaakkaakka-persistence

Best practice to validate Akka Persistence commands


Let's say we have a command AddUser:

case class AddUser(username: String, password: String)

What would be the best way to validate this command before you persist an event? Doing it in a way like this for example, seems kind of messy.

override def receiveCommand: Receive = {
    case AddUser(username, password) =>
      if (username.trim.length > 25) {
        sender() ! UsernameTooLong
      } else if (password.trim.length > 25) {
        sender() ! PasswordTooLong
      } else {
        persist(UserAdded(User(username, password))) {
          userAdded =>
            sender() ! userAdded
        }
      }
}

Solution

  • You need to use Receive Pipeline Pattern: http://doc.akka.io/docs/akka/2.4.1/contrib/receive-pipeline.html

    you can do something like this:

    trait AuthenticatedUser { this: ReceivePipeline =>
       pipelineInner {
        case msg@AddUser(username, password) => 
         if (username.trim.length > 25) {
            sender() ! UsernameTooLong
         } else if (password.trim.length > 25) {
            sender() ! PasswordTooLong
         } else {
           Inner(msg)
         }
       case msg => Inner(msg)
       }
    }
    
    class UserActor extends Actor with ReceivePipeline with AuthenticatedUser {
    
     def receive = {
       case AddUser(username, password) =>
        persist(UserAdded(User(username, password))) {
              userAdded =>
                sender() ! userAdded
            }
      }
    }
    

    PS: I have not compiled and tested this code, But I believe it will work, If there is any issue let me know.