Padrão de código e exemplos
Atualizado
por Leonardo Amaral
Códigos exemplares e funções
Para que seja utilizado o Code Actions, algumas regras precisam ser seguidas. Entre elas, seria o formato do código. Abaixo segue um exemplo:
from requests import request
import json
def Run(engine):
bd = engine.body
bd_dict = json.loads(bd)
if "hookConfig" in bd_dict:
engine.result.set({"Result": "Ok"}, status_code=200, content_type="json")
return None
else:
order_id = bd_dict["OrderId"]
order_status = bd_dict["State"]
order_domain = bd_dict["Domain"]
token_flow = "Token 20a75d5a-d35c-43c8-b435-449927ed1e4c"
vtex_json = get_order_data(order_id, token_flow)
uuid = create_contact(vtex_json, token_flow, order_status=order_status, order_domain=order_domain)
engine.result.set(response, status_code=status_code, content_type="json")
return None
def get_order_data(order_id: str, token):
url_api_vtex = https://weni.myvtex.com
vtex_app_token = "20a75d5a-d35c-43c8-b435-449927ed1e4c"
vtex_app_key = "20a75d5a-d35c-43c8-b435-449927ed1e4c"
url = f'{url_api_vtex}/api/oms/pvt/orders/{order_id}'
headers = {
'X-VTEX-API-AppToken': f'{vtex_app_token}',
'X-VTEX-API-AppKey': f'{vtex_app_key}'
}
response = request("GET", url=url, headers=headers)
response = response.json()
return response
def create_contact(vtex_data, token, order_status, order_domain):
phone = vtex_data['clientProfileData'].get("phone").replace("+", "")
name = f'{vtex_data["clientProfileData"].get("firstName")}
shipping_estimated_date = vtex_data["shippingData"]["logisticsInfo"][0]["shippingEstimateDate"]
url = f"https://flows.weni.ai/api/v2/contacts.json?urn=whatsapp:{phone}"
payload = json.dumps({
"name": f"{name}",
"fields": {
"phone": phone,
"shippingestimatedate": shipping_estimated_date,
}
})
headers = {
'Authorization': token,
'Content-Type': 'application/json'
}
response = request("POST", url=url, headers=headers, data=payload)
response = response.json()
uuid = response['uuid']
return uuid
Esse código tem a função de receber um Webhook da VTEX e conseguir consultar diretamente a API de Orders da VTEX e criar um contato na Weni Plataforma. Para isso ele segue algumas premissas.
Regras
- Esse código é uma lambda, então para que haja o funcionamento adequado, sempre será buscado a função Run. Sempre utilize e coloque a função Run em eu código.
- Para que consiga utilizar algumas funcionalidades, é necessário que você solicite uma função chamada engine, entro do seu Run. Exemplo:
def Run(engine):
- Sempre que for necessário acessar informações presentes no body da requisição recebida, elas estarão disponíveis em
engine.body
. No entanto, esse conteúdo não estará no formato JSON por padrão. Para convertê-lo em um dicionário Python, utilize a funçãojson.loads()
. Após essa conversão, os dados estarão prontos para serem manipulados normalmente no formato de objeto JSON.- No código acima, o JSON esperado é algo parecido com este
{
"Domain": "Marketplace",
"OrderId": "v40484048naf-01",
"State": "payment-approved",
"LastChange": "2019-07-29T23:17:30.0617185Z",
"Origin": {
"Account": "accountABC",
"Key": "vtexappkey-keyEDF"
}
}
- Com isso, é possível pegar o OrderId utilizando as seguintes linhas
bd = engine.body
bd_dict = json.loads(bd)
order_id = bd_dict.get("OrderId")
- Caso a informação esteja vindo através da Query da requisição, você deverá utilizar
engine.params.get(“”)
. - Para encerrar a execução do seu Code Action, será necessário chamar uma outra função que deverá ser:
engine.result.set(response, status_code=status_code, content_type="json")
seguida de umreturn None
- O primeiro parâmetro que está com o valor response, será a resposta retornada pelo seu código quando o mesmo for requisitado.
- O status_code, será responsável por você afirmar para o usuário qual o se seu código deu sucesso (Sendo um status_code 200, 201...) ou se seu código deu erro (400, 403, 404...)
- Caso você precise que seu código exiba algum tipo de registro durante o processamento, você pode utilizar a expressão:
engine.log.debug(”valor a ser exibido”)
, para mais informações de como visualizar essas logs acesse Logs e Debug.