mirror of https://github.com/gabehf/trivia-api.git
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
72 lines
1.9 KiB
72 lines
1.9 KiB
package server
|
|
|
|
import (
|
|
"math/rand"
|
|
"strconv"
|
|
|
|
"github.com/labstack/echo/v4"
|
|
)
|
|
|
|
type GetTriviaRequest struct {
|
|
Category string `json:"category" query:"category"`
|
|
}
|
|
type GetTriviaResponse struct {
|
|
QuestionId string `json:"question_id"`
|
|
Question string `json:"question"`
|
|
Category string `json:"category"`
|
|
Format string `json:"format"`
|
|
Choices map[string]string `json:"choices,omitempty"`
|
|
}
|
|
|
|
type ErrorResponse struct {
|
|
Error bool `json:"error"`
|
|
Data map[string]string `json:"data,omitempty"`
|
|
Message string `json:"message,omitempty"`
|
|
}
|
|
|
|
func (s *Server) GetTrivia(e echo.Context) error {
|
|
req := new(GetTriviaRequest)
|
|
e.Bind(req)
|
|
|
|
question, qIndex := s.Q.GetRandomQuestion(req.Category)
|
|
if question == nil {
|
|
return e.JSON(404, &ErrorResponse{
|
|
Error: true,
|
|
Data: map[string]string{
|
|
"category": "category is invalid",
|
|
},
|
|
})
|
|
}
|
|
// randomly order answer choices if the format is multiple choice
|
|
if question.Format == "MultipleChoice" && question.Choices != nil {
|
|
rand.Shuffle(len(question.Choices), func(i, j int) {
|
|
question.Choices[i], question.Choices[j] = question.Choices[j], question.Choices[i]
|
|
})
|
|
// enforce that multiple choice questions must have four choices
|
|
// if not, there must be an error in our data somewhere that we need
|
|
// to fix
|
|
if len(question.Choices) != 4 {
|
|
return e.JSON(500, &ErrorResponse{
|
|
Error: true,
|
|
Message: "internal server error",
|
|
})
|
|
}
|
|
}
|
|
|
|
// build and return response
|
|
tq := new(GetTriviaResponse)
|
|
tq.QuestionId = question.Category + "|" + strconv.Itoa(qIndex)
|
|
tq.Category = question.Category
|
|
tq.Format = question.Format
|
|
tq.Question = question.Question
|
|
if tq.Format == "MultipleChoice" {
|
|
tq.Choices = map[string]string{
|
|
"A": question.Choices[0],
|
|
"B": question.Choices[1],
|
|
"C": question.Choices[2],
|
|
"D": question.Choices[3],
|
|
}
|
|
}
|
|
return e.JSONPretty(200, tq, " ")
|
|
}
|