app/actors/Audit.scala (34 lines of code) (raw):

package actors import akka.actor.{Actor, ActorSystem} import helpers.RangeHeader import javax.inject.{Inject, Singleton} import models.{AuditEvent, AuditFile, AuditRecord, AuditRecordDAO} import org.slf4j.LoggerFactory import scala.concurrent.ExecutionContext import scala.util.{Failure, Success} object Audit { sealed trait AuditMsg /* public messages that we expect to receive */ /** * log the given event as having occurred. An akka.actor.Status.Success or Failure message will be sent back * @param event event to log, as a value of [[AuditEvent]] * @param username user that performed the action * @param file optional [[AuditFile]] instance indicating the file that was affected */ case class LogEvent(event:AuditEvent.Value, username:String, file:Option[AuditFile], maybeRange:Seq[RangeHeader], notes:Option[String]=None, maybeBytes:Option[Long]=None) } @Singleton class Audit @Inject() (auditRecordDAO: AuditRecordDAO, actorSystem:ActorSystem) extends Actor{ import Audit._ private implicit val ec:ExecutionContext = actorSystem.dispatcher private val logger = LoggerFactory.getLogger(getClass) override def receive: Receive = { //log the given event as having occurred case LogEvent(event,username,file, maybeRange, maybeNotes, maybeBytes)=> val originalSender = sender() val rec = AuditRecord(event, username,file, maybeRange, maybeNotes, maybeBytes) auditRecordDAO.insert(rec).onComplete({ case Success(Some(_))=> logger.debug(s"recorded event $rec") originalSender ! akka.actor.Status.Success case Success(None)=> logger.error(s"Success reported for $rec but nothing written to database!") originalSender ! akka.actor.Status.Failure(new RuntimeException("Nothing written to database")) case Failure(err)=> logger.error(s"Could not record audit log: ", err) originalSender ! akka.actor.Status.Failure(err) }) } }