blob: 6fdf6f3a4d028e1fa4c77d02d7b52c5a79407b2f [file] [log] [blame]
/** Copyright 2015 TappingStone, Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package io.prediction.data.webhooks.examplejson
import io.prediction.data.webhooks.JsonConnector
import io.prediction.data.webhooks.ConnectorException
import org.json4s.Formats
import org.json4s.DefaultFormats
import org.json4s.JObject
/** Example JsonConnector with following types of webhooks JSON input:
*
* UserAction
*
* {
* "type": "userAction"
* "userId": "as34smg4",
* "event": "do_something",
* "context": {
* "ip": "24.5.68.47",
* "prop1": 2.345,
* "prop2": "value1"
* },
* "anotherProperty1": 100,
* "anotherProperty2": "optional1",
* "timestamp": "2015-01-02T00:30:12.984Z"
* }
*
* UserActionItem
*
* {
* "type": "userActionItem"
* "userId": "as34smg4",
* "event": "do_something_on",
* "itemId": "kfjd312bc",
* "context": {
* "ip": "1.23.4.56",
* "prop1": 2.345,
* "prop2": "value1"
* },
* "anotherPropertyA": 4.567,
* "anotherPropertyB": false,
* "timestamp": "2015-01-15T04:20:23.567Z"
* }
*/
private[prediction] object ExampleJsonConnector extends JsonConnector {
implicit val json4sFormats: Formats = DefaultFormats
override def toEventJson(data: JObject): JObject = {
val common = try {
data.extract[Common]
} catch {
case e: Exception => throw new ConnectorException(
s"Cannot extract Common field from ${data}. ${e.getMessage()}", e)
}
val json = try {
common.`type` match {
case "userAction" =>
toEventJson(common = common, userAction = data.extract[UserAction])
case "userActionItem" =>
toEventJson(common = common, userActionItem = data.extract[UserActionItem])
case x: String =>
throw new ConnectorException(
s"Cannot convert unknown type '${x}' to Event JSON.")
}
} catch {
case e: ConnectorException => throw e
case e: Exception => throw new ConnectorException(
s"Cannot convert ${data} to eventJson. ${e.getMessage()}", e)
}
json
}
def toEventJson(common: Common, userAction: UserAction): JObject = {
import org.json4s.JsonDSL._
// map to EventAPI JSON
val json =
("event" -> userAction.event) ~
("entityType" -> "user") ~
("entityId" -> userAction.userId) ~
("eventTime" -> userAction.timestamp) ~
("properties" -> (
("context" -> userAction.context) ~
("anotherProperty1" -> userAction.anotherProperty1) ~
("anotherProperty2" -> userAction.anotherProperty2)
))
json
}
def toEventJson(common: Common, userActionItem: UserActionItem): JObject = {
import org.json4s.JsonDSL._
// map to EventAPI JSON
val json =
("event" -> userActionItem.event) ~
("entityType" -> "user") ~
("entityId" -> userActionItem.userId) ~
("targetEntityType" -> "item") ~
("targetEntityId" -> userActionItem.itemId) ~
("eventTime" -> userActionItem.timestamp) ~
("properties" -> (
("context" -> userActionItem.context) ~
("anotherPropertyA" -> userActionItem.anotherPropertyA) ~
("anotherPropertyB" -> userActionItem.anotherPropertyB)
))
json
}
// Common required fields
case class Common(
`type`: String
)
// User Actions fields
case class UserAction (
userId: String,
event: String,
context: Option[JObject],
anotherProperty1: Int,
anotherProperty2: Option[String],
timestamp: String
)
// UserActionItem fields
case class UserActionItem (
userId: String,
event: String,
itemId: String,
context: JObject,
anotherPropertyA: Option[Double],
anotherPropertyB: Option[Boolean],
timestamp: String
)
}