Yimaru-BackEnd/db/query/questions.sql

94 lines
2.2 KiB
SQL

-- name: CreateQuestion :one
INSERT INTO questions (
question_text,
question_type,
difficulty_level,
points,
explanation,
tips,
voice_prompt,
sample_answer_voice_prompt,
status
)
VALUES ($1, $2, $3, COALESCE($4, 1), $5, $6, $7, $8, COALESCE($9, 'DRAFT'))
RETURNING *;
-- name: GetQuestionByID :one
SELECT *
FROM questions
WHERE id = $1;
-- name: GetQuestionsByIDs :many
SELECT *
FROM questions
WHERE id = ANY($1::BIGINT[])
ORDER BY id;
-- name: ListQuestions :many
SELECT
COUNT(*) OVER () AS total_count,
q.*
FROM questions q
WHERE status != 'ARCHIVED'
AND ($1::VARCHAR IS NULL OR $1 = '' OR question_type = $1)
AND ($2::VARCHAR IS NULL OR $2 = '' OR difficulty_level = $2)
AND ($3::VARCHAR IS NULL OR $3 = '' OR status = $3)
ORDER BY created_at DESC
LIMIT sqlc.narg('limit')::INT
OFFSET sqlc.narg('offset')::INT;
-- name: SearchQuestions :many
SELECT
COUNT(*) OVER () AS total_count,
q.*
FROM questions q
WHERE status != 'ARCHIVED'
AND question_text ILIKE '%' || $1 || '%'
ORDER BY created_at DESC
LIMIT sqlc.narg('limit')::INT
OFFSET sqlc.narg('offset')::INT;
-- name: UpdateQuestion :exec
UPDATE questions
SET
question_text = COALESCE($1, question_text),
question_type = COALESCE($2, question_type),
difficulty_level = COALESCE($3, difficulty_level),
points = COALESCE($4, points),
explanation = COALESCE($5, explanation),
tips = COALESCE($6, tips),
voice_prompt = COALESCE($7, voice_prompt),
sample_answer_voice_prompt = COALESCE($8, sample_answer_voice_prompt),
status = COALESCE($9, status),
updated_at = CURRENT_TIMESTAMP
WHERE id = $10;
-- name: ArchiveQuestion :exec
UPDATE questions
SET status = 'ARCHIVED', updated_at = CURRENT_TIMESTAMP
WHERE id = $1;
-- name: DeleteQuestion :exec
DELETE FROM questions
WHERE id = $1;
-- name: GetQuestionWithOptions :many
SELECT
q.id as question_id,
q.question_text,
q.question_type,
q.difficulty_level,
q.points,
q.explanation,
q.tips,
q.voice_prompt,
q.status,
qo.id as option_id,
qo.option_text,
qo.option_order,
qo.is_correct
FROM questions q
LEFT JOIN question_options qo ON qo.question_id = q.id
WHERE q.id = $1
ORDER BY qo.option_order;