Skip to content

Commit

Permalink
added: Add get/set personalizationStrategy for Personalization API
Browse files Browse the repository at this point in the history
  • Loading branch information
aseure committed Dec 17, 2018
1 parent a08f8ef commit 1ab4332
Show file tree
Hide file tree
Showing 8 changed files with 172 additions and 0 deletions.
1 change: 1 addition & 0 deletions src/main/scala/algolia/AlgoliaDsl.scala
Original file line number Diff line number Diff line change
Expand Up @@ -66,6 +66,7 @@ trait AlgoliaDsl
with AssignDsl
with RemoveDsl
with SendDsl
with SetDsl

object AlgoliaDsl extends AlgoliaDsl {

Expand Down
49 changes: 49 additions & 0 deletions src/main/scala/algolia/definitions/StrategyDefinition.scala
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
package algolia.definitions

import algolia.http.{GET, HttpPayload, POST}
import algolia.objects.Strategy
import algolia.objects.RequestOptions
import org.json4s.Formats
import org.json4s.native.Serialization.write

case class GetPersonalizationStrategyDefinition(requestOptions: Option[RequestOptions] = None)(
implicit val formats: Formats)
extends Definition {

override type T = GetPersonalizationStrategyDefinition

override def options(requestOptions: RequestOptions): GetPersonalizationStrategyDefinition =
copy(requestOptions = Some(requestOptions))

override private[algolia] def build(): HttpPayload = {
HttpPayload(
GET,
Seq("1", "recommendation", "personalization", "strategy"),
isSearch = true,
requestOptions = requestOptions
)
}

}

case class SetPersonalizationStrategyDefinition(
s: Strategy,
requestOptions: Option[RequestOptions] = None)(implicit val formats: Formats)
extends Definition {

override type T = SetPersonalizationStrategyDefinition

override def options(requestOptions: RequestOptions): SetPersonalizationStrategyDefinition =
copy(requestOptions = Some(requestOptions))

override private[algolia] def build(): HttpPayload = {
HttpPayload(
POST,
Seq("1", "recommendation", "personalization", "strategy"),
body = Some(write(s)),
isSearch = false,
requestOptions = requestOptions
)
}

}
12 changes: 12 additions & 0 deletions src/main/scala/algolia/dsl/GetDsl.scala
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@ package algolia.dsl

import algolia.AlgoliaDsl.ABTests
import algolia.definitions._
import algolia.objects.Strategy
import algolia.responses.{GetObject, Results, TopUserID, UserDataWithCluster}
import algolia.{AlgoliaClient, Executable}
import org.json4s.Formats
Expand Down Expand Up @@ -66,6 +67,9 @@ trait GetDsl {

def userID(userID: String) = GetUserIDDefinition(userID)

// Personalization
def personalizationStrategy() = GetPersonalizationStrategyDefinition()

}

implicit object GetObjectDefinitionExecutable
Expand Down Expand Up @@ -103,4 +107,12 @@ trait GetDsl {
}
}

implicit object GetPersonalizationStrategyExecutable
extends Executable[GetPersonalizationStrategyDefinition, Strategy] {
override def apply(client: AlgoliaClient, query: GetPersonalizationStrategyDefinition)(
implicit executor: ExecutionContext): Future[Strategy] = {
client.request[Strategy](query.build())
}
}

}
33 changes: 33 additions & 0 deletions src/main/scala/algolia/dsl/SetDsl.scala
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
package algolia.dsl

import algolia.{AlgoliaClient, Executable}
import algolia.definitions.{
GetPersonalizationStrategyDefinition,
SetPersonalizationStrategyDefinition
}
import algolia.inputs._
import algolia.objects.Strategy
import algolia.responses.SetStrategyResult
import org.json4s.Formats

import scala.concurrent.{ExecutionContext, Future}

trait SetDsl {
implicit val formats: Formats

case object set {

def personalizationStrategy(s: Strategy): SetPersonalizationStrategyDefinition =
SetPersonalizationStrategyDefinition(s)

}

implicit object SetPersonalizationStrategyExecutable
extends Executable[SetPersonalizationStrategyDefinition, SetStrategyResult] {
override def apply(client: AlgoliaClient, query: SetPersonalizationStrategyDefinition)(
implicit executor: ExecutionContext): Future[SetStrategyResult] = {
client.request[SetStrategyResult](query.build())
}
}

}
2 changes: 2 additions & 0 deletions src/main/scala/algolia/objects/Query.scala
Original file line number Diff line number Diff line change
Expand Up @@ -107,6 +107,8 @@ case class Query(
restrictSources: Option[String] = None,
/* Browse */
cursor: Option[String] = None,
/* Personalization */
enablePersonalization: Option[Boolean] = None,
/* CUSTOM */
customParameters: Option[Map[String, String]] = None) {

Expand Down
8 changes: 8 additions & 0 deletions src/main/scala/algolia/objects/Strategy.scala
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
package algolia.objects

case class Strategy(eventsScoring: Option[Map[String, ScoreType]] = None,
facetsScoring: Option[Map[String, Score]] = None)

case class ScoreType(score: Int, `type`: String)

case class Score(score: Int)
3 changes: 3 additions & 0 deletions src/main/scala/algolia/responses/Personalization.scala
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
package algolia.responses

case class SetStrategyResult(updatedAt: String)
64 changes: 64 additions & 0 deletions src/test/scala/algolia/dsl/StrategyTest.scala
Original file line number Diff line number Diff line change
@@ -0,0 +1,64 @@
package algolia.dsl

import algolia.AlgoliaDsl._
import algolia.AlgoliaTest
import algolia.http.{GET, HttpPayload, POST}
import algolia.objects.{Score, ScoreType, Strategy}

import scala.language.postfixOps

class StrategyTest extends AlgoliaTest {

describe("personalization strategy payloads") {

it("should produce empty set strategy payload") {
(set personalizationStrategy Strategy()).build() should be(
HttpPayload(
POST,
Seq("1", "recommendation", "personalization", "strategy"),
body = Some("{}"),
isSearch = false,
requestOptions = None
)
)
}

it("should produce non-empty set strategy payload") {
val strategy = Strategy(
eventsScoring = Some(
Map(
"event 1" -> ScoreType(10, "click"),
"event 2" -> ScoreType(20, "conversion")
)),
facetsScoring = Some(
Map(
"event 3" -> Score(30)
))
)

(set personalizationStrategy strategy).build() should be(
HttpPayload(
POST,
Seq("1", "recommendation", "personalization", "strategy"),
body = Some(
"""{"eventsScoring":{"event 1":{"score":10,"type":"click"},"event 2":{"score":20,"type":"conversion"}},"facetsScoring":{"event 3":{"score":30}}}"""),
isSearch = false,
requestOptions = None
)
)
}

it("should produce get strategy payload") {
(get personalizationStrategy).build() should be(
HttpPayload(
GET,
Seq("1", "recommendation", "personalization", "strategy"),
body = None,
isSearch = true,
requestOptions = None
)
)
}

}
}

0 comments on commit 1ab4332

Please sign in to comment.