Skip to end of metadata
Go to start of metadata

You are viewing an old version of this page. View the current version.

Compare with Current View Page History

« Previous Version 8 Next »

STEP 1

Add the below 2 urls in the api.txt file, located in the company directory (selfserve/XXX)
(requires shell access, the Forsta support team can do it, too):
better-params-api.rose.conceptsauce.io
public-survey-data-api.rose.conceptsauce.io
Knowledge base link - https://decipher.zendesk.com/hc/en-us/articles/360010277973-Generic-API-Call

STEP 2

Add the below 2 to your sample source:

<var name="param_id" required="1"/>
<var name="respondent_id" unique="1"/>

In order to successfully do the API call - we're parsing some symbols away from the JSON object so the system accepts it, the symbols ' and *

If any of these symbols is used in either the param_id or respondent_id variables - it will not return the correct result from the API call.

For example - instead of using respondent_id test123*/test123' it should just be test123

STEP 3

Add the below code to your survey:

Add the below code to your survey:
<exec cond="not gv.isSST()">
surveyDir = "https://XXXX.XXXX.com/survey/%(first)s?state=[state]" % {"first": gv.survey.path}
redirectTarget = "https://survey.rose.conceptsauce.io/?param_id=%(first)s&amp;respondent_id=%(second)s&amp;link=%(third)s" % {"first": param_id, "second": respondent_id, "third": surveyDir}

The survey url, the XXXX parts should be replaced with yours (could be seen by opening the survey)

STEP 3 + base64 options

Add the below code to your survey:

disableProds = {
	"shelf": {
	"set:disabled_products": [
		"9300605043855",
		"9310055537279"
	]
	}
}

findDisabledProds = "&amp;custom_params=" + str(disableProds).replace("'",'"').replace(" ","").encode("base64").replace("\n","").replace("\t","")

surveyDir = "https://XXXX.XXXX.com/survey/%(first)s?state=[state]" % {"first": gv.survey.path}
redirectTarget = "https://survey.rose.conceptsauce.io/?param_id=%(first)s&amp;respondent_id=%(second)s&amp;link=%(third)s%(disableProds)s" % {"first": param_id, "second": respondent_id, "third": surveyDir, "disableProds": findDisabledProds}

The survey url, the XXXX parts should be replaced with yours (could be seen by opening the survey)

STEP 4

Redirecting:

suspendExternal(redirectTarget)
</exec>

STEP 5

JSON object needed for first API request:

<textarea 
  label="apiRequest_1"
  where="execute,survey,report">
  <title>hidden: api request 1</title>
  <exec>
createJson = {
	"event_type": "params_crud",
	"action": "get_params",
	"data": {
		"params_id": param_id
	}
}
thisQuestion.val = str(createJson).replace("'",'*').replace('*','"')
  </exec>
</textarea>

<suspend/>

STEP 6

The first API request, using Decipher’s build in logic node:

<logic label="logic_apiRequest_1" api:data="apiRequest_1.unsafe_val" api:method="POST" api:url="https://better-params-api.rose.conceptsauce.io/api" uses="api.1"/>
<suspend/>

STEP 7

If API call successful - create the needed JSON object for the second API request:

<textarea 
  label="hResult_apiRequest_1"
  where="execute,survey,report">
  <title>hidden: api request 1 response</title>
  <exec>
findApi = logic_apiRequest_1

if findApi.status == 200:
	response = findApi.r
	survey_id = str(response["data"]["params"]["survey_id"])
  
	createJson = {
		"event_type": "survey_data_request",
		"action": "get_shop_shelf_summary_purchases",
		"data": {
			"target": {
				"survey_id": survey_id,
				"respondent_id": respondent_id,
				"block_id": "shelf"
			}
		}
	}

	thisQuestion.val = str(createJson).replace("'",'*').replace('*','"')
  </exec>

</textarea>

<suspend/>

STEP 8

Second API request:

<logic label="logic_apiRequest_2" cond="hResult_apiRequest_1.val not in ['', None]" api:data="hResult_apiRequest_1.unsafe_val" api:method="POST" api:url="https://public-survey-data-api.rose.conceptsauce.io/api" uses="api.1"/>

STEP 9

Saving the total_unique_sku value:

<number 
  label="hTotal_Unique_Sku"
  size="3"
  where="execute,survey,report">
  <title>Hidden: total_unique_sku</title>
  <exec>
findApi = logic_apiRequest_2

if findApi.status == 200:
	response = findApi.r
	thisQuestion.val = response["data"]["basket_summary"]["total_unique_sku"]
  </exec>

</number>

<suspend/>

STEP 10

Saving the total_value of basket:

<float 
  label="hTotal_Value"
  size="3"
  where="execute,survey,report">
  <title>Hidden: total_value</title>
  <exec>
findApi = logic_apiRequest_2

if findApi.status == 200:
	response = findApi.r
	thisQuestion.val = response["data"]["basket_summary"]["total_value"]
  </exec>

</float>

<suspend/>

STEP 11 - Final step 🥳

Saving each selected product:

<checkbox 
  label="hSku_List"
  where="execute,survey,report">
  <title>Hidden: sku_list</title>
  <exec>
findApi = logic_apiRequest_2

if findApi.status == 200:
	response = findApi.r
	findItems = response["data"]["basket_summary"]["sku_list"].split(",")
	
	for x in findItems:
		try:
			thisQuestion.attr("r" + x.replace(" ", "")).val = 1
		except:
			pass
  </exec>

  <row label="r5053827111157">5053827111157</row>
  <row label="r5053827114332">5053827114332</row>
  <row label="r9417986939919">9417986939919</row>
  <row label="r9300605088085">9300605088085</row>
  <row label="r9300605043855">9300605043855</row>
  <row label="r9310055537279">9310055537279</row>
  <row label="r9310055536593">9310055536593</row>
  <row label="r9310055100046">9310055100046</row>
  <row label="r9310055537194">9310055537194</row>
  <row label="r9310055790919">9310055790919</row>
  <row label="r5414624321000">5414624321000</row>
  <row label="r9310055100220">9310055100220</row>
</checkbox>

<suspend/>

And here is all the code in one script:

<exec cond="not gv.isSST()">
surveyDir = "https://XXXX.XXXX.com/survey/%(first)s?state=[state]" % {"first": gv.survey.path}
redirectTarget = "https://survey.rose.conceptsauce.io/?param_id=%(first)s&amp;respondent_id=%(second)s&amp;link=%(third)s" % {"first": param_id, "second": respondent_id, "third": surveyDir}
	
suspendExternal(redirectTarget)
</exec>

<textarea 
  label="apiRequest_1"
  where="execute,survey,report">
  <title>hidden: api request 1</title>
  <exec>
createJson = {
	"event_type": "params_crud",
	"action": "get_params",
	"data": {
		"params_id": param_id
	}
}

thisQuestion.val = str(createJson).replace("'",'*').replace('*','"')
  </exec>

</textarea>

<suspend/>

<logic label="logic_apiRequest_1" api:data="apiRequest_1.unsafe_val" api:method="POST" api:url="https://better-params-api.rose.conceptsauce.io/api" uses="api.1"/>
<suspend/>

<textarea 
  label="hResult_apiRequest_1"
  where="execute,survey,report">
  <title>hidden: api request 1 response</title>
  <exec>
findApi = logic_apiRequest_1

if findApi.status == 200:
	response = findApi.r
	survey_id = str(response["data"]["params"]["survey_id"])
  
	createJson = {
		"event_type": "survey_data_request",
		"action": "get_shop_shelf_summary_purchases",
		"data": {
			"target": {
				"survey_id": survey_id,
				"respondent_id": respondent_id,
				"block_id": "shelf"
			}
		}
	}

	thisQuestion.val = str(createJson).replace("'",'*').replace('*','"')
  </exec>

</textarea>

<suspend/>

<logic label="logic_apiRequest_2" cond="hResult_apiRequest_1.val not in ['', None]" api:data="hResult_apiRequest_1.unsafe_val" api:method="POST" api:url="https://public-survey-data-api.rose.conceptsauce.io/api" uses="api.1"/>
<number 
  label="hTotal_Unique_Sku"
  size="3"
  where="execute,survey,report">
  <title>Hidden: total_unique_sku</title>
  <exec>
findApi = logic_apiRequest_2

if findApi.status == 200:
	response = findApi.r
	thisQuestion.val = response["data"]["basket_summary"]["total_unique_sku"]
  </exec>

</number>

<suspend/>

<float 
  label="hTotal_Value"
  size="3"
  where="execute,survey,report">
  <title>Hidden: total_value</title>
  <exec>
findApi = logic_apiRequest_2

if findApi.status == 200:
	response = findApi.r
	thisQuestion.val = response["data"]["basket_summary"]["total_value"]
  </exec>

</float>

<suspend/>

<checkbox 
  label="hSku_List"
  where="execute,survey,report">
  <title>Hidden: sku_list</title>
  <exec>
findApi = logic_apiRequest_2

if findApi.status == 200:
	response = findApi.r
	findItems = response["data"]["basket_summary"]["sku_list"].split(",")
	
	for x in findItems:
		try:
			thisQuestion.attr("r" + x.replace(" ", "")).val = 1
		except:
			pass
  </exec>

  <row label="r5053827111157">5053827111157</row>
  <row label="r5053827114332">5053827114332</row>
  <row label="r9417986939919">9417986939919</row>
  <row label="r9300605088085">9300605088085</row>
  <row label="r9300605043855">9300605043855</row>
  <row label="r9310055537279">9310055537279</row>
  <row label="r9310055536593">9310055536593</row>
  <row label="r9310055100046">9310055100046</row>
  <row label="r9310055537194">9310055537194</row>
  <row label="r9310055790919">9310055790919</row>
  <row label="r5414624321000">5414624321000</row>
  <row label="r9310055100220">9310055100220</row>
</checkbox>

<suspend/>

Also attached is a JPG to explain all the code in one place:

  • No labels