Nuestro equipo está desarrollando una API de back-end usando Node.JS, TypeScript y TypeORM (Oracle), somos relativamente nuevos en el uso de esta pila y tenemos algunas dudas sobre las mejores prácticas para filtrar dinámicamente una gran cantidad de datos.
Considerando una tabla con 20 registros, podemos llevar toda la información a la interfaz y filtrar directamente en el navegador, pero considerando una tabla con 1 millón de registros, supongo que necesitará una función de paginación y el usuario no podrá filtrar directamente en la interfaz
La forma en que trato de resolver este problema es crear un objeto con todos los filtros generados por el usuario y enviarlo a pedido del cuerpo a la API, procesando la información y devolviendo los datos filtrados.
Teniendo en cuenta que estoy usando TypeORM queryBuilder, creé la siguiente función para implementar esta lógica:
interface IFilters { entity: string; key: string; value: string; type: string; } function filterQueryBuilder( query: SelectQueryBuilder<any>, filters: IFilters[] ): SelectQueryBuilder<any> { if (filters.length === 0) { return query; } filters.forEach((filter) => { if (filter.type === "in") { query.andWhere(`${filter.entity}.${filter.key} IN (:...values)`, { values: filter.value, }); } if (filter.type === "like") { query.andWhere(`${filter.entity}.${filter.key} LIKE :value`, { value: `%${filter.value}%`, }); } if (filter.type === "equal") { query.andWhere(`${filter.entity}.${filter.key} = :value`, { value: filter.value, }); } }); return query; }Funciona, pero se ve un poco sucio y la interfaz deberá indicar la entidad, así que creo que esa no es la forma correcta.
¿Puede alguien indicarme una mejor manera de hacerlo? O un artículo con una mejor solución, no es necesario que esté en TypeORM.
Gracias por adelantado