diff --git a/src/main/scala/algoliasearch/api/IngestionClient.scala b/src/main/scala/algoliasearch/api/IngestionClient.scala index 8c698a2c..0d672ab0 100644 --- a/src/main/scala/algoliasearch/api/IngestionClient.scala +++ b/src/main/scala/algoliasearch/api/IngestionClient.scala @@ -12,7 +12,6 @@ import algoliasearch.ingestion.AuthenticationSortKeys._ import algoliasearch.ingestion.AuthenticationType._ import algoliasearch.ingestion.AuthenticationUpdate import algoliasearch.ingestion.AuthenticationUpdateResponse -import algoliasearch.ingestion.BatchWriteParams import algoliasearch.ingestion.DeleteResponse import algoliasearch.ingestion.Destination import algoliasearch.ingestion.DestinationCreate @@ -38,6 +37,7 @@ import algoliasearch.ingestion.ListTasksResponseV1 import algoliasearch.ingestion.ListTransformationsResponse import algoliasearch.ingestion.OrderKeys._ import algoliasearch.ingestion.PlatformWithNone +import algoliasearch.ingestion.PushTaskPayload import algoliasearch.ingestion.Run import algoliasearch.ingestion.RunListResponse import algoliasearch.ingestion.RunResponse @@ -1217,20 +1217,20 @@ class IngestionClient( * * @param taskID * Unique identifier of a task. - * @param batchWriteParams + * @param pushTaskPayload * Request body of a Search API `batch` request that will be pushed in the Connectors pipeline. */ - def pushTask(taskID: String, batchWriteParams: BatchWriteParams, requestOptions: Option[RequestOptions] = None)( - implicit ec: ExecutionContext + def pushTask(taskID: String, pushTaskPayload: PushTaskPayload, requestOptions: Option[RequestOptions] = None)(implicit + ec: ExecutionContext ): Future[RunResponse] = Future { requireNotNull(taskID, "Parameter `taskID` is required when calling `pushTask`.") - requireNotNull(batchWriteParams, "Parameter `batchWriteParams` is required when calling `pushTask`.") + requireNotNull(pushTaskPayload, "Parameter `pushTaskPayload` is required when calling `pushTask`.") val request = HttpRequest .builder() .withMethod("POST") .withPath(s"/2/tasks/${escape(taskID)}/push") - .withBody(batchWriteParams) + .withBody(pushTaskPayload) .build() execute[RunResponse](request, requestOptions) } diff --git a/src/main/scala/algoliasearch/ingestion/JsonSupport.scala b/src/main/scala/algoliasearch/ingestion/JsonSupport.scala index 1486b0f4..1c0d37ad 100644 --- a/src/main/scala/algoliasearch/ingestion/JsonSupport.scala +++ b/src/main/scala/algoliasearch/ingestion/JsonSupport.scala @@ -75,7 +75,8 @@ object JsonSupport { TriggerSerializer private def classMapSerializers: Seq[Serializer[_]] = Seq[Serializer[_]]() :+ - new ErrorBaseSerializer() + new ErrorBaseSerializer() :+ + new PushTaskRecordsSerializer() implicit val format: Formats = DefaultFormats ++ enumSerializers ++ oneOfsSerializers ++ classMapSerializers implicit val serialization: org.json4s.Serialization = org.json4s.native.Serialization diff --git a/src/main/scala/algoliasearch/ingestion/BatchRequest.scala b/src/main/scala/algoliasearch/ingestion/PushTaskPayload.scala similarity index 94% rename from src/main/scala/algoliasearch/ingestion/BatchRequest.scala rename to src/main/scala/algoliasearch/ingestion/PushTaskPayload.scala index 004810b3..04dfed26 100644 --- a/src/main/scala/algoliasearch/ingestion/BatchRequest.scala +++ b/src/main/scala/algoliasearch/ingestion/PushTaskPayload.scala @@ -25,12 +25,9 @@ package algoliasearch.ingestion import algoliasearch.ingestion.Action._ -/** BatchRequest - * - * @param body - * Operation arguments (varies with specified `action`). +/** PushTaskPayload */ -case class BatchRequest( +case class PushTaskPayload( action: Action, - body: Any + records: Seq[PushTaskRecords] ) diff --git a/src/main/scala/algoliasearch/ingestion/BatchWriteParams.scala b/src/main/scala/algoliasearch/ingestion/PushTaskRecords.scala similarity index 54% rename from src/main/scala/algoliasearch/ingestion/BatchWriteParams.scala rename to src/main/scala/algoliasearch/ingestion/PushTaskRecords.scala index a9203766..39b84b83 100644 --- a/src/main/scala/algoliasearch/ingestion/BatchWriteParams.scala +++ b/src/main/scala/algoliasearch/ingestion/PushTaskRecords.scala @@ -23,8 +23,47 @@ */ package algoliasearch.ingestion -/** Batch parameters. +import org.json4s.MonadicJValue.jvalueToMonadic +import org.json4s.{Extraction, Formats, JField, JObject, JValue, Serializer, TypeInfo} + +/** PushTaskRecords + * + * @param objectID + * Unique record identifier. */ -case class BatchWriteParams( - requests: Seq[BatchRequest] +case class PushTaskRecords( + objectID: String, + additionalProperties: Option[List[JField]] = None ) + +class PushTaskRecordsSerializer extends Serializer[PushTaskRecords] { + + override def deserialize(implicit format: Formats): PartialFunction[(TypeInfo, JValue), PushTaskRecords] = { + case (TypeInfo(clazz, _), json) if clazz == classOf[PushTaskRecords] => + json match { + case jobject: JObject => + val formats = format - this + val mf = manifest[PushTaskRecords] + val obj = Extraction.extract[PushTaskRecords](jobject)(formats, mf) + + val fields = Set("objectID") + val additionalProperties = jobject removeField { + case (name, _) if fields.contains(name) => true + case _ => false + } + additionalProperties.values match { + case JObject(fieldsList) => obj copy (additionalProperties = Some(fieldsList)) + case _ => obj + } + case _ => throw new IllegalArgumentException(s"Can't deserialize $json as PushTaskRecords") + } + } + + override def serialize(implicit format: Formats): PartialFunction[Any, JValue] = { case value: PushTaskRecords => + val formats = format - this // remove current serializer from formats to avoid stackoverflow + value.additionalProperties match { + case Some(fields) => Extraction.decompose(value.copy(additionalProperties = None))(formats) merge JObject(fields) + case None => Extraction.decompose(value)(formats) + } + } +}