# 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)