package quiz_controller import ( "net/http" "strconv" "api.qobiltu.id/middleware" "api.qobiltu.id/models" "api.qobiltu.id/response" "api.qobiltu.id/services" "github.com/gin-gonic/gin" ) type QuizController interface { // === ADMIN === // === USER === UserGetQuiz(ctx *gin.Context) UserAttemptQuiz(ctx *gin.Context) UserGetQuestionQuiz(ctx *gin.Context) UserAnswerQuiz(ctx *gin.Context) UserSubmitQuiz(ctx *gin.Context) UserResultQuiz(ctx *gin.Context) UserReviewQuiz(ctx *gin.Context) } type quizController struct { quizService services.QuizService } func NewQuizController(quizService services.QuizService) QuizController { return &quizController{ quizService: quizService, } } func (c *quizController) UserGetQuiz(ctx *gin.Context) { academyID := ctx.Query("academy_id") academyIDInt, err := strconv.Atoi(academyID) if err != nil { response.HandleError(ctx, err) return } accountData := middleware.GetAccountData(ctx) req := models.UserGetQuizRequest{ AccountID: int64(accountData.UserID), AcademyID: int64(academyIDInt), } res, err := c.quizService.UserGetQuiz(ctx, &req) if err != nil { response.HandleError(ctx, err) return } response.HandleSuccess(ctx, http.StatusOK, "Quiz retrieved successfully", res, nil) } func (c *quizController) UserAttemptQuiz(ctx *gin.Context) { academyID := ctx.Query("academy_id") academyIDInt, err := strconv.Atoi(academyID) if err != nil { response.HandleError(ctx, err) return } accountData := middleware.GetAccountData(ctx) req := models.UserAttemptQuizRequest{ AccountID: int64(accountData.UserID), AcademyID: int64(academyIDInt), } res, err := c.quizService.UserAttemptQuiz(ctx, &req) if err != nil { response.HandleError(ctx, err) return } response.HandleSuccess(ctx, http.StatusOK, "Quiz attempt retrieved successfully", res, nil) } func (c *quizController) UserGetQuestionQuiz(ctx *gin.Context) { academyID := ctx.Query("academy_id") academyIDInt, err := strconv.Atoi(academyID) if err != nil { response.HandleError(ctx, err) return } questionID := ctx.Query("question_id") questionIDInt, err := strconv.Atoi(questionID) if err != nil { response.HandleError(ctx, err) return } attemptID := ctx.Query("attempt_id") attemptIDInt, err := strconv.Atoi(attemptID) if err != nil { response.HandleError(ctx, err) return } accountData := middleware.GetAccountData(ctx) req := models.GetQuestionQuizRequest{ AccountID: int64(accountData.UserID), AcademyID: int64(academyIDInt), QuestionID: int64(questionIDInt), AttemptID: int64(attemptIDInt), } res, err := c.quizService.UserGetQuestionQuiz(ctx, &req) if err != nil { response.HandleError(ctx, err) return } response.HandleSuccess(ctx, http.StatusOK, "Question retrieved successfully", res, nil) } func (c *quizController) UserAnswerQuiz(ctx *gin.Context) { var req models.AnswerQuizRequest if err := ctx.ShouldBindJSON(&req); err != nil { response.HandleError(ctx, err) return } academyID := ctx.Query("academy_id") academyIDInt, err := strconv.Atoi(academyID) if err != nil { response.HandleError(ctx, err) return } attemptID := ctx.Query("attempt_id") attemptIDInt, err := strconv.Atoi(attemptID) if err != nil { response.HandleError(ctx, err) return } accountData := middleware.GetAccountData(ctx) req.AccountID = int64(accountData.UserID) req.AcademyID = int64(academyIDInt) req.AttemptID = int64(attemptIDInt) res, err := c.quizService.UserAnswerQuiz(ctx, &req) if err != nil { response.HandleError(ctx, err) return } response.HandleSuccess(ctx, http.StatusOK, "Question retrieved successfully", res, nil) } func (c *quizController) UserSubmitQuiz(ctx *gin.Context) { academyID := ctx.Query("academy_id") academyIDInt, err := strconv.Atoi(academyID) if err != nil { response.HandleError(ctx, err) return } attemptID := ctx.Query("attempt_id") attemptIDInt, err := strconv.Atoi(attemptID) if err != nil { response.HandleError(ctx, err) return } accountData := middleware.GetAccountData(ctx) req := models.SubmitQuizRequest{ AccountID: int64(accountData.UserID), AcademyID: int64(academyIDInt), AttemptID: int64(attemptIDInt), } res, err := c.quizService.UserSubmitQuiz(ctx, &req) if err != nil { response.HandleError(ctx, err) return } response.HandleSuccess(ctx, http.StatusOK, "Quiz submitted successfully", res, nil) } func (c *quizController) UserResultQuiz(ctx *gin.Context) { academyID := ctx.Query("academy_id") academyIDInt, err := strconv.Atoi(academyID) if err != nil { response.HandleError(ctx, err) return } accountData := middleware.GetAccountData(ctx) req := models.ResultQuizRequest{ AccountID: int64(accountData.UserID), AcademyID: int64(academyIDInt), } res, err := c.quizService.UserResultQuiz(ctx, &req) if err != nil { response.HandleError(ctx, err) return } response.HandleSuccess(ctx, http.StatusOK, "Quiz submitted successfully", res, nil) } func (c *quizController) UserReviewQuiz(ctx *gin.Context) { academyID := ctx.Query("academy_id") academyIDInt, err := strconv.Atoi(academyID) if err != nil { response.HandleError(ctx, err) return } accountData := middleware.GetAccountData(ctx) req := models.ReviewQuizRequest{ AccountID: int64(accountData.UserID), AcademyID: int64(academyIDInt), } res, err := c.quizService.UserReviewQuiz(ctx, &req) if err != nil { response.HandleError(ctx, err) return } response.HandleSuccess(ctx, http.StatusOK, "Quiz review retrieved successfully", res.Reviews, nil) }