Solucionado (ver solução)
Solucionado
(ver solução)
4
respostas

[Bug] aula Corrigindo erro ao filtrar por companhias

Estou com meu código em passavens service da seguinte forma:

export class PassagensService {
  apiUrl = environment.apiUrl;

  constructor(private httpclient: HttpClient) {}

  getPassagens(search: DadosDeBusca): Observable<iResultado> {
    const params = this.converterParametrosParaString(search);

    return this.httpclient.get<iResultado>(
      `${this.apiUrl}/passagem/search?${params}`
    );
  }

  converterParametrosParaString(busca: DadosDeBusca) {
    const query = Object.entries(busca)
      .map(([key, value]) => {
        if (!value) {
          return '';
        }
        return `${key}=${value}`;
      })
      .join('&');
    return query;
  }
}

na aula foi passado para implementar esse método do converterParametrosParaString porem, ao clicar no cambo busca, com duas companhias, ele manda pra api o endereço, q nao existe:

http://localhost:8080/passagem/search?pagina=1&porPagina=50&dataIda=2023-10-26T16:48:22.147Z&passageirosAdultos=1&passageirosCriancas=0&passageirosBebes=0&somenteIda=false&origemId=9&destinoId=15&tipo=Econ%C3%B4mica&companhiasId=4&companhiasId=3

ele está passando o companhiasId duas vezes no parametro e entendi q não era pra isso aconteceu... onde estou errando? com uma companhia somente ele passa certinho, como por exemplo:

http://localhost:8080/passagem/search?pagina=1&porPagina=50&dataIda=2023-10-26T16:48:22.147Z&passageirosAdultos=1&passageirosCriancas=0&passageirosBebes=0&somenteIda=false&origemId=9&destinoId=15&tipo=Econ%C3%B4mica&companhiasId=3

Obrigado!

4 respostas

Oi

Isso ocorre devido à maneira como o método converterParametrosParaString está tratando o parâmetro companhiasId. Quando você seleciona duas companhias, ele está gerando duas entradas companhiasId na string de consulta, o que não é o comportamento desejado.

Para resolver esse problema, você pode ajustar o método converterParametrosParaString para tratar o parâmetro companhiasId como um array e criar a string de consulta corretamente. Aqui está como você pode fazer isso:

converterParametrosParaString(busca: DadosDeBusca) {
  const { companhiasId, ...rest } = busca; // Separar companhiasId do restante dos parâmetros

  const query = Object.entries({ ...rest, companhiasId: companhiasId.join(',') }) // Juntar as companhiasId em uma única entrada
    .map(([key, value]) => {
      if (!value) {
        return '';
      }
      return `${key}=${value}`;
    })
    .join('&');
  return query;
}

Assim separando o companhiasId do restante dos parâmetros, juntando os IDs das companhias em uma única entrada (separados por vírgulas) e depois continuando a criar a string de consulta como antes.

Isso deve resolver o problema de passar companhiasId duas vezes na consulta quando você seleciona duas companhias diferentes. Tenha certeza que ao chamar a função converterParametrosParaString, o parâmetro companhiasId seja um array quando houver mais de uma companhia selecionada.

Valeu!

Olá Ariel!

Nosso colega deu uma ótima dica, acredito que ela possa te ajudar!

No mais deixo o código da aula para fins de revisão :

Reforço que em casos de dúvidas, conte sempre com o fórum da comunidade Alura! Bons estudos!

Sucesso

Um grande abraço e até mais!

Oi! tentei resolver dessa forma, mas nao obtive sucesso

  converterParametrosParaString(busca: DadosDeBusca) {
    const { companhiasId, ...rest } = busca; // Separar companhiasId do restante dos parâmetros

    const query = Object.entries({
      ...rest,
      companhiasId: companhiasId?.join(','),
    }) // Juntar as companhiasId em uma única entrada
      .map(([key, value]) => {
        if (!value) {
          return '';
        }
        return `${key}=${value}`;
      })
      .join('&');
    return query;
  }

sobre o seu comentário

 Tenha certeza que ao chamar a função converterParametrosParaString, o parâmetro companhiasId seja um array quando houver mais de uma companhia selecionada.

eu pensei isso também, mas não consegui descobrir como fazer isso, o que me fez não avançar nada do estudo hj :'(

solução!

Oi Victor, tudo bem? agradeço por me enviar o repositório, mas eu já havia dado uma olhada nele ele mostra no fim do código dele, tirando as aulas de ajuste de valor, o seguinte código:

  converterParametroParaString(busca: DadosBusca){
    const query = Object.entries(busca)
      .map( ([key, value]) => {
        if(!value){
          return ''
        }
        return `${key}=${value}`
      })
      .join('&')
      return query
  }

que é o mesmo que o meu que postei na abertura desse post

converterParametrosParaString(busca: DadosDeBusca) {
    const query = Object.entries(busca)
      .map(([key, value]) => {
        if (!value) {
          return '';
        }
        return `${key}=${value}`;
      })
      .join('&');
    return query;
  }

Eu encontrei o meu erro, foi falta de atenção em ter feito um desafio e ter criado um service, por falta de tempo, qnd voltei, nao lembrava o q tinha feito e fiz o desafio mas copiando o código pronto por precisar andar com o projeto acontece q existiam dois lugares que chamavam a função buscar, e a forma q estava fazendo nao era pelo passagens.service.ts

deu tudo certo agora, foi falta de atenção mesmo, como 98% das vezes kkk