{"section":"tutorials","requestedLocale":"pt","requestedSlug":"primeiros-passos-code-action","locale":"pt","slug":"primeiros-passos-code-action","path":"docs/pt/tutorials/weni-by-vtex/primeiros-passos-code-action.md","branch":"main","content":"Code action é uma ferramente que possibilita a criação de um microsserviço em Python que pode ser usado diretamente na plataforma ou em um sistema externo.\n\n## Casos de uso\n\nO code action pode ser utilizado em diversos cenários, um deles seria o recebimento de webhook. Caso você precise receber algum tipo de webhook para iniciar determinada ação.\n\n## Primeiros passos\n\nPara utilizar esse serviço, é necessário que você possua alguma plataforma para requisição de APIs, como o [Postman](https://www.postman.com).\n\nCom o programa instalado, você deve baixar essa [collection](https://files.helpdocs.io/fjqoxc429v/other/1752841354595/code-acti.json) e importar para dentro do seu Postman.\n\n#### Autenticação\n\nPara que seja possível gerar esse token, você deverá fazer uma requisição para a API abaixo, passando seu **login** e **senha** utilizados na plataforma. Caso tenha autenticação de 2 fatores, você deverá preencher no campo de `totp` o código de 2 fatores.\n\n![](https://cdn.statically.io/gh/vtexdocs/help-center-content/refs/heads/main/docs/pt/tutorials/weni-by-vtex/code-action/primeiros-passos-code-action_1.png)\n\nEsse código tem validade de até 12h deverá ser utilizado em algumas das próximas APIs.\n\n#### Como criar um code action\n\nVocê pode ter dois tipos de Code Actions, são eles: JSON e HTML.\n\nCaso opte por JSON, o retorno do seu código, será específico para retornos do tipo JSON\n\nCaso opte por HTML, o retorno do seu código, estará preparado para retornar um HTML\n\nPara realizar a criação do tipo JSON, você poderá encontrar uma requisição chamada **create code action \\[python] -> json,** como segue na imagem abaixo.\n\n![](https://cdn.statically.io/gh/vtexdocs/help-center-content/refs/heads/main/docs/pt/tutorials/weni-by-vtex/code-action/primeiros-passos-code-action_2.png)\n\n![](https://cdn.statically.io/gh/vtexdocs/help-center-content/refs/heads/main/docs/pt/tutorials/weni-by-vtex/code-action/primeiros-passos-code-action_3.png)\n\nPara criar um código, como mostra na imagem acima, você precisará de alguns parâmetros como: **project_uuid**, **code_name** e **Bearer Token.**\n\n- **project_uuid**\n  - Essa informação você conseguirá pegar na URL do seu projeto na [Weni Plataforma](https://dash.weni.ai), como segue na imagem abaixo:\n\n![](https://cdn.statically.io/gh/vtexdocs/help-center-content/refs/heads/main/docs/pt/tutorials/weni-by-vtex/code-action/primeiros-passos-code-action_4.png)\n\n- **code_name**\n  - Essa informação deverá ser preenchido com o nome da sua preferência, de acordo com que for mais legível e didático.\n\nApós possuir essas informações, será importante que você crie seu código seguindo o padrão que você poderá ver em [Padrão de código e exemplos](#padrão-de-código-e-exemplos).\n\nLogo em seguida, você poderá ir para o body, como segue na imagem abaixo e executar a requisição.\n\n![](https://cdn.statically.io/gh/vtexdocs/help-center-content/refs/heads/main/docs/pt/tutorials/weni-by-vtex/code-action/primeiros-passos-code-action_5.png)\n\nColoque seu código dentro da parte de **raw** e o formato deverá ser **Text**. Após realizar a requisição, você deverá receber um retorno similar a este:\n\n![](https://cdn.statically.io/gh/vtexdocs/help-center-content/refs/heads/main/docs/pt/tutorials/weni-by-vtex/code-action/primeiros-passos-code-action_6.png)\n\nEsse ID será o identificador do seu código, salve-o em algum lugar, pois ele é importante para executar seu código.\n\n### Execução do código\n\nPara realizar a execução do código, será necessário pegar o ID do código que você criou na etapa anterior. Após isso você fará uma requisição passando o ID do seu código, como está na imagem abaixo:\n\n![](https://cdn.statically.io/gh/vtexdocs/help-center-content/refs/heads/main/docs/pt/tutorials/weni-by-vtex/code-action/primeiros-passos-code-action_7.png)\n\nNão é necessário passar as credenciais na request acima.O seu código poderá receber requests de qualquer tipo, como: GET, POST, PUT, DELETE... Seu código deverá estar adaptado para receber a request esperada. Para dúvidas relacionadas a como pegar dados da Query ou Body, você poderá visitar [Padrão de código e exemplos](#padrão-de-código-e-exemplos).\n\n## Padrão de código e exemplos\n\n### Códigos exemplares e funções\n\nPara que seja utilizado o Code Actions, algumas regras precisam ser seguidas. Entre elas, seria o formato do código. Abaixo segue um exemplo:\n\n```\nfrom requests import request\nimport json\n\ndef Run(engine):\n bd = engine.body\n bd_dict = json.loads(bd)\n\n if \"\"hookConfig\"\" in bd_dict:\n engine.result.set({\"\"Result\"\": \"\"Ok\"\"}, status_code=200, content_type=\"\"json\"\")\n return None\n else:\n order_id = bd_dict[\"\"OrderId\"\"]\n order_status = bd_dict[\"\"State\"\"]\n order_domain = bd_dict[\"\"Domain\"\"]\n\n token_flow = \"\"Token 20a75d5a-d35c-43c8-b435-449927ed1e4c\"\"\n\n vtex_json = get_order_data(order_id, token_flow)\n uuid = create_contact(vtex_json, token_flow, order_status=order_status, order_domain=order_domain)\n\n engine.result.set(response, status_code=status_code, content_type=\"\"json\"\")\n return None\n\ndef get_order_data(order_id: str, token):\n url_api_vtex = https://weni.myvtex.com\n vtex_app_token = \"\"20a75d5a-d35c-43c8-b435-449927ed1e4c\"\"\n vtex_app_key = \"\"20a75d5a-d35c-43c8-b435-449927ed1e4c\"\"\n\n url = f'{url_api_vtex}/api/oms/pvt/orders/{order_id}'\n\n headers = {\n 'X-VTEX-API-AppToken': f'{vtex_app_token}',\n 'X-VTEX-API-AppKey': f'{vtex_app_key}'\n }\n\n response = request(\"\"GET\"\", url=url, headers=headers)\n response = response.json()\n\n return response\n\ndef create_contact(vtex_data, token, order_status, order_domain):\n phone = vtex_data['clientProfileData'].get(\"\"phone\"\").replace(\"\"+\"\", \"\"\"\")\n name = f'{vtex_data[\"\"clientProfileData\"\"].get(\"\"firstName\"\")}\n shipping_estimated_date = vtex_data[\"\"shippingData\"\"][\"\"logisticsInfo\"\"][0][\"\"shippingEstimateDate\"\"]\n\n url = f\"\"https://flows.weni.ai/api/v2/contacts.json?urn=whatsapp:{phone}\"\"\n\n payload = json.dumps({\n \"\"name\"\": f\"\"{name}\"\",\n \"\"fields\"\": {\n \"\"phone\"\": phone,\n \"\"shippingestimatedate\"\": shipping_estimated_date,\n }\n })\n headers = {\n 'Authorization': token,\n 'Content-Type': 'application/json'\n }\n\n response = request(\"\"POST\"\", url=url, headers=headers, data=payload)\n response = response.json()\n\n uuid = response['uuid']\n\n return uuid\n```\n\nEsse 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.\n\n#### Regras\n\n- 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.\n\n- Para que consiga utilizar algumas funcionalidades, é necessário que você solicite uma função chamada **engine**, entro do seu **Run.** Exemplo:\n\n  ```\n  def Run(engine):\n  ```\n\n- 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.\n  - No código acima, o JSON esperado é algo parecido com este\n  - ```\n    {\n    \"\"Domain\"\": \"\"Marketplace\"\",\n    \"\"OrderId\"\": \"\"v40484048naf-01\"\",\n    \"\"State\"\": \"\"payment-approved\"\",\n    \"\"LastChange\"\": \"\"2019-07-29T23:17:30.0617185Z\"\",\n    \"\"Origin\"\": {\n    \"\"Account\"\": \"\"accountABC\"\",\n    \"\"Key\"\": \"\"vtexappkey-keyEDF\"\"\n    }\n    }\n    ```\n\n- Com isso, é possível pegar o OrderId utilizando as seguintes linhas\n  - ```\n    bd = engine.body\n    bd_dict = json.loads(bd)\n    order_id = bd_dict.get(\"\"OrderId\"\")\n    ```\n\n- Caso a informação esteja vindo através da Query da requisição, você deverá utilizar `engine.params.get(“”)`.\n- Caso seja necessário pegar os headers da requisição que está sendo recebida, poderá ser utilizado o seguinte comando\n\n```\ncustom_header = engine.header.get('Custom-Header')\nprint(custom_header) -> \"\"custom_header_value\"\"\n```\n\n- 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`\n  - O primeiro parâmetro que está com o valor **response,** será a resposta retornada pelo seu código quando o mesmo for requisitado.\n  - 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\\...)\n- 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](#logs-e-debug).\n\n## Logs e debug\n\n### Logs de execução\n\nDurante o processo de execução de código, como mencionado em [Padrão de código e exemplos](#padrão-de-código-e-exemplos), é possível que seja exibido logs de execução.\n\nToda vez que o código é executado, é gerada uma execução de código. Para que você consiga visualizar essa execução, você poderá realizar a request abaixo passando o **ID** do seu código.\n\n![](https://cdn.statically.io/gh/vtexdocs/help-center-content/refs/heads/main/docs/pt/tutorials/weni-by-vtex/code-action/primeiros-passos-code-action_8.png)\n\nApós fazer essa requisição, passando o ID do Código, você irá receber algumas informações como: o **resultado da execução**, parâmetro recebido na **query**, o **body** da request e o ID da execução.\n\nÉ possível realizar um filtro de tempo utilizando os parâmetros **after** e **before**, com eles você pegará apenas as execução de uma janela de tempo específica, eles esperam uma data/hora no padrão ISO 8601\\. Segue um exemplo\n\n![](https://cdn.statically.io/gh/vtexdocs/help-center-content/refs/heads/main/docs/pt/tutorials/weni-by-vtex/code-action/primeiros-passos-code-action_9.png)\n\nTambém é possível utilizar o parâmetro **page**, para conseguir paginar melhor as buscas.\n\n### Debugs\n\nCom o ID da execução retornado na request acima, você conseguirá pegar mais detalhes sobre uma determinada execução, como os debugs.\n\nVocê deverá fazer uma nova request para a API abaixo, passando o ID da execução.\n\n![](https://cdn.statically.io/gh/vtexdocs/help-center-content/refs/heads/main/docs/pt/tutorials/weni-by-vtex/code-action/primeiros-passos-code-action_10.png)\n\nVocê poderá usar o parâmetro **page**, similar na request anterior.Nese retorno acima, você terá o **content** e ele conterá o valor retornado no engine.log.debug, conforme ensinado em [Padrão de código e exemplos](#padrão-de-código-e-exemplos)."}