技术堆栈:Scala,PlayFramework 2.3.8,MongoDB(Salat + casbah)。
我正在使用简单的CRUD开发一些restful API。
实体:
case class Company(
_id: ObjectId = new ObjectId,
user_id: Any = "",
cinema_id: Int = 0,
name: String = "",
status: String = "",
releaseId: Int, fileId: Int,
date: CompanyDate,
showTime: List[Int] = List())
case class CompanyDate(start: DateTime, end: DateTime)
我创建了用于从JSON创建对象的Read:
def createFromJson(json: JsValue, user: User): Reads[Company] = {
val user_id = (for {
cinema_id <- (json \ "cinema_id").asOpt[Int]
cinema <- user.cinema.find(_.id == cinema_id)
} yield cinema.getUser(user._id.toString)
).getOrElse(0)
(
Reads.pure(new ObjectId) and
Reads.pure[Any](user_id).filter(ValidationError("You have no access to this cinema"))(_ != 0) and
(__ \ "cinema_id").read[Int] and
(__ \ "name").read[String](minLength[String](1) keepAnd maxLength[String](100)) and
Reads.pure[String]("new") and
(__ \ "release_id").read[Int] and
(__ \ "file_id").read[Int] and
(__ \ "date").read[CompanyDate] and
(__ \ "show_time").read[List[Int]](minLength[List[Int]](1))
)(Company.apply _).flatMap(company => Reads { _ =>
if (company.date.start isAfter company.date.end) {
JsError(JsPath \ "date" \ "start" -> ValidationError("Start < end"))
} else {
JsSuccess(company)
}
})
}
我创建包装函数将用户传递给Reads,因为某些字段(user_id)从当前用户计算 - 客户端不知道这些信息。 它看起来有点难看,但工作正常。
用于创建操作的Controller非常简单,它需要json,将其强制转换为类并保存到DB。
下一步:更新。在更新方法中,我想重用一些验证案例(检查date.start&lt; date.end,例如),但我没有收到完整的对象。我的客户只向我发送了更改的字段。
某些字段(cinema_id和user_id)只能在创建对象时设置,无法更新。
示例请求(更新):
PUT /api/company/1
{
"name": "Name",
"status": "delete"
}
如何验证此json并更新现有对象?
解决此任务的最佳方法是什么?