app/models/ProjectSummary.scala (59 lines of code) (raw):

package models import io.circe.{Encoder, Json} import io.circe.generic.auto._ import io.circe.syntax._ import javax.activation.MimeType case class SummaryEntry(count:Int, size:Long) case class ProjectSummary (gnmType: Map[String,SummaryEntry], fileType: Map[String,SummaryEntry], mediaType: Map[String,SummaryEntry], hiddenFile:Map[Boolean,SummaryEntry], gnmProject:Map[String,SummaryEntry], total:SummaryEntry) { def addGnmType(newType:String, size:Long) = { val toUpdate = gnmType.getOrElse(newType, SummaryEntry(0,0)) val updated = toUpdate.copy(count=toUpdate.count+1, size=toUpdate.size+size) this.copy(gnmType=gnmType + (newType->updated)) } def addFileType(newType:String, size:Long) = { val toUpdate = fileType.getOrElse(newType, SummaryEntry(0,0)) val updated = toUpdate.copy(count=toUpdate.count+1, size=toUpdate.size+size) this.copy(fileType=fileType + (newType->updated)) } def addMediaType(mimeType:MimeType, size:Long) = { val typeName = if(mimeType.getPrimaryType!="application") mimeType.getPrimaryType else "data" val toUpdate = mediaType.getOrElse(typeName, SummaryEntry(0,0)) val updated = toUpdate.copy(count=toUpdate.count+1, size=toUpdate.size+size) this.copy(mediaType=mediaType + (typeName->updated)) } def addHiddenFile(isHidden:Boolean,size:Long) = { val toUpdate = hiddenFile.getOrElse(isHidden, SummaryEntry(0,0)) val updated = toUpdate.copy(count=toUpdate.count+1,size=toUpdate.size+size) this.copy(hiddenFile=hiddenFile + (isHidden->updated)) } def addGnmProject(projectId:String, size:Long) = { val toUpdate = gnmProject.getOrElse(projectId, SummaryEntry(0,0)) val updated = toUpdate.copy(count=toUpdate.count+1, size=toUpdate.size+size) this.copy(gnmProject=gnmProject + (projectId->updated)) } def addToTotal(size:Long) = { val updated = total.copy(count = total.count+1, size=total.size+size) this.copy(total=updated) } } object ProjectSummary { def apply(gnmType: Map[String, SummaryEntry], fileType: Map[String,SummaryEntry], mediaType: Map[String,SummaryEntry], hiddenFile: Map[Boolean, SummaryEntry], gnmProject: Map[String, SummaryEntry], total:SummaryEntry): ProjectSummary = new ProjectSummary(gnmType, fileType, mediaType, hiddenFile, gnmProject, total) def apply():ProjectSummary = ProjectSummary(Map(), Map(), Map(),Map(),Map(),SummaryEntry(0,0)) } class MapEntryEncoder[A:io.circe.Encoder] { implicit val encodeMap:Encoder[Map[A,SummaryEntry]] = new Encoder[Map[A,SummaryEntry]] { override final def apply(a: Map[A, SummaryEntry]): Json = { val tplList = a.map(entry=>(entry._1.toString, entry._2.asJson)).toIterable Json.fromFields(tplList) } } } trait ProjectSummaryEncoder { implicit val stringMapEncoder = new MapEntryEncoder[String].encodeMap implicit val boolMapEncoder = new MapEntryEncoder[Boolean].encodeMap }