90 lines
2.6 KiB
TypeScript
90 lines
2.6 KiB
TypeScript
import "dotenv/config";
|
|
import { drizzle } from "drizzle-orm/node-postgres";
|
|
import { dane, punkty } from "@/src/db/schema";
|
|
import { sql, eq, and, or } from "drizzle-orm";
|
|
import { BasicQuestion } from "~/types";
|
|
import arrayShuffle from "array-shuffle";
|
|
|
|
export default defineEventHandler(async (event) => {
|
|
async function getFromDb(points: number | string) {
|
|
return await db
|
|
.select({
|
|
id: dane.id,
|
|
nr_pytania: dane.nr_pytania,
|
|
pytanie: dane.pytanie,
|
|
poprawna_odp: dane.poprawna_odp,
|
|
media: dane.media,
|
|
kategorie: dane.kategorie,
|
|
nazwa_media_pjm_tresc_pyt: dane.nazwa_media_pjm_tresc_pyt,
|
|
pytanie_eng: dane.pytanie_eng,
|
|
pytanie_de: dane.pytanie_de,
|
|
pytanie_ua: dane.pytanie_ua,
|
|
liczba_pkt: punkty.liczba_pkt,
|
|
})
|
|
.from(dane)
|
|
.innerJoin(punkty, eq(dane.nr_pytania, punkty.nr_pytania))
|
|
.where(
|
|
and(
|
|
or(
|
|
sql`lower(${dane.poprawna_odp})='tak'`,
|
|
sql`lower(${dane.poprawna_odp})='nie'`
|
|
),
|
|
eq(punkty.liczba_pkt, +points)
|
|
)
|
|
);
|
|
}
|
|
const query = getQuery(event);
|
|
const category = query.category;
|
|
const categories = [
|
|
"A",
|
|
"B",
|
|
"C",
|
|
"D",
|
|
"T",
|
|
"AM",
|
|
"A1",
|
|
"A2",
|
|
"B1",
|
|
"C1",
|
|
"D1",
|
|
"PT",
|
|
];
|
|
if (category == null || category == "") {
|
|
throw new Error(
|
|
"category argument has to be string (or not to be defined at all)"
|
|
);
|
|
}
|
|
if (!categories.includes(`${category}`)) {
|
|
throw new Error(`category argument has to be equal to: ${categories}`);
|
|
}
|
|
const db = drizzle(process.env.DATABASE_URL!);
|
|
|
|
const randomizedQuestions: BasicQuestion[] = [];
|
|
|
|
for (let [key, value] of Object.entries({ 1: 4, 2: 6, 3: 10 })) {
|
|
const questionsKeyPoints: BasicQuestion[] = await getFromDb(key);
|
|
const chosenRandomQuestions: BasicQuestion[] = [];
|
|
|
|
const randoms: Array<number> = [];
|
|
for (let j = 0; j < value; j++) {
|
|
let randomized =
|
|
Math.floor(Math.random() * (questionsKeyPoints.length - 1 + 1)) + 0;
|
|
while (randoms.includes(randomized)) {
|
|
randomized =
|
|
Math.floor(Math.random() * (questionsKeyPoints.length - 1 + 1)) + 0;
|
|
}
|
|
randoms.push(randomized);
|
|
if (
|
|
questionsKeyPoints[randomized].kategorie
|
|
.split(",")
|
|
.includes(`${category}`)
|
|
) {
|
|
chosenRandomQuestions.push(questionsKeyPoints[randomized]);
|
|
} else {
|
|
j--;
|
|
}
|
|
}
|
|
chosenRandomQuestions.forEach((q) => randomizedQuestions.push(q));
|
|
}
|
|
return arrayShuffle(randomizedQuestions);
|
|
});
|