GET question sets API fix

This commit is contained in:
Yared Yemane 2026-04-28 09:41:09 -07:00
parent 87bf2ed609
commit 8c116f4a0b
2 changed files with 68 additions and 2 deletions

View File

@ -607,6 +607,19 @@ func (s *Store) GetQuestionSetsByType(ctx context.Context, setType string, limit
UpdatedAt: timePtr(r.UpdatedAt),
}
}
// COUNT(*) OVER() only appears when at least one row is returned.
// For out-of-range offsets, fetch total count explicitly so pagination metadata stays correct.
if len(rows) == 0 {
err = s.conn.QueryRow(
ctx,
`SELECT COUNT(*) FROM question_sets WHERE set_type = $1 AND status != 'ARCHIVED'`,
setType,
).Scan(&totalCount)
if err != nil {
return nil, 0, err
}
}
return result, totalCount, nil
}

View File

@ -1120,11 +1120,64 @@ func (h *Handler) GetQuestionsInSet(c *fiber.Ctx) error {
})
}
itemResponses := questionSetItemsToRes(items)
questionResponses := make([]questionRes, 0, len(items))
for _, item := range items {
question, err := h.questionsSvc.GetQuestionWithDetails(c.Context(), item.QuestionID)
if err != nil {
return c.Status(fiber.StatusInternalServerError).JSON(domain.ErrorResponse{
Message: "Failed to get question details",
Error: err.Error(),
})
}
options := make([]optionRes, 0, len(question.Options))
for _, opt := range question.Options {
options = append(options, optionRes{
ID: opt.ID,
OptionText: opt.OptionText,
OptionOrder: opt.OptionOrder,
IsCorrect: opt.IsCorrect,
})
}
shortAnswers := make([]shortAnswerRes, 0, len(question.ShortAnswers))
for _, sa := range question.ShortAnswers {
shortAnswers = append(shortAnswers, shortAnswerRes{
ID: sa.ID,
AcceptableAnswer: sa.AcceptableAnswer,
MatchType: sa.MatchType,
})
}
var audioCorrectAnswerText *string
if question.AudioAnswer != nil {
audioCorrectAnswerText = &question.AudioAnswer.CorrectAnswerText
}
questionResponses = append(questionResponses, questionRes{
ID: question.ID,
QuestionText: question.QuestionText,
QuestionType: question.QuestionType,
DifficultyLevel: question.DifficultyLevel,
Points: question.Points,
Explanation: question.Explanation,
Tips: question.Tips,
VoicePrompt: question.VoicePrompt,
SampleAnswerVoicePrompt: question.SampleAnswerVoicePrompt,
ImageURL: question.ImageURL,
Status: question.Status,
CreatedAt: question.CreatedAt.String(),
Options: options,
ShortAnswers: shortAnswers,
AudioCorrectAnswerText: audioCorrectAnswerText,
})
}
return c.JSON(domain.Response{
Message: "Questions retrieved successfully",
Data: itemResponses,
Success: true,
StatusCode: fiber.StatusOK,
Data: questionResponses,
})
}