Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Habilidade de selecionar um item específico #178

Closed
wants to merge 7 commits into from

Conversation

EduApps-CDG
Copy link

Criei esta feature devido a uma necessidade no trabalho. Agora, é possível selecionar um campo específico na API sem que seja retornado os dados irrelevantes. Reduzindo assim o uso de rede.

É útil em alguns casos, por exemplo se você quer apenas o nome fantasia da empresa.

Veja um exemplo de como obter a unidade federal do cnpj:

https://localhost:8000/45.543.915/0001-81/uf
https://localhost:8000/45543915000181/uf

É a primeira vez em que eu uso Go, então eu recomendo checar meu código fonte.

de API:

https://localhost:8000/45.543.915/0001-81/uf
https://localhost:8000/45543915000181/uf
@EduApps-CDG
Copy link
Author

Adicionalmente, seria bacana se você incluir um link com o meu nome direcionado ao meu github.

@cuducos
Copy link
Owner

cuducos commented Mar 3, 2023

Oi @EduApps-CDG, antes de mais nada, obrigado pela sugestão de ideia e de implementação. Eu tenho algumas questões com essa sugestão. Primeiro, do problema que ela resolve:

Reduzindo assim o uso de rede.

Isso não é um gargalo relevante atualmente e a #167 resolveria isso de forma muito mais abrangente, com testes e mais possibilidades para quem for utilizar a API.

Sobre o PR em si, acho que é teríamos que pensar em algumas coisa antes de prosseguir:

  • fazer um benchmark com teste de carga parater certeza que isso não impacta a disponibilidade da API (velocidade da resposta é mais importante do que uso de rede; é melhor a API continuar disponível gratuitamente do que servir menos bytes)
  • a lógica sugerida poderia ser extraída em uma função auxiliar como func prepareJSON(data string, command string) string
  • o código precisa de testes
  • precisamos de testes automatizados
  • precisamos de documentação

E acho que aí faltaria mãos, já que considero #175 urgente e nem disso estou dando conta : (

ATUALIZADO Com um ponto que esqueci de mencionar:

  • O formato da especificação dos campos… normalmente /qualquer-coisa em APIs REST significa outro recurso, não campos do recurso que está sendo acessado, então gostaria que tu falasse mais sobre:
    • razão de ter escolhido esse formado /uf
    • como ficaria a consulta para mais de um campo (por exemplo, não testei, mas /uf/razao_social funcionaria?
    • cogitou ?fields=uf,razao_social (que estaria mais alinhado ao estilo de API REST)?

@EduApps-CDG
Copy link
Author

EduApps-CDG commented Mar 3, 2023

Olá, vou providenciar os testes e estas outras questões assim que eu chegar em casa. Estamos com a necessidade de retornar dados específicos, então vou dar mais atenção a esta PR quando possível.

Também vou dar uma olhada neste #175.


  • Escolhi "/dados" com base no que já temos para retornar os dados inteiros do cnpj. No lugar de ?cnpj=xxxx temos ``/xxxx`, o que me fez pensar nesta possibilidade. Se você deseja utilizar como parâmetros, posso alterar isso.
  • No caso, se você entrasse em /uf/razao_social, o servidor iria procurar se o campo "/uf/razao_social" existe. Como não existe, será enviado uma mensagem "dados %s do CNPJ %s não encontrados.". Atualmente é possível apenas procurar por profundidade. Por exemplo, se você acessar /000000000/aaa.bbb retornará o parâmetro bbb e seus filhos. Utilizando esta busca por profundidade, seria possível alterar o código para que possamos procurar mais campos no cenário atual.
  • Não utilizei os parâmetros de url pelo motivo explicado acima. Porém, posso mudar isso, se quiser.

@cuducos
Copy link
Owner

cuducos commented Mar 3, 2023

Adicionalmente, seria bacana se você incluir um link com o meu nome direcionado ao meu github.

Não entendi essa parte. Mas enfim… todo mundo que colabora com o projeto automaticamente aparece aqui.

@EduApps-CDG
Copy link
Author

EduApps-CDG commented Mar 3, 2023

Adicionalmente, seria bacana se você incluir um link com o meu nome direcionado ao meu github.

Não entendi essa parte. Mas enfim… todo mundo que colabora com o projeto automaticamente aparece aqui.

Estava pensando em algo mais assim:
image

Mas fica a critério seu

@EduApps-CDG
Copy link
Author

EduApps-CDG commented Mar 3, 2023

Primeiro, do problema que ela resolve

O problema é mais os dados que podem ser considerados desnecessários em alguns casos. Mencionei o uso de rede apenas como um adicional, embora aqui não seja algo muito relevante.

@cuducos
Copy link
Owner

cuducos commented Mar 3, 2023

Um detalhe: o que é o arquivo oryxBuildBinary e como ele contribui com esse PR?

@EduApps-CDG
Copy link
Author

Um detalhe: o que é o arquivo oryxBuildBinary e como ele contribui com esse PR?

Também me pergunto o que seria este arquivo, parece ser algum tipo de artefato. Achei que fazia parte do projeto então não mexi nele.

@cuducos
Copy link
Owner

cuducos commented Mar 3, 2023

Achei que fazia parte do projeto então não mexi nele.

Não faz parte do projeto. Você que o adicionou a esse PR no commit f085363. Isso é um problema: não queremos esse arquivo que não sabemos o que é no histórico do Git do projeto, então apenas git rm oryxBuildBinary não resolve. Você teria que fazer um rebase para alterar esse commit e excluir esse arquivo do histórico, por exemplo.

…os requests"

This reverts commit f085363.

 Changes to be committed:
	modified:   api/api.go
	deleted:    oryxBuildBinary
@EduApps-CDG
Copy link
Author

Só pra avisar, foi modificado o código fonte. Agora para acessar um item específico você pode usar este link:

https://localhost:8000/45.543.915/0001-81?fields=dadoX,dadoY,dadoZ

Também removi o arquivo. Ainda falta eu criar os testes. Em seguida darei uma olhada no outro issue. Irei gerar o commit ainda hoje, se possível.

EduApps-CDG and others added 3 commits March 7, 2023 23:20
 Changes:
	modified:   api/api.go
	modified:   api/api_test.go
Changes:
	modified:   api/api_test.go
api/api.go Outdated
json.Unmarshal([]byte(s), &data)

//if command contains ",", it means that the user wants multiple fields
if strings.Contains(command, ",") {
Copy link
Owner

@cuducos cuducos Mar 7, 2023

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Me pergunto se if é necessário. Tenho a impressão que se o command for razao_social, strings.Split(command) funcionaria igual: https://go.dev/play/p/Yqn_OiOxgM_t

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Tem razão. Vou remover este if.

api/api_test.go Outdated
http.MethodGet,
"/19.131.243/0001-97?fields=uf,cep",
http.StatusOK,
`{"cep":"","uf":""}`,
Copy link
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

O que acha de usar, nesse caso de teste, campos que tem valores em testdata/response.json? Algo como data_inicio_atividade e descricao_porte.

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Claro, incluirei as mudanças!

api/api_test.go Outdated
{
http.MethodGet,
"/19131243000197?fields=xolofompila",
http.StatusNotFound,
Copy link
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Não acho que 404 Not found descreva a situação aqui, pois o recurso existe. O problema é a requisição solicitando coisa que não existe. Acho que é o caso de um 400 Bad request. O que você acha?

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pode ser, na minha cabeça eu estava pensando "o campo não foi encontrado".

@cuducos
Copy link
Owner

cuducos commented Mar 8, 2023

Deixei alguns comentários isolados, depois faço um review mais formal quando tu disser que terminou essa leva de edições. Se quiser um direcionamento no que eu senti nessa leitura:

  • Pode encurtar o nome das variáveis
  • Talvez command não descreva exatamente o dado que temos ali
  • Muitos comentários são desnecessários (por exemplo //iterate over fields logo antes de for _, field := range fields { não adiciona nenhum contexto ao que o código já expressa)
  • Ainda não ouvi nada de ti sobre um ponto importante do meu primeiro comentário:

Reduzindo assim o uso de rede.

Isso não é um gargalo relevante atualmente e a #167 resolveria isso de forma muito mais abrangente, com testes e mais possibilidades para quem for utilizar a API.

Sendo bem pragmático: talvez o esforço aqui desse PR seja melhor aproveitado ajudando @vmesel nessa issue do que implementando algo que potencialmente vai ser descartado em pouco tempo, sabe?

Changes
	modified:   api/api.go
	modified:   api/api_test.go
@EduApps-CDG
Copy link
Author

Vejo isto se tornando um pull request gigante. Mas respondendo sua pergunta, a redução do uso de rede é um adicional.

O problema que ela resolve é que algumas pessoas não precisam de uma lista de todos os sócios da empresa X. Outras querem apenas obter o nome da empresa pelo CNPJ, tornando o retorno de todos os demais dados desnecessários nestes casos.

@cuducos
Copy link
Owner

cuducos commented Mar 8, 2023

a redução do uso de rede é um adicional

Não é isso. Ela é uma redução de uso de rede em troca de um aumento de uso de processamento no servidor. Normalmente uso de rede é mais barato que custo de processamento do servidor. Por isso sugeri o benchmark já no meu primeiro comentário aqui:

fazer um benchmark com teste de carga parater certeza que isso não impacta a disponibilidade da API (velocidade da resposta é mais importante do que uso de rede; é melhor a API continuar disponível gratuitamente do que servir menos bytes)

Assim conseguimos quantificar quanto sacrificamos em termos de processamento para diminuir o uso de rede e entendemos melhor o custo desse adicional.


Outro ponto relativo ao #167, especialmente no comentário sobre compatibilidade: você teve a chance de verificar como a seleção de campos da resposta funcionaria no pREST para a gente não fazer uma migração sem compatibilidade retroativa?


O PR não está gigante em termos de código, acho que o tamanho está super adequado. Estou puxando aqui pontos que acho relevante sobre a contribuição numa conversa que (espero) é produtiva para a gente entender isso melhor.

@cuducos
Copy link
Owner

cuducos commented Jun 14, 2023

Fechado por inatividade. Quando tivermos novidades, aí re-abrimos sem problemas.

@cuducos cuducos closed this Jun 14, 2023
@GuinhoCR

This comment was marked as duplicate.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

3 participants