Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -55,7 +55,7 @@ ConstructorIo.getSearchResults(query, selectedFacets?.map { it.key to it.value }
.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread())
.subscribe {
it.onValue {
it.searchData?.let {
it.response?.let {
view.renderData(it)
}
}
Expand All @@ -76,7 +76,7 @@ ConstructorIo.getBrowseResults(filterName, filterValue, selectedFacets?.map { it
.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread())
.subscribe {
it.onValue {
it.browseData?.let {
it.response?.let {
view.renderData(it)
}
}
Expand Down
27 changes: 14 additions & 13 deletions library/src/main/java/io/constructor/core/ConstructorIo.kt
Original file line number Diff line number Diff line change
Expand Up @@ -6,8 +6,9 @@ import io.constructor.data.ConstructorData
import io.constructor.data.DataManager
import io.constructor.data.local.PreferencesHelper
import io.constructor.data.memory.ConfigMemoryHolder
import io.constructor.data.model.Group
import io.constructor.data.model.Suggestion
import io.constructor.data.model.autocomplete.AutocompleteResponse
import io.constructor.data.model.common.Result
import io.constructor.data.model.common.ResultGroup
import io.constructor.data.model.search.SearchResponse
import io.constructor.data.model.browse.BrowseResponse
import io.constructor.injection.component.AppComponent
Expand Down Expand Up @@ -96,7 +97,7 @@ object ConstructorIo {
/**
* Returns a list of autocomplete suggestions
*/
fun getAutocompleteResults(query: String): Observable<ConstructorData<List<Suggestion>?>> {
fun getAutocompleteResults(query: String): Observable<ConstructorData<AutocompleteResponse>> {
val params = mutableListOf<Pair<String, String>>()
configMemoryHolder.autocompleteResultCount?.entries?.forEach {
params.add(Pair(Constants.QueryConstants.NUM_RESULTS+it.key, it.value.toString()))
Expand Down Expand Up @@ -156,19 +157,19 @@ object ConstructorIo {
/**
* Tracks autocomplete select events
*/
fun trackAutocompleteSelect(searchTerm: String, originalQuery: String, sectionName: String, group: Group? = null, resultID: String? = null) {
var completable = trackAutocompleteSelectInternal(searchTerm, originalQuery, sectionName, group, resultID);
fun trackAutocompleteSelect(searchTerm: String, originalQuery: String, sectionName: String, resultGroup: ResultGroup? = null, resultID: String? = null) {
var completable = trackAutocompleteSelectInternal(searchTerm, originalQuery, sectionName, resultGroup, resultID);
disposable.add(completable.subscribeOn(Schedulers.io()).subscribe({
context.broadcastIntent(Constants.EVENT_QUERY_SENT, Constants.EXTRA_TERM to searchTerm)
}, {
t -> e("Autocomplete Select error: ${t.message}")
}))
}
internal fun trackAutocompleteSelectInternal(searchTerm: String, originalQuery: String, sectionName: String, group: Group? = null, resultID: String? = null): Completable {
internal fun trackAutocompleteSelectInternal(searchTerm: String, originalQuery: String, sectionName: String, resultGroup: ResultGroup? = null, resultID: String? = null): Completable {
preferenceHelper.getSessionId(sessionIncrementHandler)
val encodedParams: ArrayList<Pair<String, String>> = arrayListOf()
group?.groupId?.let { encodedParams.add(Constants.QueryConstants.GROUP_ID.urlEncode() to it) }
group?.displayName?.let { encodedParams.add(Constants.QueryConstants.GROUP_DISPLAY_NAME.urlEncode() to it.urlEncode()) }
resultGroup?.groupId?.let { encodedParams.add(Constants.QueryConstants.GROUP_ID.urlEncode() to it) }
resultGroup?.displayName?.let { encodedParams.add(Constants.QueryConstants.GROUP_DISPLAY_NAME.urlEncode() to it.urlEncode()) }
resultID?.let { encodedParams.add(Constants.QueryConstants.RESULT_ID.urlEncode() to it.urlEncode()) }
return dataManager.trackAutocompleteSelect(searchTerm, arrayOf(
Constants.QueryConstants.AUTOCOMPLETE_SECTION to sectionName,
Expand All @@ -180,19 +181,19 @@ object ConstructorIo {
/**
* Tracks search submit events
*/
fun trackSearchSubmit(searchTerm: String, originalQuery: String, group: Group?) {
var completable = trackSearchSubmitInternal(searchTerm, originalQuery, group)
fun trackSearchSubmit(searchTerm: String, originalQuery: String, resultGroup: ResultGroup?) {
var completable = trackSearchSubmitInternal(searchTerm, originalQuery, resultGroup)
disposable.add(completable.subscribeOn(Schedulers.io()).subscribe({
context.broadcastIntent(Constants.EVENT_QUERY_SENT, Constants.EXTRA_TERM to searchTerm)
}, {
t -> e("Search Submit error: ${t.message}")
}))
}
internal fun trackSearchSubmitInternal(searchTerm: String, originalQuery: String, group: Group?): Completable {
internal fun trackSearchSubmitInternal(searchTerm: String, originalQuery: String, resultGroup: ResultGroup?): Completable {
preferenceHelper.getSessionId(sessionIncrementHandler)
val encodedParams: ArrayList<Pair<String, String>> = arrayListOf()
group?.groupId?.let { encodedParams.add(Constants.QueryConstants.GROUP_ID.urlEncode() to it) }
group?.displayName?.let { encodedParams.add(Constants.QueryConstants.GROUP_DISPLAY_NAME.urlEncode() to it.urlEncode()) }
resultGroup?.groupId?.let { encodedParams.add(Constants.QueryConstants.GROUP_ID.urlEncode() to it) }
resultGroup?.displayName?.let { encodedParams.add(Constants.QueryConstants.GROUP_DISPLAY_NAME.urlEncode() to it.urlEncode()) }
return dataManager.trackSearchSubmit(searchTerm, arrayOf(
Constants.QueryConstants.ORIGINAL_QUERY to originalQuery,
Constants.QueryConstants.EVENT to Constants.QueryValues.EVENT_SEARCH
Expand Down
Original file line number Diff line number Diff line change
@@ -1,12 +1,11 @@
package io.constructor.core

import io.constructor.data.model.Group
import io.constructor.data.model.Suggestion

import io.constructor.data.model.common.ResultGroup
import io.constructor.data.model.common.Result

interface ConstructorListener {
fun onSuggestionSelected(term: String, group: Group?, autocompleteSection: String?)
fun onSuggestionSelected(term: String, resultGroup: ResultGroup?, autocompleteSection: String?)
fun onQuerySentToServer(query: String)
fun onSuggestionsRetrieved(suggestions: List<Suggestion>)
fun onSuggestionsRetrieved(suggestions: List<Result>)
fun onErrorGettingSuggestions(error: Throwable)
}
Original file line number Diff line number Diff line change
@@ -1,14 +1,13 @@
package io.constructor.core

import io.constructor.data.model.Suggestion

import io.constructor.data.model.common.Result

interface SuggestionListener {
/**
* triggered after getting suggestions
* @param suggestions list of suggestions
*/
fun onSuggestionsResult(suggestions: List<Suggestion>)
fun onSuggestionsResult(suggestions: List<Result>)

/**
* triggered on error
Expand Down
46 changes: 26 additions & 20 deletions library/src/main/java/io/constructor/data/DataManager.kt
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
package io.constructor.data

import com.squareup.moshi.Moshi
import io.constructor.data.model.Suggestion
import io.constructor.data.model.autocomplete.AutocompleteResponse
import io.constructor.data.model.search.SearchResponse
import io.constructor.data.model.browse.BrowseResponse
import io.constructor.data.remote.ApiPaths
Expand All @@ -15,19 +15,25 @@ import javax.inject.Singleton
class DataManager @Inject
constructor(private val constructorApi: ConstructorApi, private val moshi: Moshi) {

fun getAutocompleteResults(text: String, params: Array<Pair<String, String>> = arrayOf()): Observable<ConstructorData<List<Suggestion>?>> = constructorApi.getAutocompleteResults(text, params.toMap()).map {
if (!it.isError) {
it.response()?.let {
if (it.isSuccessful) {
ConstructorData.of(it.body()?.sections?.suggestions)
} else {
ConstructorData.networkError(it.errorBody()?.string())
}
} ?: ConstructorData.error(it.error())
} else {
ConstructorData.error(it.error())
}
}.toObservable()
fun getAutocompleteResults(text: String, params: Array<Pair<String, String>> = arrayOf()): Observable<ConstructorData<AutocompleteResponse>> {
return constructorApi.getAutocompleteResults(text, params.toMap()).map {
if (!it.isError) {
it.response()?.let {
if (it.isSuccessful) {
val adapter = moshi.adapter(AutocompleteResponse::class.java)
val response = it.body()?.string()
val result = response?.let { adapter.fromJson(it) }
result?.rawData = response
ConstructorData.of(result!!)
} else {
ConstructorData.networkError(it.errorBody()?.string())
}
} ?: ConstructorData.error(it.error())
} else {
ConstructorData.error(it.error())
}
}.toObservable()
}

fun getSearchResults(text: String, encodedParams: Array<Pair<String, String>> = arrayOf()): Observable<ConstructorData<SearchResponse>> {
var dynamicUrl = "/${ApiPaths.URL_SEARCH.format(text)}"
Expand All @@ -40,9 +46,9 @@ constructor(private val constructorApi: ConstructorApi, private val moshi: Moshi
if (it.isSuccessful){
val adapter = moshi.adapter(SearchResponse::class.java)
val response = it.body()?.string()
val result = response?.let { adapter.fromJson(it) }
result?.rawData = response
ConstructorData.of(result!!)
val res = response?.let { adapter.fromJson(it) }
res?.rawData = response
ConstructorData.of(res!!)
} else {
ConstructorData.networkError(it.errorBody()?.string())
}
Expand Down Expand Up @@ -96,9 +102,9 @@ constructor(private val constructorApi: ConstructorApi, private val moshi: Moshi
if (it.isSuccessful){
val adapter = moshi.adapter(BrowseResponse::class.java)
val response = it.body()?.string()
val result = response?.let { adapter.fromJson(it) }
result?.rawData = response
ConstructorData.of(result!!)
val res = response?.let { adapter.fromJson(it) }
res?.rawData = response
ConstructorData.of(res!!)
} else {
ConstructorData.networkError(it.errorBody()?.string())
}
Expand Down

This file was deleted.

7 changes: 0 additions & 7 deletions library/src/main/java/io/constructor/data/model/Group.kt

This file was deleted.

5 changes: 0 additions & 5 deletions library/src/main/java/io/constructor/data/model/Product.kt

This file was deleted.

This file was deleted.

12 changes: 0 additions & 12 deletions library/src/main/java/io/constructor/data/model/Sections.kt

This file was deleted.

This file was deleted.

This file was deleted.

This file was deleted.

Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
package io.constructor.data.model.autocomplete

import com.squareup.moshi.Json
import io.constructor.data.model.common.*;
import java.io.Serializable

data class AutocompleteResponse (
@Json(name = "sections") val sections: Map<String, List<Result>>?,
@Json(name = "result_id") val resultId: String?,
var rawData: String?
) : Serializable

This file was deleted.

This file was deleted.

This file was deleted.

Original file line number Diff line number Diff line change
@@ -1,5 +1,10 @@
package io.constructor.data.model.browse

import com.squareup.moshi.Json
import java.io.Serializable

data class BrowseResponse(@Json(name = "response") val browseData: BrowseData, @Json(name = "result_id") val resultId: String, var rawData: String?)
data class BrowseResponse(
@Json(name = "response") val response: BrowseResponseInner?,
@Json(name = "result_id") val resultId: String?,
var rawData: String?
) : Serializable
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
package io.constructor.data.model.browse

import com.squareup.moshi.Json
import io.constructor.data.model.common.*;
import java.io.Serializable

data class BrowseResponseInner(
@Json(name = "facets") val facets: List<FilterFacet>?,
@Json(name = "groups") val groups: List<FilterGroup>?,
@Json(name = "results") val results: List<Result>?,
@Json(name = "sort_options") val filterSortOptions: List<FilterSortOption>? = null,
@Json(name = "total_num_results") val resultCount: Int
) : Serializable

This file was deleted.

Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
package io.constructor.data.model.common

import com.squareup.moshi.Json
import java.io.Serializable

data class FilterFacet(
@Json(name = "display_name") val displayName: String?,
@Json(name = "name") val name: String,
@Json(name = "status") val status: Map<String, Any>?,
@Json(name = "min") val min: Double?,
@Json(name = "max") val max: Double?,
@Json(name = "options") val options: List<FilterFacetOption>?,
@Json(name = "type") val type: String?
) : Serializable
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
package io.constructor.data.model.common

import com.squareup.moshi.Json
import java.io.Serializable

data class FilterFacetOption(
@Json(name = "count") val count: Int,
@Json(name = "display_name") val displayName: String?,
@Json(name = "status") val status: String?,
@Json(name = "value") val value: String?
) : Serializable
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
package io.constructor.data.model.common

import com.squareup.moshi.Json
import java.io.Serializable

data class FilterGroup(
@Json(name = "children") val children: List<FilterGroup>?,
@Json(name = "parents") val parents: List<FilterGroup>?,
@Json(name = "count") val count: Int?,
@Json(name = "display_name") val displayName: String,
@Json(name = "group_id") val groupId: String
) : Serializable
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
package io.constructor.data.model.common

import com.squareup.moshi.Json
import java.io.Serializable

data class FilterSortOption(
@Json(name = "display_name") val displayName: String,
@Json(name = "sort_by") val sortBy: String,
@Json(name = "sort_order") val sortOrder: String,
@Json(name = "status") val status: String
) : Serializable
Loading