環境:reactivemongoを使用したplay2.3
私は reactmongo coast-to-coast の記事を読み、記事の基礎が気に入りました。例の多くは現時点ではまだ私の理解を超えていますが、私はそこに到達しています.
このアプローチを検討する一環として、単純な連絡先 REST API を構築しています。メソッドは URL を介して親 ID を渡し、本文には残りが含まれます。引っかかっていることが3つあります。
- 最小/最大長などの検証ルールを文字列に追加するにはどうすればよいですか
- 文字列値をオプションにする方法
- パラメータをJson値に挿入するにはどうすればよいですか
- アドレスの Json 構造にサブセクションを追加するにはどうすればよいですか?
これを実装するより良い方法はありますか?
この最初のセクションは変換の詳細ですが、最大長の検証を追加し、一部のフィールドをオプションに変更したいと考えています。
val validateContact: Reads[JsObject] = (
(__ \ 'fullname).json.pickBranch and
(__ \ 'email).json.pickBranch( Reads.of[JsString] keepAnd Reads.email ) and
(__ \ 'phone).json.pickBranch and
(__ \ 'mobile).json.pickBranch( Reads.of[JsString] ) and
(__ \ 'labels).json.copyFrom(labelsOrEmptyArray)
//TODO: include address { street1, city, state, zip }
).reduce
val validateLabels = Reads.verifyingIf( (arr: JsArray) => !arr.value.isEmpty)(Reads.list[String])
val labelsOrEmptyArray = ((__ \ 'labels).json.pick[JsArray] orElse Reads.pure(Json.arr())) andThen validateLabels
val generateId = (__ \ '_id \ '$oid).json.put( JsString(BSONObjectID.generate.stringify) )
val generateCreated = (__ \ 'created \ '$date).json.put( JsNumber((new java.util.Date).getTime) )
val addMongoIdAndDate: Reads[JsObject] = __.json.update( (generateId and generateCreated).reduce )
これはコントローラーでの REST 呼び出しです。Mongo に保存するために Json に追加する必要がある parentid パラメータに注意してください。
def create(parentid:BSONObjectID) = Action.async(parse.json) { implicit request =>
request.body.transform(validateContact andThen addMongoIdAndDate).map { result =>
collection.insert(result).map { LastError =>
Logger.debug(s"Successfully inserted with LastError: $LastError")
Created
}
}.getOrElse(Future.successful(BadRequest("Invalid json")))
}
「keepAnd Reads.maxLength(20)」を追加してもコンパイルされませんが、多くの例で使用されていますか? 検証機能セットを拡張して独自の機能を追加する方法はありますか?
Update1 : 私は Scala を学んでいるので、この時点で見落としたり誤解したりしている言語についていくつかの簡単なことがある可能性があります。しばらく前から Play1/Java に慣れてきました。
Update2 :「PickBranch」呼び出しが文字列値とオブジェクトを区別しないことにも気付きました。他の人々はそれにどう対処してきましたか。