A forma que você está fazendo a verificação de cada parâmetro no seu código pode levar a resultados inesperados quando mais de um parâmetro é passado.
Uma solução seria criar um objeto where com os filtros necessários de acordo com os parâmetros passados, e depois passá-lo para o método findAll. Algo mais ou menos assim:
const where = { wallet_id: id };
if (type !== undefined) {
where.type = type;
}
if (category !== undefined) {
where.category_id = category;
}
if (startDate !== undefined) {
if (endDate !== undefined) {
where.expiry_date = { [Op.and]: [{ [Op.gte]: startDate }, { [Op.lte]: endDate }] };
} else {
where.expiry_date = { [Op.gte]: startDate };
}
}
const filter = {
where,
attributes: ['id', 'type', 'value', 'expiry_date', 'category_id', 'wallet_id'],
};
const reportWallet = await Transaction.findAll(filter);
Dessa forma, apenas os filtros necessários são adicionados ao objeto where, e todos os parâmetros passados serão considerados na consulta.