Ikkitechteam

hadehh

May 9th, 2025
384
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Go 12.16 KB | None | 0 0
  1.  
  2. func (usecase *QuizUsecase) AnswerListQuizTutorial(ctx context.Context, userID, tutorialID int64, packages string, answer []model.AnswerInput) (result model.AnswerResponse, err error) {
  3.     segment := logger.StartSegment(ctx, "QuizUsecase.AnswerListQuizTutorial")
  4.     defer segment.End()
  5.  
  6.     tutorial, err := usecase.tutorial.GetTutorialByID(ctx, tutorialID)
  7.     if err != nil {
  8.         logger.PrintErrorLog(ctx, err, logger.GetErrorFileLine(), map[string]interface{}{
  9.             "user_id":     userID,
  10.             "tutorial_id": tutorialID,
  11.         })
  12.         return result, err
  13.     }
  14.  
  15.     track, err := usecase.track.GetTrackByID(ctx, tutorial.TrackID)
  16.     if err != nil {
  17.         logger.PrintErrorLog(ctx, err, logger.GetErrorFileLine(), map[string]interface{}{
  18.             "user_id":     userID,
  19.             "tutorial_id": tutorialID,
  20.         })
  21.         return result, err
  22.     }
  23.  
  24.     now := time.Now()
  25.     if track.Tag != nil && *track.Tag == constant.TrackTagKampusMerdeka.String() {
  26.         if tutorial.SelfExerciseDeadline != nil {
  27.             t := time.Unix(*tutorial.SelfExerciseDeadline/1000, 0)
  28.  
  29.             deadlineButton := t
  30.             deadlineSubmit := deadlineButton.Add(-24 * time.Hour)
  31.  
  32.             if now.After(deadlineSubmit) && now.Before(deadlineButton) {
  33.                 bitpoin, err := usecase.bitpoin.GetBitpoinHistory(ctx, userID, tutorial.ID, constant.LateSubmitWeeklyAssignment.String())
  34.                 if err != nil {
  35.                     if err.Error() != constant.BitPoinNotFound.Error() {
  36.                         logger.PrintErrorLog(ctx, err, logger.GetErrorFileLine(), map[string]interface{}{
  37.                             "user_id":     userID,
  38.                             "tutorial_id": tutorialID,
  39.                         })
  40.                         return result, err
  41.                     }
  42.                 }
  43.  
  44.                 if bitpoin.ID == 0 {
  45.                     bitpoin, err = usecase.bitpoin.InsertBitpoin(ctx, model.RequestBitpoinHistory{
  46.                         UserID:         userID,
  47.                         TypePoinID:     tutorial.ID,
  48.                         NoteTypePoinID: "tutorial_id",
  49.                         TypePoin:       constant.LateSubmitWeeklyAssignment.String(),
  50.                         Poin:           constant.LateSubmitWeeklyAssignmentPoin.Int64(),
  51.                         Reason:         "Terlambat Submit Quiz Tutorial Ke " + strconv.FormatInt(int64(tutorial.InOrder), 10),
  52.                     })
  53.  
  54.                     if err != nil {
  55.                         logger.PrintErrorLog(ctx, err, logger.GetErrorFileLine(), map[string]interface{}{
  56.                             "user_id":     userID,
  57.                             "tutorial_id": tutorialID,
  58.                         })
  59.                         return result, err
  60.                     }
  61.  
  62.                     err = usecase.bitpoin.DeleteBitpoinHistoryAllRedisCache(ctx, userID, tutorial.ID, constant.LateSubmitWeeklyAssignment.String())
  63.                     if err != nil {
  64.                         logger.PrintErrorLog(ctx, err, logger.GetErrorFileLine(), map[string]interface{}{
  65.                             "user_id":     userID,
  66.                             "tutorial_id": tutorialID,
  67.                         })
  68.                         return result, err
  69.                     }
  70.                 }
  71.             } else if now.After(deadlineButton) {
  72.                 err := constant.QuizTutorialExceededDeadline
  73.                 logger.PrintErrorLog(ctx, err, logger.GetErrorFileLine(), map[string]interface{}{
  74.                     "user_id":     userID,
  75.                     "tutorial_id": tutorialID,
  76.                 })
  77.                 return result, err
  78.             }
  79.         }
  80.     }
  81.  
  82.     score := 0
  83.     totalBenar := 0
  84.     totalSalah := 0
  85.  
  86.     getMinScore, err := usecase.quiz.GetQuizTutorialMinScoreByTutorialID(ctx, tutorial.ID)
  87.     if err != nil {
  88.         logger.PrintErrorLog(ctx, err, logger.GetErrorFileLine(), map[string]interface{}{
  89.             "user_id":     userID,
  90.             "tutorial_id": tutorialID,
  91.         })
  92.         return result, err
  93.     }
  94.  
  95.     checkUserScore, err := usecase.quiz.GetQuizTutorialScoreByUserIDAndTutorialID(ctx, userID, tutorial.ID)
  96.     if err != nil {
  97.         if err.Error() != constant.QuizTutorialScoreNotFound.Error() {
  98.             logger.PrintErrorLog(ctx, err, logger.GetErrorFileLine(), map[string]interface{}{
  99.                 "user_id":     userID,
  100.                 "tutorial_id": tutorialID,
  101.             })
  102.             return result, err
  103.         }
  104.     }
  105.  
  106.     var countQuizTutorial int
  107.     if track.Tag != nil && *track.Tag == constant.TrackTagKampusMerdeka.String() {
  108.         if packages != "" {
  109.             countQuizTutorial, err = usecase.quiz.CountQuizTutorialByTutorialIDAndPackage(ctx, tutorial.ID, packages)
  110.             if err != nil {
  111.                 logger.PrintErrorLog(ctx, err, logger.GetErrorFileLine(), map[string]interface{}{
  112.                     "user_id":     userID,
  113.                     "tutorial_id": tutorialID,
  114.                 })
  115.                 return result, err
  116.             }
  117.         }
  118.     } else {
  119.         if checkUserScore.ID != 0 && checkUserScore.Package != nil {
  120.             countQuizTutorial, err = usecase.quiz.CountQuizTutorialByTutorialIDAndPackage(ctx, tutorial.ID, *checkUserScore.Package)
  121.             if err != nil {
  122.                 logger.PrintErrorLog(ctx, err, logger.GetErrorFileLine(), map[string]interface{}{
  123.                     "user_id":     userID,
  124.                     "tutorial_id": tutorialID,
  125.                 })
  126.                 return result, err
  127.             }
  128.         }
  129.     }
  130.  
  131.     scoreOneQuestion := 0
  132.     if countQuizTutorial > 0 {
  133.         scoreOneQuestion = 100 / countQuizTutorial
  134.     }
  135.  
  136.     minScore := 0
  137.     if getMinScore.ID != 0 && getMinScore.MinScore != 0 {
  138.         minScore = getMinScore.MinScore
  139.     }
  140.  
  141.     // disini ditambahkan validasi ketika jawaban yang lebih dari 1 itu mengandung salah satu jawaban salah, maka question tersebut di anggap salah
  142.     var correctArr []bool
  143.     var objectAnswers []model.ObjectAnswer = []model.ObjectAnswer{}
  144.  
  145.     if len(answer) > 0 {
  146.         for _, an := range answer {
  147.             var theAnswers []bool
  148.             var answer model.Answer = model.Answer{}
  149.             var objectAnswer = model.ObjectAnswer{}
  150.             var userAnswerResponse []model.Answer = []model.Answer{}
  151.             var realAnswerResponse []model.Answer = []model.Answer{}
  152.             for _, a := range an.Answers {
  153.                 userAnswer, err := usecase.quiz.GetQuizTutorialOptionByID(ctx, a)
  154.                 if err != nil {
  155.                     logger.PrintErrorLog(ctx, err, logger.GetErrorFileLine(), map[string]interface{}{
  156.                         "user_id":     userID,
  157.                         "tutorial_id": tutorialID,
  158.                     })
  159.                     return result, err
  160.                 }
  161.  
  162.                 answer.OptionID = userAnswer.ID
  163.                 answer.OptionDescription = userAnswer.Option
  164.                 userAnswerResponse = append(userAnswerResponse, answer)
  165.  
  166.                 checkAnswer, err := usecase.quiz.GetQuizTutorialOptionByIDAndQuizTutorialIDAndStatus(ctx, a, an.QuestionID, 1)
  167.                 if err != nil {
  168.                     if err.Error() != constant.QuizTutorialOptionNotFound.Error() {
  169.                         logger.PrintErrorLog(ctx, err, logger.GetErrorFileLine(), map[string]interface{}{
  170.                             "user_id":     userID,
  171.                             "tutorial_id": tutorialID,
  172.                         })
  173.                         return result, err
  174.                     }
  175.                 }
  176.  
  177.                 if checkAnswer.ID != 0 {
  178.                     theAnswers = append(theAnswers, true)
  179.                 } else {
  180.                     theAnswers = append(theAnswers, false)
  181.                 }
  182.             }
  183.  
  184.             var realAnswer bool
  185.             if len(theAnswers) > 0 {
  186.                 if util.ContainsBool(theAnswers, false) {
  187.                     realAnswer = false
  188.                 } else {
  189.                     realAnswer = true
  190.                 }
  191.             }
  192.  
  193.             correctArr = append(correctArr, realAnswer)
  194.  
  195.             realAnswers, err := usecase.quiz.GetListQuizTutorialOptionByQuizTutorialIDAndStatus(ctx, an.QuestionID, 1)
  196.             if err != nil {
  197.                 logger.PrintErrorLog(ctx, err, logger.GetErrorFileLine(), map[string]interface{}{
  198.                     "user_id":     userID,
  199.                     "tutorial_id": tutorialID,
  200.                 })
  201.                 return result, err
  202.             }
  203.  
  204.             if len(realAnswers) > 0 {
  205.                 var real model.Answer = model.Answer{}
  206.                 for _, val := range realAnswers {
  207.                     real.OptionID = val.ID
  208.                     real.OptionDescription = val.Option
  209.                     realAnswerResponse = append(realAnswerResponse, real)
  210.                 }
  211.             }
  212.  
  213.             objectAnswer.UserAnswers = userAnswerResponse
  214.             objectAnswer.RealAnswers = realAnswerResponse
  215.  
  216.             objectAnswers = append(objectAnswers, objectAnswer)
  217.         }
  218.     }
  219.  
  220.     arrDataAnswers, err := json.Marshal(objectAnswers)
  221.     if err != nil {
  222.         logger.PrintErrorLog(ctx, err, logger.GetErrorFileLine(), map[string]interface{}{
  223.             "user_id":     userID,
  224.             "tutorial_id": tutorialID,
  225.         })
  226.         return result, err
  227.     }
  228.  
  229.     for _, correct := range correctArr {
  230.         if correct {
  231.             score = score + scoreOneQuestion
  232.             totalBenar++
  233.         } else {
  234.             totalSalah++
  235.         }
  236.     }
  237.  
  238.     condition := "failed"
  239.     status := quiz.StatusQuizGagal
  240.  
  241.     if score >= minScore {
  242.         condition = "success"
  243.         status = quiz.StatusQuizLulus
  244.     }
  245.  
  246.     result = model.AnswerResponse{
  247.         Score:      score,
  248.         MinScore:   minScore,
  249.         TotalBenar: totalBenar,
  250.         TotalSalah: totalSalah,
  251.         Condition:  condition,
  252.     }
  253.  
  254.     if score >= 80 {
  255.         if track.Tag != nil && *track.Tag == constant.TrackTagKampusMerdeka.String() {
  256.             bitpoin, err := usecase.bitpoin.GetBitpoinHistory(ctx, userID, tutorial.ID, constant.WeeklyAssignment.String())
  257.             if err != nil {
  258.                 if err.Error() != constant.BitPoinNotFound.Error() {
  259.                     logger.PrintErrorLog(ctx, err, logger.GetErrorFileLine(), map[string]interface{}{
  260.                         "user_id":     userID,
  261.                         "tutorial_id": tutorialID,
  262.                     })
  263.                     return result, err
  264.                 }
  265.             }
  266.  
  267.             if bitpoin.ID == 0 {
  268.                 bitpoin, err = usecase.bitpoin.InsertBitpoin(ctx, model.RequestBitpoinHistory{
  269.                     UserID:         userID,
  270.                     TypePoinID:     tutorial.ID,
  271.                     NoteTypePoinID: "tutorial_id",
  272.                     TypePoin:       constant.WeeklyAssignment.String(),
  273.                     Poin:           constant.WeeklyAssignmentPoin.Int64(),
  274.                     Reason:         "Mendapatkan Nilai Lebih Dari 80 Pada Quiz Tutorial Ke " + strconv.FormatInt(int64(tutorial.InOrder), 10),
  275.                 })
  276.  
  277.                 if err != nil {
  278.                     logger.PrintErrorLog(ctx, err, logger.GetErrorFileLine(), map[string]interface{}{
  279.                         "user_id":     userID,
  280.                         "tutorial_id": tutorialID,
  281.                     })
  282.                     return result, err
  283.                 }
  284.  
  285.                 err = usecase.bitpoin.DeleteBitpoinHistoryAllRedisCache(ctx, userID, tutorial.ID, constant.WeeklyAssignment.String())
  286.                 if err != nil {
  287.                     logger.PrintErrorLog(ctx, err, logger.GetErrorFileLine(), map[string]interface{}{
  288.                         "user_id": userID,
  289.                         "answer":  answer,
  290.                     })
  291.                     return result, err
  292.                 }
  293.             }
  294.         }
  295.     }
  296.  
  297.     if track.Tag != nil && *track.Tag == constant.TrackTagKampusMerdeka.String() {
  298.  
  299.         checkUserScore, err = usecase.quiz.GetQuizTutorialScoreByUserIDAndTutorialIDAndPackage(ctx, userID, tutorial.ID, packages)
  300.         if err != nil {
  301.             if err.Error() != constant.QuizTutorialScoreNotFound.Error() {
  302.                 logger.PrintErrorLog(ctx, err, logger.GetErrorFileLine(), map[string]interface{}{
  303.                     "user_id":     userID,
  304.                     "tutorial_id": tutorialID,
  305.                 })
  306.                 return result, err
  307.             }
  308.         }
  309.  
  310.         if checkUserScore.ID != 0 {
  311.             userScoreUpdate := model.UserScore{
  312.                 UserID:     userID,
  313.                 TutorialID: tutorial.ID,
  314.                 Score:      score,
  315.                 Status:     status,
  316.                 Package:    packages,
  317.             }
  318.  
  319.             if checkUserScore.ID != 0 {
  320.                 err := usecase.quiz.UpdateQuizTutorialScoreByTutorialIDAndUserIDAndPackage(ctx, userScoreUpdate)
  321.                 if err != nil {
  322.                     logger.PrintErrorLog(ctx, err, logger.GetErrorFileLine(), map[string]interface{}{
  323.                         "user_id":     userID,
  324.                         "tutorial_id": tutorialID,
  325.                     })
  326.                     return result, err
  327.                 }
  328.             }
  329.         } else {
  330.             userScoreInsert := model.UserScore{
  331.                 UserID:     userID,
  332.                 TutorialID: tutorial.ID,
  333.                 Score:      score,
  334.                 Status:     status,
  335.                 Package:    packages,
  336.                 TrackID:    track.ID,
  337.             }
  338.  
  339.             checkUserScore, err = usecase.quiz.InsertQuizTutorialScore(ctx, userScoreInsert)
  340.             if err != nil {
  341.                 logger.PrintErrorLog(ctx, err, logger.GetErrorFileLine(), map[string]interface{}{
  342.                     "user_id":     userID,
  343.                     "tutorial_id": tutorialID,
  344.                 })
  345.                 return result, err
  346.             }
  347.         }
  348.  
  349.     } else {
  350.  
  351.         userScoreUpdate := model.UserScore{
  352.             UserID:     userID,
  353.             TutorialID: tutorial.ID,
  354.             Score:      score,
  355.             Status:     status,
  356.         }
  357.  
  358.         if checkUserScore.ID != 0 {
  359.             if status != quiz.StatusQuizBelumDikerjakan && score > checkUserScore.Score {
  360.                 err := usecase.quiz.UpdateQuizTutorialScoreByTutorialIDAndUserID(ctx, userScoreUpdate)
  361.                 if err != nil {
  362.                     logger.PrintErrorLog(ctx, err, logger.GetErrorFileLine(), map[string]interface{}{
  363.                         "user_id":     userID,
  364.                         "tutorial_id": tutorialID,
  365.                     })
  366.                     return result, err
  367.                 }
  368.             }
  369.         }
  370.     }
  371.  
  372.     _, err = usecase.quiz.InsertHistoryQuizTutorialAnswers(ctx, model.HistoryQuizTutorialAnswer{
  373.         UserID:              userID,
  374.         TutorialID:          tutorialID,
  375.         QuizTutorialScoreID: checkUserScore.ID,
  376.         Answers:             arrDataAnswers,
  377.     })
  378.  
  379.     if err != nil {
  380.         logger.PrintErrorLog(ctx, err, logger.GetErrorFileLine(), map[string]interface{}{
  381.             "user_id":     userID,
  382.             "tutorial_id": tutorialID,
  383.         })
  384.         return result, err
  385.     }
  386.  
  387.     err = usecase.quiz.DeleteQuizTutorialScoreAllRedisCache(ctx, userID, tutorialID, tutorial.TrackID, status)
  388.     if err != nil {
  389.         logger.PrintErrorLog(ctx, err, logger.GetErrorFileLine(), map[string]interface{}{
  390.             "user_id":     userID,
  391.             "tutorial_id": tutorialID,
  392.         })
  393.         return result, err
  394.     }
  395.  
  396.     return result, nil
  397. }
Advertisement
Add Comment
Please, Sign In to add comment