96 lines
2.3 KiB
SQL
96 lines
2.3 KiB
SQL
-- name: CreateQuestion :one
|
|
INSERT INTO questions (
|
|
question_text,
|
|
question_type,
|
|
difficulty_level,
|
|
points,
|
|
explanation,
|
|
tips,
|
|
voice_prompt,
|
|
sample_answer_voice_prompt,
|
|
image_url,
|
|
status
|
|
)
|
|
VALUES ($1, $2, $3, COALESCE($4, 1), $5, $6, $7, $8, $9, COALESCE($10, '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),
|
|
image_url = COALESCE($9, image_url),
|
|
status = COALESCE($10, status),
|
|
updated_at = CURRENT_TIMESTAMP
|
|
WHERE id = $11;
|
|
|
|
-- 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;
|