package handlers import ( "fmt" "demoon/config" "demoon/internal/database/repos" "demoon/internal/models" "html/template" "log/slog" "net/http" "os" ) // Handlers structure type Handlers struct { cfg config.Config log *slog.Logger repo repos.FullRepo } // NewHandlers constructor func NewHandlers( cfg config.Config, l *slog.Logger, repo repos.FullRepo, ) *Handlers { if l == nil { l = slog.New(slog.NewJSONHandler(os.Stdout, nil)) } h := &Handlers{ cfg: cfg, log: l, repo: repo, } return h } func (h *Handlers) Ping(w http.ResponseWriter, r *http.Request) { h.log.Info("got ping request") w.Write([]byte("pong")) } func (h *Handlers) HandleAnswer(w http.ResponseWriter, r *http.Request) { if err := r.ParseForm(); err != nil { abortWithError(w, "Invalid form data") return } selectedIndex := r.FormValue("selected") questionID := r.FormValue("question_id") h.log.Info("answer received", "selected", selectedIndex, "question_id", questionID) // Get question from database question, err := h.repo.DBGetQuestion(questionID) if err != nil { h.log.Error("failed to get question", "error", err, "question_id", questionID) abortWithError(w, "Question not found") return } var feedback string if selectedIndex == fmt.Sprint(question.CorrectIndex) { feedback = `
Correct! 🎉
` } else { feedback = `
Wrong answer, try again! ❌
` } w.Header().Set("Content-Type", "text/html") w.Write([]byte(feedback)) } func (h *Handlers) MainPage(w http.ResponseWriter, r *http.Request) { tmpl, err := template.ParseGlob("components/*.html") if err != nil { abortWithError(w, err.Error()) return } testQuestion := &models.Question{ ID: 1, Text: "___ du keine Zweifel daran?", Option1: "Haben", Option2: "Hast", Option3: "Hat", Option4: "Habt", CorrectIndex: 1, Requirement: "Choose the correct verb form", Explanation: "Use 'Hast' for 2nd person singular", Status: 0, ExamID: 1, MixedID: 101, } err = tmpl.ExecuteTemplate(w, "main", testQuestion) if err != nil { h.log.Error("failed to render template", "error", err) abortWithError(w, "Failed to render page") } }