backend
backend copied to clipboard
feat: ignorar acentos e cedilhas na busca por abrigos
Task: https://trello.com/c/lVvrcFHW
Esse PR adiciona:
- Lógica para ignorar acentos e cedilhas na busca de shelters
- Alguns testes unitários para as novas funções adicionadas
Infelizmente o prisma não disponibiliza uma forma de usar unnaccent
, então esse pr contém uma workaround que puxa os IDs do shelters e utiliza eles na query seguinte, que já existia.
Não acho o melhor dos mundos usar essas 2 queries, mas dessa forma mantemos o trabalho que já existia com type-safety.
Algumas referências que encontrei sobre isso enquanto trabalhava aqui:
- https://github.com/prisma/prisma/issues/6428 -> https://gist.github.com/Cauen/72a03ecbbe5b06ab70bb3b24fe6648ab
- https://github.com/prisma/prisma/issues/16211
Demo testando localmente end-to-end 👇 https://github.com/SOS-RS/backend/assets/82632528/a5a0204d-4ac3-49b2-9cb6-069daa1a7e92
@AndersonCRocha subi as ultimas alterações recomendadas e também uma regra pra caso o unnaccent não encontre resultados. Eu não tinha notado, mas ele estava retornando tudo quando nada era encontrado pra uma string (e.g: "dsaijdsao" retornava tudo, ao invés de nada, que é o esperado e comportamento atual)
testei a branch e está tudo funcionando
porém os testes estão quebrando consegue dar uma olhada @pedrobrun ?
@filipepacheco Feito. Era por conta das configs novas que subiram para corrigir os testes, o meu já tinha e por isso dava erro.
Que loucura esse workaround, negócio era parar de usar o prisma mesmo e usar algo como sequelize, é foda ORM moderno.
Mas parando de só enxer o saco ksksks e propondo uma outra solução alternativa bem mais simples:
- Adicionar um campo de searchName no shelter que em toda criação e update esse campo é atualizado com o mesmo valor do name, porém: tudo minúsculo e sem acento. Isso manteria a query praticamente igual (só trocar name pra searchName) e claro... fazer um contains com a string tratada do usuário (tudo minúsculo e sem acento...)
Ainda é um workaround? Sim. Porém parece que minimiza a complexidade desse código da busca, se em algum momento da vida essa busca rolasse no prisma seria trocar o searchName pra name de volta...
Mais, pra não ter que fazer esse update no searchName no código em todas partes que o name é modificado... poderia ser usado as generated columns do postgres pra fazer isso automaticamente: https://www.postgresql.org/docs/12/ddl-generated-columns.html