def updateAction()

in s2rest_play/app/org/apache/s2graph/rest/play/controllers/CounterController.scala [183:246]


  def updateAction(service: String, action: String) = Action(s2parse.json) { request =>
    counterModel.findByServiceAction(service, action, useCache = false) match {
      case Some(oldPolicy) =>
        val body = request.body
        val autoComb = (body \ "autoComb").asOpt[Boolean].getOrElse(oldPolicy.autoComb)
        val dimension = (body \ "dimension").asOpt[String].getOrElse(oldPolicy.dimension)
        val useProfile = (body \ "useProfile").asOpt[Boolean].getOrElse(oldPolicy.useProfile)
        val bucketImpId = (body \ "bucketImpId").asOpt[String] match {
          case Some(s) => Some(s)
          case None => oldPolicy.bucketImpId
        }

        val useRank = (body \ "useRank").asOpt[Boolean].getOrElse(oldPolicy.useRank)

        val intervalUnit = (body \ "intervalUnit").asOpt[String] match {
          case Some(s) => Some(s)
          case None => oldPolicy.intervalUnit
        }

        val rateAction = (body \ "rateAction").asOpt[Map[String, String]]
        val rateBase = (body \ "rateBase").asOpt[Map[String, String]]
        val rateThreshold = (body \ "rateThreshold").asOpt[Int] match {
          case Some(i) => Some(i)
          case None => oldPolicy.rateThreshold
        }

        val rateActionId = {
          for {
            actionMap <- rateAction
            service <- actionMap.get("service")
            action <- actionMap.get("action")
            policy <- counterModel.findByServiceAction(service, action, useCache = false)
          } yield {
            policy.id
          }
        } match {
          case Some(i) => Some(i)
          case None => oldPolicy.rateActionId
        }
        val rateBaseId = {
          for {
            actionMap <- rateBase
            service <- actionMap.get("service")
            action <- actionMap.get("action")
            policy <- counterModel.findByServiceAction(service, action, useCache = false)
          } yield {
            policy.id
          }
        } match {
          case Some(i) => Some(i)
          case None => oldPolicy.rateBaseId
        }

        // new counter
        val policy = Counter(id = oldPolicy.id, useFlag = oldPolicy.useFlag, oldPolicy.version, service, action, oldPolicy.itemType, autoComb = autoComb, dimension,
          useProfile = useProfile, bucketImpId, useRank = useRank, oldPolicy.ttl, oldPolicy.dailyTtl, oldPolicy.hbaseTable, intervalUnit,
          rateActionId, rateBaseId, rateThreshold)

        counterModel.updateServiceAction(policy)
        Ok(Json.toJson(Map("msg" -> s"updated $service/$action")))
      case None =>
        NotFound(Json.toJson(Map("msg" -> s"$service.$action not found")))
    }
  }