> ## Documentation Index
> Fetch the complete documentation index at: https://docs.lerian.studio/llms.txt
> Use this file to discover all available pages before exploring further.

# Leitor tolerante

> Um padrão de design de integração que absorve mudanças na API da Lerian sem quebrar seu código cliente.

À medida que nossa API pública evolui para atender novos requisitos e aprimorar funcionalidades, integradores e clientes precisam se adaptar de forma transparente. Um padrão chave que suporta a resiliência a essas mudanças é o **Leitor Tolerante** (Tolerant Reader).

Ao adotar o padrão Leitor Tolerante, as integrações podem lidar melhor com novas informações sem atualizações frequentes. Essa abordagem reduz as necessidades de manutenção e aumenta a resiliência, criando uma experiência de integração mais fluida.

## O que é um leitor tolerante?

***

O padrão Leitor Tolerante é uma abordagem de design de integração em que um cliente que consome dados é construído para lidar com mudanças potenciais — como campos adicionados ou modificações menores na estrutura — de forma elegante. Esse padrão promove compatibilidade futura, reduzindo a necessidade de atualizações imediatas sempre que os dados ou o serviço evoluem.

## Cenário real

***

Considere uma requisição para `GET /organizations/{organization_id}`. Inicialmente, a resposta pode ser:

<CodeGroup>
  ```jsonon JSON theme={null}
  {
      "id": "cc15194a-6bc9-4ebb-b15d-43411a54ba4b",
      "parentOrganizationId": null,
      "legalName": "Empresa Teste Ltda",
      "legalDocument": "86820799000188",
      "metadata": null,
      "status": {
          "code": "ACTIVE",
          "description": null
      },
      "createdAt": "2024-02-08T16:59:31+0300",
      "updatedAt": "2024-02-08T16:59:31+0300",
      "deletedAt": null
  }
  ```
</CodeGroup>

Posteriormente, campos como `doingBusinessAs` e `address` podem ser adicionados:

<CodeGroup>
  ```jsonon JSON expandable theme={null}
  {
      "id": "cc15194a-6bc9-4ebb-b15d-43411a54ba4b",
      "parentOrganizationId": null,
      "legalName": "Empresa Teste Ltda",
      "doingBusinessAs": "Empresa Teste",
      "legalDocument": "86820799000188",
      "address": {
          "line1": "Rua Botucatu, 10",
          "line2": "Casa B",
          "zipCode": "04023060",
          "city": "São Paulo",
          "state": "SP",
          "country": "BR"
      },
      "metadata": null,
      "status": {
          "code": "ACTIVE",
          "description": null
      },
      "createdAt": "2024-02-08T16:59:31+0300",
      "updatedAt": "2024-02-08T16:59:31+0300",
      "deletedAt": null
  }
  ```
</CodeGroup>

Um cliente que segue o padrão Leitor Tolerante lidaria com os campos adicionais sem problemas, garantindo a continuidade do funcionamento.

## Implementando um leitor tolerante

***

Abaixo está um exemplo de código Python que processa campos adicionais de forma elegante, considerando mudanças no payload.

<CodeGroup>
  ```python Python expandable theme={null}
  def fetch_organization_info(organization_id):
      response = requests.get(f"{host}/organization/{organization_id}")
      org_info = response.json()

      # Fetch required fields
      legal_name = org_info.get("legalName", "Unknown")
      legal_document = org_info.get("legalDocument", "No document provided")

      # Handle optional fields
      doing_business_as = org_info.get("doingBusinessAs")

      # Nested address structure
      address_info = org_info.get("address", {})
      line1 = address_info.get("line1", "Address not provided")
      city = address_info.get("city", "City not provided")
      state = address_info.get("state", "State not provided")
      country = address_info.get("country", "Country not provided")

      # Display information
      print(f"Legal Name: {legal_name}, Legal Document: {legal_document}")
      print(f"Doing Business As: {doing_business_as}")
      print(f"Address: {line1}, {city}, {state}, {country}")

  # Example usage
  fetch_organization_info("cc15194a-6bc9-4ebb-b15d-43411a54ba4b")
  ```
</CodeGroup>

Neste exemplo, métodos `get` são usados para acessar valores de forma segura. Isso permite flexibilidade caso novos campos, como `phoneNumber`, sejam introduzidos, pois o código continua funcional mesmo se um campo estiver ausente.
