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