GET /api/tag/$id<\d{8}-\d{4}-\d{4}-\d{4}-\d{12}> controllers.Tags.showById(id: java.util.UUID)package controllers
import play.api.mvc.{ Action, Controller }import models.Tagimport play.api.libs.json.Jsonimport java.util.UUIDimport play.api.libs.json.JsError
object Tags extends Controller {
def showById(id: UUID) = Action { implicit request => Tag.findById(id).map { tag => Ok(Json.toJson(tag)) }.getOrElse(NotFound) }
def showByName(name: String) = Action { implicit request => Tag.findByName(name).map { tag => Ok(Json.toJson(tag)) }.getOrElse(NotFound) }
}package models
import play.api.libs.json._import play.api.libs.json.util._import play.api.libs.json.Reads._import play.api.libs.functional.syntax._import java.util.UUID
case class Tag( id: Option[UUID] = None, name: String, description: String)
object Tag {
implicit object UUIDFormat extends Format[UUID] { def writes(uuid: UUID): JsValue = JsString(uuid.toString()) def reads(json: JsValue): JsResult[UUID] = json match { case JsString(x) => JsSuccess(UUID.fromString(x)) case _ => JsError("Expected UUID as JsString") } }
implicit val tagRead = ( (__ \ 'id).readNullable[UUID] and (__ \ 'name).read[String] and (__ \ 'description).read[String])(Tag.apply _)
implicit val tagWrite = ( (__ \ 'id).writeNullable[UUID] and (__ \ 'name).write[String] and (__ \ 'description).write[String])(unlift(Tag.unapply))
var tags = Set( Tag(Some(UUID.randomUUID()), "Tag1", "First Tag"), Tag(Some(UUID.randomUUID()), "Tag2", "Second Tag"))
def add(tag: Tag) { val newTag = Tag(Some(UUID.randomUUID()), tag.name, tag.description) this.tags = this.tags + newTag }
def findAll = this.tags.toList.sortBy(_.name)
def findById(id: UUID): Option[Tag] = this.tags.find(_.id == Option[UUID](id))
def findByName(name: String): Option[Tag] = this.tags.find(_.name == name)
}package util
import java.util.UUIDimport play.api.mvc.PathBindable
object Binders { implicit def uuidPathBinder = new PathBindable[UUID] { override def bind(key: String, value: String): Either[String, UUID] = { Right(UUID.fromString(value)) } override def unbind(key: String, id: UUID): String = { id.toString } } }import sbt._import Keys._import play.Project._
object ApplicationBuild extends Build {
val appName = "things" val appVersion = "1.0-SNAPSHOT"
val appDependencies = Seq( // Add your project dependencies here, jdbc, anorm )
val main = play.Project(appName, appVersion, appDependencies).settings( routesImport += "util.Binders._" )
}package models
import java.util.UUIDimport play.api.libs.json.Jsonimport play.api.libs.json.JsSuccessimport play.api.libs.json.JsErrorimport play.api.libs.json.JsResultimport play.api.libs.json.JsStringimport play.api.libs.json.JsValueimport play.api.libs.json.Format
case class Thing(id: Option[UUID] = None, name: String)
object Thing {
implicit object UUIDFormat extends Format[UUID] { def writes(uuid: UUID): JsValue = JsString(uuid.toString()) def reads(json: JsValue): JsResult[UUID] = json match { case JsString(x) => JsSuccess(UUID.fromString(x)) case _ => JsError("Expected UUID as JsString") } }
implicit val thingWrite = Json.writes[Thing]
implicit val thingRead = Json.reads[Thing]
var things = Set( Thing(Some(UUID.randomUUID()), "Thing1"), Thing(Some(UUID.randomUUID()), "Thing2"))
def findAll = this.things.toList.sortBy(_.name)
def findById(id: UUID): Option[Thing] = this.things.find(_.id == Option[UUID](id))
def findByName(name: String): Option[Thing] = this.things.find(_.name == name)
}package controllers
import play.api._import play.api.mvc._import models.Thingimport play.api.libs.json.Jsonimport java.util.UUID
object Things extends Controller { def list = Action { implicit request => val things = Thing.findAll Ok(Json.toJson(things)) } def showById(id: UUID) = Action { implicit request => Thing.findById(id).map { thing => Ok(Json.toJson(thing)) }.getOrElse(NotFound) }
def showByName(name: String) = Action { implicit request => Thing.findByName(name).map { thing => Ok(Json.toJson(thing)) }.getOrElse(NotFound) }
}# Routes# This file defines all application routes (Higher priority routes first)# ~~~~
# Home pageGET / controllers.Application.index
# ThingsGET /api/things controllers.Things.listGET /api/thing/$id<\d{8}-\d{4}-\d{4}-\d{4}-\d{12}> controllers.Things.showById(id: java.util.UUID)GET /api/thing/:name controllers.Things.showByName(name: String)
# Map static resources from the /public folder to the /assets URL path
{ "id": "77de82f1-691a-4e97-880d-d662823b875e", "name": "Thing1"}GET / controllers.Application.index
# ThingsGET /api/things controllers.Things.listGET /api/thing/$id<\d{8}-\d{4}-\d{4}-\d{4}-\d{12}> controllers.Things.showById(id: java.util.UUID)GET /api/thing/:name controllers.Things.showByName(name: String)
# Map static resources from the /public folder to the /assets URL pathpackage util
import play.api.mvc.PathBindable
object Binders { implicit def uuidPathBinder = new PathBindable[java.util.UUID] { override def bind(key: String, value: String): Either[String, java.util.UUID] = { Right(java.util.UUID.fromString(value)) } override def unbind(key: String, id: java.util.UUID): String = { id.toString } } }GET /api/thing/$id<[0-9a-z]{8}-[0-9a-z]{4}-[0-9a-z]{4}-[0-9a-z]{4}-[0-9a-z]{12}> controllers.Things.showById(id: java.util.UUID)