If you started with the Demo project, you should already be familiar with the Play’R way of defining resource and routing.
Let’s look at the controller definition in controllers/ColorController.scala:
object ColorController extends RestReadController[Color]
with ResourceCreate
with ResourceWrite {
val name = "color"
implicit val colorFormat = Json.format[Color]
def fromId(sid: String) = toInt(sid).flatMap(id => ColorContainer.get(id))
def list = Action { Ok(Json.toJson(ColorContainer.list)) }
def read(color: Color) = Action { Ok(Json.toJson(color)) }
def write(color: Color) = Action(parse.json) { request =>
val newColor = request.body.as[Color].copy(id=color.id)
ColorContainer.update(newColor)
Ok(Json.toJson(newColor))
}
def create = Action(parse.json){ request =>
val newColor = request.body.as[Color]
ColorContainer.add(newColor.name, newColor.rgb)
Created(Json.toJson(newColor))
}
}
Compared to the demo PersonController, this one uses a shortcut trait. RestReadController is equivalent to Resource with ReadResource
This resource also implements two new traits:
In this example implementation, all requests and response are serialized to and from JSON.
This resource is added to our application api in controllers/Application.scala:
...
val api = RestApiRouter()
.add(new RestResourceRouter(ColorController))
...
Here we have defined an API entry point (more routes will be added in the next examples) and added the controller.