使用Scala和Playframework进行简单的CRUD

时间:2015-09-14 21:44:08

标签: json mongodb scala playframework

技术堆栈: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并更新现有对象?

解决此任务的最佳方法是什么?

0 个答案:

没有答案