---
# System prepended metadata

title: Integrations API

---

# Integrations API

- Nome da funcionalidade: integrations-api
- Data de início: 14/10/2020
- Discussão MR: [preencha depois da aprovação](https://code.locaweb.com.br/criador-sites/criador-discussions)
- Criador issue: [Dividir aplicação Criador de Sites](https://code.locaweb.com.br/criador-sites/criador-de-sites/issues/38)

## Resumo

O objetivo desse spike é compreender a viabilidade do desenvolvimento de uma api de integrações entre aplicações externas e as aplicações do criador.

## Motivação

Queremos tirar a responsabilidade de gerenciar integrações da app `criador-de-sites`.

- vantagens para o produto/time:
  - domínio de integrações definido;
  - remover a responsabilidade de gerenciar integrações do `criador-de-sites`;
  - melhorar a manutenibilidade do projeto;
  - escalabilidade.

- desvantagens:
  - aumento de complexidade do ecossistema;
  - esforço de remover o código da `criador-de-sites`.

### Questões levantadas

- Quais dados iremos armazenar, tendo como base as integrações já existentes ou que irão ser implementadas?

    > Para o _email marketing_ precisamos dos atributos `emkt_account_id`, `site_id` e `token` para autenticação.

    > Para a _yapay/tray_ precisamos dos atributos `site_id` e `token` da conta.

    > Para o _jivo chat_ precisamos dos atributos `site_id`, `token` da conta e `widget_id`.

- Iremos fazer esse controle via `accountId`?

    > Não, visto que o `site_id` é o atributo comum entre todas as integrações.

- Linguagem/frameworks

    > Poderiamos utilizar ruby on rails, a fim de reaproveitar componentes já existentes e refatorar alguns trechos com maior facilidade, ganhando mais velocidade no desenvolvimento.

    > Não existem desvantagens em relação a gerenciamento de memória ou performance, dado a natureza da aplicação ser mais simples (api, poucos modelos)

    > Uma desvantagem em utilizar outra linguagem (elixir, por exemplo) seria não poder reaproveitar componentes, gems, etc.

    > **Resultado da discussão com o time:**
    > **- O time tem preferência pessoal por elixir**
    > **- O framework phoenix é mais leve que rails**
    > **- Temos acesso ao console de produção em aplicações em elixir**

## Detalhes da solução
Ao criar a aplicação nova:

1. Precisaremos mover os modelos `Integrations` e `IntegrationProviders` da app `criador-de-sites` para a nova app.

**Observações:**

- No modelo atual, o `token` do jivochat está dentro de settings do `Site` e o `access_token` da yapay está dentro da tabela `Sites` da `YataStore`. Vamos ter que migrar esses `tokens` para a tabela de `Integrations`. 

- Para vender, o cliente precisa do `reseller token`, que atualmente usamos como variável de ambiente. Já que é um dado que é igual para todos os clientes com o plano loja, faz sentido mantermos assim.

- Sobre o fluxo de provisionamento/desprovisionamento: 
    - lembrar de adicionar automaticamente a conta (yapay) e a integração
    - lembrar de remover integração mas não deletar a conta criada (yapay)

```mermaid
classDiagram
  IntegrationProviders --* Integrations
  Sites --* Integrations
  class Integrations{
    +id: UUID
    +site_id: UUID
    +access_token: String
    +settings: JSONB
    +integration_provider_id: UUID
    create()
    updtate()
    delete()
    install()
    uninstall()
  }

  class IntegrationProviders{
    +id: UUID
    +name: String
    +description: String
    +image_src: String
    create()
    updtate()
    delete()
    login()
  }

  class Sites{
    +id: UUID
  }
```

2. Precisamos migrar os usuários do editor antigo para o novo e remover o modelo `TrayTransactions` da app `criador-de-sites`.

 ```mermaid
classDiagram
  TrayTransactions
  class TrayTransactions{
   +token_temp: String
   +token_transaction: String
    create()
    updtate()
    delete()
  }
 ```

3. Precisaremos mover o código (app `criador-de-sites`) das classes referentes a integração, como: `Integrations::Manager`, `Integrations::Providers::JivoChat`, `IntegrationsHelper`, `Store::YapayProvider`, `TrayServiceManager`, e outras relacionadas.

4. Refatorar o código para:
    4.1. Desacoplar o fluxo de integração e atualização de `Site` (app `criador-de-sites`).
    4.2. Remover views de integração e adicionar no novo painel.
    4.3. Remover código que não será mais necessáro.
    4.4. Efetuar comunicação entre painel novo e aplicação de integrações.

5. Utilizar o token a partir do modelo `Integrations`, ao invés do `tray_token` (que está no `Site`).

6. Renomear o que está relacionado com `tray` para `yapay`.

## Questões não resolvidas: O que ainda está pendente para execução dessa solução?

- Precisamos avaliar se é melhor deixar o atributo `token` dentro ou fora do JSONB no modelo `Integrations`.
    - **Resultado da discussão com o time: deixar do lado de fora**
- Parar de dar suporte para o editor 2.0? (`TrayController`)
    - **Resultado da discussão com o time:  sim**
- Enviar views relacionadas a integração para o novo painel?
    - **Resultado da discussão com o time:  sim**
- Para criar a nova app precisaremos provisionar máquinas, o que pode demorar. Precisamos de todos os sistemas mais atualizados possíveis (debian/ruby/rails)
