export const getRandomQuestions = query({
args: {
quantity: v.number(),
exclusionIds: v.optional(v.array(v.id("templateQuestions"))),
},
handler: async (ctx, args) => {
const { exclusionIds, quantity } = args;
const questions = await ctx.db.query("templateQuestions").collect();
const filteredQuestions = exclusionIds
? questions.filter((q) => !exclusionIds.includes(q._id))
: questions;
// Use current timestamp as seed for reproducible randomness within same millisecond
const seed = Date.now();
const random = mulberry32(seed);
for (let i = filteredQuestions.length - 1; i > 0; i--) {
const j = Math.floor(random() * (i + 1));
// Modern swap syntax
[filteredQuestions[i], filteredQuestions[j]] = [
filteredQuestions[j],
filteredQuestions[i],
];
}
return filteredQuestions.slice(0, quantity);
},
});
export const getRandomQuestions = query({
args: {
quantity: v.number(),
exclusionIds: v.optional(v.array(v.id("templateQuestions"))),
},
handler: async (ctx, args) => {
const { exclusionIds, quantity } = args;
const questions = await ctx.db.query("templateQuestions").collect();
const filteredQuestions = exclusionIds
? questions.filter((q) => !exclusionIds.includes(q._id))
: questions;
// Use current timestamp as seed for reproducible randomness within same millisecond
const seed = Date.now();
const random = mulberry32(seed);
for (let i = filteredQuestions.length - 1; i > 0; i--) {
const j = Math.floor(random() * (i + 1));
// Modern swap syntax
[filteredQuestions[i], filteredQuestions[j]] = [
filteredQuestions[j],
filteredQuestions[i],
];
}
return filteredQuestions.slice(0, quantity);
},
});