Padrão de código e exemplos

Leonardo Amaral 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ção json.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 um return 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.

Como a gente se saiu?

Guia de Uso

Logs e Debug

Contato