All Downloads are FREE. Search and download functionalities are using the official Maven repository.

fr.maif.izanami.models.Projects.scala Maven / Gradle / Ivy

package fr.maif.izanami.models

import play.api.libs.json.Format.GenericFormat
import play.api.libs.json.OFormat.oFormatFromReadsAndOWrites
import play.api.libs.json._

import java.util.UUID
import scala.util.matching.Regex

trait ProjectQueryResult

case class Project(id: UUID, name: String, features: List[LightWeightFeature] = List(), description: String) extends ProjectQueryResult

case class EmptyProjectRow() extends ProjectQueryResult

case class ProjectCreationRequest(name: String, description: String)

object Project {
  val projectReads: Reads[ProjectCreationRequest] = { json =>
    (json \ "name")
      .asOpt[String]
      .filter(name => PROJECT_REGEXP.pattern.matcher(name).matches())
      .map(name => JsSuccess(ProjectCreationRequest(name = name, description=(json \ "description").asOpt[String].getOrElse(""))))
      .getOrElse(JsError("Invalid project"))
  }
  private val PROJECT_REGEXP: Regex = "^[a-zA-Z0-9_-]+$".r

  implicit val dbProjectReads: Reads[Project] = { json =>
    {
      for (
        name <- (json \ "name").asOpt[String];
        id <- (json \ "id").asOpt[UUID];
        description   <- (json \ "description").asOpt[String]
      ) yield JsSuccess(Project(name = name, description=description, id=id))
    }.getOrElse(JsError("Error reading project"))
  }

  implicit val projectWrites: Writes[Project] = { project =>
    Json.obj(
      "name"     -> project.name,
      "id"     -> project.id,
      "features" -> {project.features.map(f => Feature.featureWrite.writes(f))},
      "description" -> project.description
    )
  }
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy