@@ -115,6 +115,28 @@ abstract class SimpleHandler extends DocumentHandler {
115115 * Key is an array which matches the view query key
116116 */
117117 protected def createKey (ddoc : String , view : String , startKey : List [Any ], js : JsObject ): JsArray
118+
119+ /**
120+ * Finds and transforms annotation with matching key.
121+ *
122+ * @param js js object having annotations array
123+ * @param key annotation key
124+ * @param vtr transformer function to map annotation value
125+ * @param default default value to use if no matching annotation found
126+ * @return annotation value matching given key
127+ */
128+ protected [database] def annotationValue [T ](js : JsObject , key : String , vtr : JsValue => T , default : T ): T = {
129+ js.fields.get(" annotations" ) match {
130+ case Some (JsArray (e)) =>
131+ e.view
132+ .map(_.asJsObject.getFields(" key" , " value" ))
133+ .collectFirst {
134+ case Seq (JsString (`key`), v : JsValue ) => vtr(v) // match annotation with given key
135+ }
136+ .getOrElse(default)
137+ case _ => default
138+ }
139+ }
118140}
119141
120142object ActivationHandler extends SimpleHandler {
@@ -177,42 +199,23 @@ object ActivationHandler extends SimpleHandler {
177199 }, name)
178200 }
179201
180- /**
181- * Finds and transforms annotation with matching key.
182- *
183- * @param js js object having annotations array
184- * @param key annotation key
185- * @param vtr transformer function to map annotation value
186- * @param default default value to use if no matching annotation found
187- * @return annotation value matching given key
188- */
189- protected [database] def annotationValue [T ](js : JsObject , key : String , vtr : JsValue => T , default : T ): T = {
190- js.fields.get(" annotations" ) match {
191- case Some (JsArray (e)) =>
192- e.view
193- .map(_.asJsObject.getFields(" key" , " value" ))
194- .collectFirst {
195- case Seq (JsString (`key`), v : JsValue ) => vtr(v) // match annotation with given key
196- }
197- .getOrElse(default)
198- case _ => default
199- }
200- }
201-
202202 private def dropNull (fields : JsField * ) = JsObject (fields.filter(_._2 != JsNull ): _* )
203203}
204204
205205object WhisksHandler extends SimpleHandler {
206206 val ROOT_NS = " rootns"
207+ val FULL_NAME = " fullname"
207208 private val commonFields = Set (" namespace" , " name" , " version" , " publish" , " annotations" , " updated" )
208209 private val actionFields = commonFields ++ Set (" limits" , " exec.binary" )
210+ private val actionVersionFields = commonFields ++ Set (" _id" )
209211 private val packageFields = commonFields ++ Set (" binding" )
210212 private val packagePublicFields = commonFields
211213 private val ruleFields = commonFields
212214 private val triggerFields = commonFields
213215
214216 protected val supportedTables = Set (
215217 " whisks.v2.1.0/actions" ,
218+ " whisks.v2.1.0/action-versions" ,
216219 " whisks.v2.1.0/packages" ,
217220 " whisks.v2.1.0/packages-public" ,
218221 " whisks.v2.1.0/rules" ,
@@ -223,13 +226,20 @@ object WhisksHandler extends SimpleHandler {
223226 case Some (JsString (namespace)) =>
224227 val ns = namespace.split(PATHSEP )
225228 val rootNS = if (ns.length > 1 ) ns(0 ) else namespace
226- JsObject ((ROOT_NS , JsString (rootNS)))
229+ js.fields.get(" name" ) match {
230+ case Some (JsString (name)) =>
231+ val fullName = s " $namespace$PATHSEP$name"
232+ JsObject ((ROOT_NS , JsString (rootNS)), (FULL_NAME , JsString (fullName)))
233+ case _ =>
234+ JsObject ((ROOT_NS , JsString (rootNS)))
235+ }
227236 case _ => JsObject .empty
228237 }
229238 }
230239
231240 override def fieldsRequiredForView (ddoc : String , view : String ): Set [String ] = view match {
232241 case " actions" => actionFields
242+ case " action-versions" => actionVersionFields
233243 case " packages" => packageFields
234244 case " packages-public" => packagePublicFields
235245 case " rules" => ruleFields
@@ -239,6 +249,7 @@ object WhisksHandler extends SimpleHandler {
239249
240250 def computeView (ddoc : String , view : String , js : JsObject ): JsObject = view match {
241251 case " actions" => computeActionView(js)
252+ case " action-versions" => computeActionVersionsView(js)
242253 case " packages" => computePackageView(js)
243254 case " packages-public" => computePublicPackageView(js)
244255 case " rules" => computeRulesView(js)
@@ -256,6 +267,7 @@ object WhisksHandler extends SimpleHandler {
256267
257268 def getEntityTypeForDesignDoc (ddoc : String , view : String ): String = view match {
258269 case " actions" => " action"
270+ case " action-versions" => " action"
259271 case " rules" => " rule"
260272 case " triggers" => " trigger"
261273 case " packages" | " packages-public" => " package"
@@ -288,6 +300,15 @@ object WhisksHandler extends SimpleHandler {
288300 val exec_binary = JsHelpers .getFieldPath(js, " exec" , " binary" )
289301 JsObject (base + (" exec" -> JsObject (" binary" -> exec_binary.getOrElse(JsFalse ))))
290302 }
303+
304+ private def computeActionVersionsView (js : JsObject ): JsObject = {
305+ val publish = annotationValue(js, " publish" , { v =>
306+ v.convertTo[Boolean ]
307+ }, true )
308+
309+ val base = js.fields.filterKeys(actionVersionFields).toMap
310+ JsObject (base + (" publish" -> publish.toJson))
311+ }
291312}
292313
293314object SubjectHandler extends DocumentHandler {
0 commit comments