in common/scala/src/main/scala/org/apache/openwhisk/core/database/CouchDbRestClient.scala [64:145]
def putDoc(id: String, doc: JsObject): Future[Either[StatusCode, JsObject]] =
requestJson[JsObject](mkJsonRequest(HttpMethods.PUT, uri(db, id), doc, baseHeaders))
// http://docs.couchdb.org/en/1.6.1/api/document/common.html#put--db-docid
def putDoc(id: String, rev: String, doc: JsObject): Future[Either[StatusCode, JsObject]] =
requestJson[JsObject](mkJsonRequest(HttpMethods.PUT, uri(db, id), doc, baseHeaders ++ revHeader(rev)))
// http://docs.couchdb.org/en/2.1.0/api/database/bulk-api.html#inserting-documents-in-bulk
def putDocs(docs: Seq[JsObject]): Future[Either[StatusCode, JsArray]] =
requestJson[JsArray](
mkJsonRequest(HttpMethods.POST, uri(db, "_bulk_docs"), JsObject("docs" -> docs.toJson), baseHeaders))
// http://docs.couchdb.org/en/1.6.1/api/document/common.html#get--db-docid
def getDoc(id: String): Future[Either[StatusCode, JsObject]] =
requestJson[JsObject](mkRequest(HttpMethods.GET, uri(db, id), headers = baseHeaders))
// http://docs.couchdb.org/en/1.6.1/api/document/common.html#get--db-docid
def getDoc(id: String, rev: String): Future[Either[StatusCode, JsObject]] =
requestJson[JsObject](mkRequest(HttpMethods.GET, uri(db, id), headers = baseHeaders ++ revHeader(rev)))
// http://docs.couchdb.org/en/1.6.1/api/document/common.html#delete--db-docid
def deleteDoc(id: String, rev: String): Future[Either[StatusCode, JsObject]] =
requestJson[JsObject](mkRequest(HttpMethods.DELETE, uri(db, id), headers = baseHeaders ++ revHeader(rev)))
// http://docs.couchdb.org/en/1.6.1/api/ddoc/views.html
def executeView(designDoc: String, viewName: String)(startKey: List[Any] = Nil,
endKey: List[Any] = Nil,
skip: Option[Int] = None,
limit: Option[Int] = None,
stale: StaleParameter = StaleParameter.No,
includeDocs: Boolean = false,
descending: Boolean = false,
reduce: Boolean = false,
group: Boolean = false): Future[Either[StatusCode, JsObject]] = {
require(reduce || !group, "Parameter 'group=true' cannot be used together with the parameter 'reduce=false'.")
def any2json(any: Any): JsValue = any match {
case b: Boolean => JsBoolean(b)
case i: Int => JsNumber(i)
case l: Long => JsNumber(l)
case d: Double => JsNumber(d)
case f: Float => JsNumber(f)
case s: String => JsString(s)
case _ =>
logging.warn(
this,
s"Serializing uncontrolled type '${any.getClass}' to string in JSON conversion ('${any.toString}').")
JsString(any.toString)
}
def list2OptJson(lst: List[Any]): Option[JsValue] = {
lst match {
case Nil => None
case _ => Some(JsArray(lst.map(any2json): _*))
}
}
def bool2OptStr(bool: Boolean): Option[String] = if (bool) Some("true") else None
val args = Seq[(String, Option[String])](
"startkey" -> list2OptJson(startKey).map(_.toString),
"endkey" -> list2OptJson(endKey).map(_.toString),
"skip" -> skip.filter(_ > 0).map(_.toString),
"limit" -> limit.filter(_ > 0).map(_.toString),
"stale" -> stale.value,
"include_docs" -> bool2OptStr(includeDocs),
"descending" -> bool2OptStr(descending),
"reduce" -> Some(reduce.toString),
"group" -> bool2OptStr(group))
// Throw out all undefined arguments.
val argMap: Map[String, String] = args
.collect({
case (l, Some(r)) => (l, r)
})
.toMap
val viewUri = uri(db, "_design", designDoc, "_view", viewName).withQuery(Uri.Query(argMap))
requestJson[JsObject](mkRequest(HttpMethods.GET, viewUri, headers = baseHeaders))
}