Decisão técnica - melhor abordagem para uma rota http que cria um cliente.
Definição de Padrões no Projeto
Me ajudem a tomar uma decisão, meu banco de dados está diagramado assim:
tabela de customers ---- > id name cpf
tabela de emails ---- > email table table_id
ou seja, a tabela de email é morfológica, assim como a de addresses e phones uso o knex para fazer as querys
Caso de uso: Cadastro de Cliente
Quando houver a necessidade de criar um cliente no banco de dados, mas alguns dos dados fornecidos pelo front-end não estejam presentes na tabela "customers", como por exemplo, emails, phones, addresses... precisamos decidir entre:
-
Fazer uma transação no Knex, incluindo todos os dados em todas as tabelas. Se algo der errado, faremos um rollback, ou seja, chamaremos apenas um método do repositório no serviço.
-
Criar apenas o registro do cliente e utilizar o padrão Observer para criar os outros registros, como se fosse um efeito dominó.
Comentário: Uma observação importante em relação à opção 2 é que a requisição HTTP ficará aguardando o Observer criar os registros de email, phone e addresses antes de retornar "true". Isso pode resultar em um tempo de resposta mais longo para o cliente, pois depende da eficiência do processo de criação desses registros adicionais.
outra questão, o observer não deve ser assincrono? tipo enviar um email, enviar um whatsapp para o cliente desejando boas vindas, não é certo esperar o observador executar algo para dar um resposta na req http, certo ?
Desculpe, mas pra que você usaria um Observer para gravar os dados ? Qual a vantagem ?
Primeiro, só tu tens o contexto completo pra tomar uma decisão dessas.
Dito isso...
Como avisaste que estás usando knex, já assumo que estás usando js/ts. Dessa forma, posso presumir que estavas falando sobre "Observables" do RxJS, quando falaste de "observers".
Dado esse micro contexto, eu optaria por fazer uma transaction pelo knex, simplesmente pelo princípio KISS (keep it simple, stupid). Os observables do rxjs são bons pra problemas onde é preciso se aplicar filas, buffers e/ou pipelines. Pra essa situação, onde é preciso esperar que todas as informações sejam inseridas no banco de dados antes de dar uma mensagem de sucesso ou erro, o bom é velho beginTransaction -> inserts -> commit (ou rollback, em caso de erro) é a melhor solução.
Espero ter ajudado 😁