# Propostas para o cenário de update ## Proposta 1 - Retornar objeto completo no POST, controlável por um header no Router Nesta proposta, as seguintes modificações seriam necessárias: ### WEALTHSYSTEMS - O integration Router deverá possuir um header para controle da possibilidade de mostrar/não mostrar o objeto inserido no MasterCRM na response da ação de *CREATE*/*UPSERT* para novos registros: - Header - Integration-Response - Valores suportados: - *full*: retorna o equivalente ao GET do registro inserido - *minimum*: Retorna somente os atributos id, createdAt e updatedAt - Ao omitir o header, o response retornado será equivalente a opção *minimum* - As APIs de integração precisam receber esta informação do Integration-Router para que possam controlar o retorno das ações de *CREATE* e *UPSERT* para novos registros; - Ação de update (PATCH) não realiza inserção de registros; - Para inserir, deve-se fazer uma requisição com a ação de create (POST); - Para atualizar, a requisição deve ser feita com a ação de update (PATCH); - Para remover registros da lista, deve-se usar a ação de delete (DELETE) no endpoint de manipulação de lista; ### TOTVS - Enviar a request de atualização Connector->MasterCRM com o header "Integration-Response" de acordo com o nível de resposta necessário; - Ao disparar uma requisição de ação create/upsert para um novo registro vindo do ERP com o header "Integration-Response:full", o Connector deverá ler este objeto que foi retornado no response e armazenar os IDs de todos os elementos presentes nas listas para poder atualizar o item do subrecurso futuramente; - Ao ler registros criados e atualizados pelo MasterCRM via GET, deverá ser armazenado no Connector todos os Ids de subrecursos para permitir atualização futura Connector->MasterCRM; #### Considerações sobre a proposta 1 - Existe um esforço feito de forma conjunta; - Para o piloto, poderá ser necessário comunicar o cliente que algumas entidades não poderão ser atualizadas pelo ERP, até que tenhamos esta abordagem implementada e testada; - Resolve o problema a médio/longo prazo das atualizações via PATCH e nos dá fôlego para futuramente pensar em propostas para facilitar este cenário; #### Estimativas - WS: 30 h ( 2 h por endpoint + 4 h Integration Router + testes) --- ## Proposta 2 - Usar o external_id para operação específica para processamento de PATCH em subrecursos Nesta proposta, as seguintes modificações seriam necessárias: ### WEALTHSYSTEMS - Ao invés de usar o ID para fazer a atualização do item da lista nas requisições de ação update (PATCH), usaremos o atributo *externalId* ### TOTVS - Informar em todos os diagramas **Connector->Master CRM** em requisições de PATCH, em subrecursos, os dados que identifiquem de forma única e exclusiva um registro da lista pelo campo *externalId* ### Exemplo: `[ { "op": "replace-by-external", "path": "/a/b/list-c/<external-id>", "value": "foo" }, ]` #### Considerações sobre a proposta 2 - Resolve apenas parte do problema, quando os registros são gerados pelo ERP. - Não resolve o cenário de registros com listas gerados pelo MasterCRM (Ex.: Customer, User, Product); - O exemplo abaixo demonstra que teremos falhas ao executar esta proposta: - Um usuário do MasterCRM cadastra um cliente 'João' com 3 telefones; - Connector lê o cliente 'João' do MasterCRM e os externalIds são enviados vazios (o externalId é gerado pelo ERP ou Connector); - Connector envia o cliente 'João' para o ERP com 1 telefone; - Connector recebe uma atualização do ERP do cliente 'João' com 1 telefone e o *externalId* do telefone populado - Connector tenta usar o *externalId* do telefone do 'João' como chave, porém ao comparar o externalId com o MasterCRM, não dá match pois o externalId do item da lista do MasterCRM está vazio e isto resulta em inserção de informação do ERP e geraria duplicação dos registros no MasterCRM; #### Estimativas - WS: -- --- ## Proposta 3 - A ação UPSERT ignorar provisoriamente campos não informados Nesta proposta, as seguintes modificações seriam necessárias: ### WEALTHSYSTEMS - Revisar todas as APIs de integração para que campos não informados na ação de upsert sejam ignorados, ou seja, não sejam modificados no MasterCRM; ### TOTVS - Revisar os diagramas para que não mande dados de itens de subrecursos na operação de UPSERT sob risco de apagar registros inseridos pelo MasterCRM como telefone, email e endereço; #### Considerações sobre a proposta 3 - Resolve somente a atualização do objeto principal como o exemplo da entidade User com relação a senha; - Não resolve o cenário de atributos em lista como o próprio exemplo de user, onde existe uma lista de filiais ou então o exemplo de Customer com as listas de telefone, email, documentos e endereço; - Ao mudar o comportamento do PUT dentro da opção de upsert acabaria infringindo as diretrizes da RFC: - https://tools.ietf.org/html/rfc7231#page-26 - A successful PUT of a given representation would suggest that a subsequent GET on that same target resource will result in an equivalent representation being sent in a 200 (OK) response - https://tools.ietf.org/html/rfc5789 - The PUT method is already defined to overwrite a resource with a complete new body, and cannot be reused to do partial changes #### Estimativas - WS: --