app/model/SectionAudit.scala (75 lines of code) (raw):

package model import com.amazonaws.services.dynamodbv2.document.Item import org.joda.time.DateTime import helpers.JodaDateTimeFormat._ import play.api.Logging import play.api.libs.functional.syntax._ import play.api.libs.json.{Format, JsPath, Json} import scala.util.control.NonFatal case class SectionAudit( sectionId: Long, operation: String, date: DateTime, user: String, description: String, sectionSummary: SectionSummary ) extends Audit { override def auditType = "section" override def resourceId = Some(sectionId.toString) override def message = None def toItem = Item.fromJSON(Json.toJson(this).toString()) } object SectionAudit extends Logging { implicit val sectionAuditFormat: Format[SectionAudit] = ( (JsPath \ "sectionId").format[Long] and (JsPath \ "operation").format[String] and (JsPath \ "date").format[DateTime] and (JsPath \ "user").format[String] and (JsPath \ "description").format[String] and (JsPath \ "sectionSummary").format[SectionSummary] )(SectionAudit.apply, unlift(SectionAudit.unapply)) def fromItem(item: Item) = try { Json.parse(item.toJSON).as[SectionAudit] } catch { case NonFatal(e) => { logger.error(s"failed to load section Audit ${item.toJSON}", e) throw e } } def created(section: Section)(implicit user: Option[String]): SectionAudit = { SectionAudit(section.id, "created", new DateTime(), user.getOrElse("unknown"), s"section '${section.name}' created", SectionSummary(section)) } def updated(section: Section)(implicit user: Option[String]): SectionAudit = { SectionAudit(section.id, "updated", new DateTime(), user.getOrElse("unknown"), s"section '${section.name}' updated", SectionSummary(section)) } def addedEdition(section: Section, editionName: String)(implicit user: Option[String]): SectionAudit = { SectionAudit(section.id, "added edition", new DateTime(), user.getOrElse("unknown"), s"added ${editionName} edition to section '${section.name}", SectionSummary(section)) } def removedEdition(section: Section, editionName: String)(implicit user: Option[String]): SectionAudit = { SectionAudit(section.id, "removed edition", new DateTime(), user.getOrElse("unknown"), s"removed ${editionName} edition from section '${section.name}", SectionSummary(section)) } } case class SectionSummary( sectionId: Long, name: String, path: String, editions: String ) object SectionSummary { implicit val tagAuditFormat: Format[SectionSummary] = ( (JsPath \ "sectionId").format[Long] and (JsPath \ "name").format[String] and (JsPath \ "path").format[String] and (JsPath \ "editions").format[String] )(SectionSummary.apply, unlift(SectionSummary.unapply)) def apply(section: Section): SectionSummary = new SectionSummary( sectionId = section.id, name = section.name, path = section.path, editions = section.editions.keys.mkString(" ") match { case "" => "No Editions" case e => e } ) }