import "dotenv/config"; import { drizzle } from "drizzle-orm/node-postgres"; import { dane, punkty } from "@/src/db/schema"; import { sql, eq, and, or, isNotNull } from "drizzle-orm"; import { AdvancedQuestion } 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, odp_a: dane.odp_a, odp_b: dane.odp_b, odp_c: dane.odp_c, nazwa_media_pjm_tresc_odp_a: dane.nazwa_media_pjm_tresc_odp_a, nazwa_media_pjm_tresc_odp_b: dane.nazwa_media_pjm_tresc_odp_b, nazwa_media_pjm_tresc_odp_c: dane.nazwa_media_pjm_tresc_odp_c, odp_a_eng: dane.odp_a_eng, odp_b_eng: dane.odp_b_eng, odp_c_eng: dane.odp_c_eng, odp_a_de: dane.odp_a_de, odp_b_de: dane.odp_b_de, odp_c_de: dane.odp_c_de, odp_a_ua: dane.odp_a_ua, odp_b_ua: dane.odp_b_ua, odp_c_ua: dane.odp_c_ua, }) .from(dane) .innerJoin(punkty, eq(dane.nr_pytania, punkty.nr_pytania)) .where( and( isNotNull(dane.odp_a), isNotNull(dane.odp_b), isNotNull(dane.odp_c), isNotNull(dane.odp_a_eng), isNotNull(dane.odp_b_eng), isNotNull(dane.odp_c_eng), isNotNull(dane.odp_a_de), isNotNull(dane.odp_b_de), isNotNull(dane.odp_c_de), 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: AdvancedQuestion[] = []; for (let [key, value] of Object.entries({ 1: 2, 2: 4, 3: 6 })) { const questionsKeyPoints: AdvancedQuestion[] = await getFromDb(key); const chosenRandomQuestions: AdvancedQuestion[] = []; 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); });