433 lines
12 KiB
Go
433 lines
12 KiB
Go
// Code generated by sqlc. DO NOT EDIT.
|
|
// versions:
|
|
// sqlc v1.30.0
|
|
// source: questions.sql
|
|
|
|
package dbgen
|
|
|
|
import (
|
|
"context"
|
|
|
|
"github.com/jackc/pgx/v5/pgtype"
|
|
)
|
|
|
|
const ArchiveQuestion = `-- name: ArchiveQuestion :exec
|
|
UPDATE questions
|
|
SET status = 'ARCHIVED', updated_at = CURRENT_TIMESTAMP
|
|
WHERE id = $1
|
|
`
|
|
|
|
func (q *Queries) ArchiveQuestion(ctx context.Context, id int64) error {
|
|
_, err := q.db.Exec(ctx, ArchiveQuestion, id)
|
|
return err
|
|
}
|
|
|
|
const CreateQuestion = `-- 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 id, question_text, question_type, difficulty_level, points, explanation, tips, voice_prompt, sample_answer_voice_prompt, status, created_at, updated_at, image_url
|
|
`
|
|
|
|
type CreateQuestionParams struct {
|
|
QuestionText string `json:"question_text"`
|
|
QuestionType string `json:"question_type"`
|
|
DifficultyLevel pgtype.Text `json:"difficulty_level"`
|
|
Column4 interface{} `json:"column_4"`
|
|
Explanation pgtype.Text `json:"explanation"`
|
|
Tips pgtype.Text `json:"tips"`
|
|
VoicePrompt pgtype.Text `json:"voice_prompt"`
|
|
SampleAnswerVoicePrompt pgtype.Text `json:"sample_answer_voice_prompt"`
|
|
ImageUrl pgtype.Text `json:"image_url"`
|
|
Column10 interface{} `json:"column_10"`
|
|
}
|
|
|
|
func (q *Queries) CreateQuestion(ctx context.Context, arg CreateQuestionParams) (Question, error) {
|
|
row := q.db.QueryRow(ctx, CreateQuestion,
|
|
arg.QuestionText,
|
|
arg.QuestionType,
|
|
arg.DifficultyLevel,
|
|
arg.Column4,
|
|
arg.Explanation,
|
|
arg.Tips,
|
|
arg.VoicePrompt,
|
|
arg.SampleAnswerVoicePrompt,
|
|
arg.ImageUrl,
|
|
arg.Column10,
|
|
)
|
|
var i Question
|
|
err := row.Scan(
|
|
&i.ID,
|
|
&i.QuestionText,
|
|
&i.QuestionType,
|
|
&i.DifficultyLevel,
|
|
&i.Points,
|
|
&i.Explanation,
|
|
&i.Tips,
|
|
&i.VoicePrompt,
|
|
&i.SampleAnswerVoicePrompt,
|
|
&i.Status,
|
|
&i.CreatedAt,
|
|
&i.UpdatedAt,
|
|
&i.ImageUrl,
|
|
)
|
|
return i, err
|
|
}
|
|
|
|
const DeleteQuestion = `-- name: DeleteQuestion :exec
|
|
DELETE FROM questions
|
|
WHERE id = $1
|
|
`
|
|
|
|
func (q *Queries) DeleteQuestion(ctx context.Context, id int64) error {
|
|
_, err := q.db.Exec(ctx, DeleteQuestion, id)
|
|
return err
|
|
}
|
|
|
|
const GetQuestionByID = `-- name: GetQuestionByID :one
|
|
SELECT id, question_text, question_type, difficulty_level, points, explanation, tips, voice_prompt, sample_answer_voice_prompt, status, created_at, updated_at, image_url
|
|
FROM questions
|
|
WHERE id = $1
|
|
`
|
|
|
|
func (q *Queries) GetQuestionByID(ctx context.Context, id int64) (Question, error) {
|
|
row := q.db.QueryRow(ctx, GetQuestionByID, id)
|
|
var i Question
|
|
err := row.Scan(
|
|
&i.ID,
|
|
&i.QuestionText,
|
|
&i.QuestionType,
|
|
&i.DifficultyLevel,
|
|
&i.Points,
|
|
&i.Explanation,
|
|
&i.Tips,
|
|
&i.VoicePrompt,
|
|
&i.SampleAnswerVoicePrompt,
|
|
&i.Status,
|
|
&i.CreatedAt,
|
|
&i.UpdatedAt,
|
|
&i.ImageUrl,
|
|
)
|
|
return i, err
|
|
}
|
|
|
|
const GetQuestionWithOptions = `-- 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
|
|
`
|
|
|
|
type GetQuestionWithOptionsRow struct {
|
|
QuestionID int64 `json:"question_id"`
|
|
QuestionText string `json:"question_text"`
|
|
QuestionType string `json:"question_type"`
|
|
DifficultyLevel pgtype.Text `json:"difficulty_level"`
|
|
Points int32 `json:"points"`
|
|
Explanation pgtype.Text `json:"explanation"`
|
|
Tips pgtype.Text `json:"tips"`
|
|
VoicePrompt pgtype.Text `json:"voice_prompt"`
|
|
Status string `json:"status"`
|
|
OptionID pgtype.Int8 `json:"option_id"`
|
|
OptionText pgtype.Text `json:"option_text"`
|
|
OptionOrder pgtype.Int4 `json:"option_order"`
|
|
IsCorrect pgtype.Bool `json:"is_correct"`
|
|
}
|
|
|
|
func (q *Queries) GetQuestionWithOptions(ctx context.Context, id int64) ([]GetQuestionWithOptionsRow, error) {
|
|
rows, err := q.db.Query(ctx, GetQuestionWithOptions, id)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
defer rows.Close()
|
|
var items []GetQuestionWithOptionsRow
|
|
for rows.Next() {
|
|
var i GetQuestionWithOptionsRow
|
|
if err := rows.Scan(
|
|
&i.QuestionID,
|
|
&i.QuestionText,
|
|
&i.QuestionType,
|
|
&i.DifficultyLevel,
|
|
&i.Points,
|
|
&i.Explanation,
|
|
&i.Tips,
|
|
&i.VoicePrompt,
|
|
&i.Status,
|
|
&i.OptionID,
|
|
&i.OptionText,
|
|
&i.OptionOrder,
|
|
&i.IsCorrect,
|
|
); err != nil {
|
|
return nil, err
|
|
}
|
|
items = append(items, i)
|
|
}
|
|
if err := rows.Err(); err != nil {
|
|
return nil, err
|
|
}
|
|
return items, nil
|
|
}
|
|
|
|
const GetQuestionsByIDs = `-- name: GetQuestionsByIDs :many
|
|
SELECT id, question_text, question_type, difficulty_level, points, explanation, tips, voice_prompt, sample_answer_voice_prompt, status, created_at, updated_at, image_url
|
|
FROM questions
|
|
WHERE id = ANY($1::BIGINT[])
|
|
ORDER BY id
|
|
`
|
|
|
|
func (q *Queries) GetQuestionsByIDs(ctx context.Context, dollar_1 []int64) ([]Question, error) {
|
|
rows, err := q.db.Query(ctx, GetQuestionsByIDs, dollar_1)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
defer rows.Close()
|
|
var items []Question
|
|
for rows.Next() {
|
|
var i Question
|
|
if err := rows.Scan(
|
|
&i.ID,
|
|
&i.QuestionText,
|
|
&i.QuestionType,
|
|
&i.DifficultyLevel,
|
|
&i.Points,
|
|
&i.Explanation,
|
|
&i.Tips,
|
|
&i.VoicePrompt,
|
|
&i.SampleAnswerVoicePrompt,
|
|
&i.Status,
|
|
&i.CreatedAt,
|
|
&i.UpdatedAt,
|
|
&i.ImageUrl,
|
|
); err != nil {
|
|
return nil, err
|
|
}
|
|
items = append(items, i)
|
|
}
|
|
if err := rows.Err(); err != nil {
|
|
return nil, err
|
|
}
|
|
return items, nil
|
|
}
|
|
|
|
const ListQuestions = `-- name: ListQuestions :many
|
|
SELECT
|
|
COUNT(*) OVER () AS total_count,
|
|
q.id, q.question_text, q.question_type, q.difficulty_level, q.points, q.explanation, q.tips, q.voice_prompt, q.sample_answer_voice_prompt, q.status, q.created_at, q.updated_at, q.image_url
|
|
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 $5::INT
|
|
OFFSET $4::INT
|
|
`
|
|
|
|
type ListQuestionsParams struct {
|
|
Column1 string `json:"column_1"`
|
|
Column2 string `json:"column_2"`
|
|
Column3 string `json:"column_3"`
|
|
Offset pgtype.Int4 `json:"offset"`
|
|
Limit pgtype.Int4 `json:"limit"`
|
|
}
|
|
|
|
type ListQuestionsRow struct {
|
|
TotalCount int64 `json:"total_count"`
|
|
ID int64 `json:"id"`
|
|
QuestionText string `json:"question_text"`
|
|
QuestionType string `json:"question_type"`
|
|
DifficultyLevel pgtype.Text `json:"difficulty_level"`
|
|
Points int32 `json:"points"`
|
|
Explanation pgtype.Text `json:"explanation"`
|
|
Tips pgtype.Text `json:"tips"`
|
|
VoicePrompt pgtype.Text `json:"voice_prompt"`
|
|
SampleAnswerVoicePrompt pgtype.Text `json:"sample_answer_voice_prompt"`
|
|
Status string `json:"status"`
|
|
CreatedAt pgtype.Timestamptz `json:"created_at"`
|
|
UpdatedAt pgtype.Timestamptz `json:"updated_at"`
|
|
ImageUrl pgtype.Text `json:"image_url"`
|
|
}
|
|
|
|
func (q *Queries) ListQuestions(ctx context.Context, arg ListQuestionsParams) ([]ListQuestionsRow, error) {
|
|
rows, err := q.db.Query(ctx, ListQuestions,
|
|
arg.Column1,
|
|
arg.Column2,
|
|
arg.Column3,
|
|
arg.Offset,
|
|
arg.Limit,
|
|
)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
defer rows.Close()
|
|
var items []ListQuestionsRow
|
|
for rows.Next() {
|
|
var i ListQuestionsRow
|
|
if err := rows.Scan(
|
|
&i.TotalCount,
|
|
&i.ID,
|
|
&i.QuestionText,
|
|
&i.QuestionType,
|
|
&i.DifficultyLevel,
|
|
&i.Points,
|
|
&i.Explanation,
|
|
&i.Tips,
|
|
&i.VoicePrompt,
|
|
&i.SampleAnswerVoicePrompt,
|
|
&i.Status,
|
|
&i.CreatedAt,
|
|
&i.UpdatedAt,
|
|
&i.ImageUrl,
|
|
); err != nil {
|
|
return nil, err
|
|
}
|
|
items = append(items, i)
|
|
}
|
|
if err := rows.Err(); err != nil {
|
|
return nil, err
|
|
}
|
|
return items, nil
|
|
}
|
|
|
|
const SearchQuestions = `-- name: SearchQuestions :many
|
|
SELECT
|
|
COUNT(*) OVER () AS total_count,
|
|
q.id, q.question_text, q.question_type, q.difficulty_level, q.points, q.explanation, q.tips, q.voice_prompt, q.sample_answer_voice_prompt, q.status, q.created_at, q.updated_at, q.image_url
|
|
FROM questions q
|
|
WHERE status != 'ARCHIVED'
|
|
AND question_text ILIKE '%' || $1 || '%'
|
|
ORDER BY created_at DESC
|
|
LIMIT $3::INT
|
|
OFFSET $2::INT
|
|
`
|
|
|
|
type SearchQuestionsParams struct {
|
|
Column1 pgtype.Text `json:"column_1"`
|
|
Offset pgtype.Int4 `json:"offset"`
|
|
Limit pgtype.Int4 `json:"limit"`
|
|
}
|
|
|
|
type SearchQuestionsRow struct {
|
|
TotalCount int64 `json:"total_count"`
|
|
ID int64 `json:"id"`
|
|
QuestionText string `json:"question_text"`
|
|
QuestionType string `json:"question_type"`
|
|
DifficultyLevel pgtype.Text `json:"difficulty_level"`
|
|
Points int32 `json:"points"`
|
|
Explanation pgtype.Text `json:"explanation"`
|
|
Tips pgtype.Text `json:"tips"`
|
|
VoicePrompt pgtype.Text `json:"voice_prompt"`
|
|
SampleAnswerVoicePrompt pgtype.Text `json:"sample_answer_voice_prompt"`
|
|
Status string `json:"status"`
|
|
CreatedAt pgtype.Timestamptz `json:"created_at"`
|
|
UpdatedAt pgtype.Timestamptz `json:"updated_at"`
|
|
ImageUrl pgtype.Text `json:"image_url"`
|
|
}
|
|
|
|
func (q *Queries) SearchQuestions(ctx context.Context, arg SearchQuestionsParams) ([]SearchQuestionsRow, error) {
|
|
rows, err := q.db.Query(ctx, SearchQuestions, arg.Column1, arg.Offset, arg.Limit)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
defer rows.Close()
|
|
var items []SearchQuestionsRow
|
|
for rows.Next() {
|
|
var i SearchQuestionsRow
|
|
if err := rows.Scan(
|
|
&i.TotalCount,
|
|
&i.ID,
|
|
&i.QuestionText,
|
|
&i.QuestionType,
|
|
&i.DifficultyLevel,
|
|
&i.Points,
|
|
&i.Explanation,
|
|
&i.Tips,
|
|
&i.VoicePrompt,
|
|
&i.SampleAnswerVoicePrompt,
|
|
&i.Status,
|
|
&i.CreatedAt,
|
|
&i.UpdatedAt,
|
|
&i.ImageUrl,
|
|
); err != nil {
|
|
return nil, err
|
|
}
|
|
items = append(items, i)
|
|
}
|
|
if err := rows.Err(); err != nil {
|
|
return nil, err
|
|
}
|
|
return items, nil
|
|
}
|
|
|
|
const UpdateQuestion = `-- 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
|
|
`
|
|
|
|
type UpdateQuestionParams struct {
|
|
QuestionText string `json:"question_text"`
|
|
QuestionType string `json:"question_type"`
|
|
DifficultyLevel pgtype.Text `json:"difficulty_level"`
|
|
Points int32 `json:"points"`
|
|
Explanation pgtype.Text `json:"explanation"`
|
|
Tips pgtype.Text `json:"tips"`
|
|
VoicePrompt pgtype.Text `json:"voice_prompt"`
|
|
SampleAnswerVoicePrompt pgtype.Text `json:"sample_answer_voice_prompt"`
|
|
ImageUrl pgtype.Text `json:"image_url"`
|
|
Status string `json:"status"`
|
|
ID int64 `json:"id"`
|
|
}
|
|
|
|
func (q *Queries) UpdateQuestion(ctx context.Context, arg UpdateQuestionParams) error {
|
|
_, err := q.db.Exec(ctx, UpdateQuestion,
|
|
arg.QuestionText,
|
|
arg.QuestionType,
|
|
arg.DifficultyLevel,
|
|
arg.Points,
|
|
arg.Explanation,
|
|
arg.Tips,
|
|
arg.VoicePrompt,
|
|
arg.SampleAnswerVoicePrompt,
|
|
arg.ImageUrl,
|
|
arg.Status,
|
|
arg.ID,
|
|
)
|
|
return err
|
|
}
|