79 lines
2.2 KiB
TypeScript
79 lines
2.2 KiB
TypeScript
import 'dotenv/config';
|
|
import { drizzle } from 'drizzle-orm/node-postgres';
|
|
import { sql, eq, and } from 'drizzle-orm';
|
|
import arrayShuffle from 'array-shuffle';
|
|
import {
|
|
tasks_advanced,
|
|
questions_advanced,
|
|
categories_db,
|
|
} from '@/src/db/schema';
|
|
import type { AdvancedQuestion } from '~/types';
|
|
|
|
export default defineEventHandler(async (event) => {
|
|
const query = getQuery(event);
|
|
const category = query.category;
|
|
const categories = [
|
|
'A',
|
|
'B',
|
|
'C',
|
|
'D',
|
|
'T',
|
|
'AM',
|
|
'A1',
|
|
'A2',
|
|
'B1',
|
|
'C1',
|
|
'D1',
|
|
'PT',
|
|
];
|
|
if (category === '' || typeof category !== 'string') {
|
|
throw createError({
|
|
statusCode: 400,
|
|
statusMessage:
|
|
'category argument has to be string (or not to be defined at all)',
|
|
});
|
|
}
|
|
if (!categories.includes(`${category.toUpperCase()}`)) {
|
|
throw createError({
|
|
statusCode: 400,
|
|
statusMessage: `category argument has to be equal to: ${categories}`,
|
|
});
|
|
}
|
|
|
|
async function getFromDb(points: number, limit: number, category: string) {
|
|
return await db
|
|
.select({
|
|
id: tasks_advanced.id,
|
|
correct_answer: tasks_advanced.correct_answer,
|
|
media_url: tasks_advanced.media_url,
|
|
weight: tasks_advanced.weight,
|
|
text: questions_advanced.text,
|
|
answer_a: questions_advanced.answer_a,
|
|
answer_b: questions_advanced.answer_b,
|
|
answer_c: questions_advanced.answer_c,
|
|
})
|
|
.from(tasks_advanced)
|
|
.leftJoin(
|
|
questions_advanced,
|
|
eq(questions_advanced.task_id, tasks_advanced.id),
|
|
)
|
|
.leftJoin(categories_db, eq(categories_db.task_id, tasks_advanced.id))
|
|
.where(
|
|
and(
|
|
eq(categories_db.name, category.toUpperCase()),
|
|
eq(questions_advanced.lang, 'PL'),
|
|
eq(tasks_advanced.weight, points),
|
|
),
|
|
)
|
|
.orderBy(sql`RANDOM()`)
|
|
.limit(limit);
|
|
}
|
|
const db = drizzle(process.env.DATABASE_URL!);
|
|
|
|
const randomizedQuestions: AdvancedQuestion[] = [];
|
|
|
|
for (const [key, value] of Object.entries({ 1: 2, 2: 4, 3: 6 })) {
|
|
randomizedQuestions.push(...(await getFromDb(+key, value, category)));
|
|
}
|
|
return arrayShuffle(randomizedQuestions);
|
|
});
|