Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- func (usecase *QuizUsecase) AnswerListQuizTutorial(ctx context.Context, userID, tutorialID int64, packages string, answer []model.AnswerInput) (result model.AnswerResponse, err error) {
- segment := logger.StartSegment(ctx, "QuizUsecase.AnswerListQuizTutorial")
- defer segment.End()
- tutorial, err := usecase.tutorial.GetTutorialByID(ctx, tutorialID)
- if err != nil {
- logger.PrintErrorLog(ctx, err, logger.GetErrorFileLine(), map[string]interface{}{
- "user_id": userID,
- "tutorial_id": tutorialID,
- })
- return result, err
- }
- track, err := usecase.track.GetTrackByID(ctx, tutorial.TrackID)
- if err != nil {
- logger.PrintErrorLog(ctx, err, logger.GetErrorFileLine(), map[string]interface{}{
- "user_id": userID,
- "tutorial_id": tutorialID,
- })
- return result, err
- }
- now := time.Now()
- if track.Tag != nil && *track.Tag == constant.TrackTagKampusMerdeka.String() {
- if tutorial.SelfExerciseDeadline != nil {
- t := time.Unix(*tutorial.SelfExerciseDeadline/1000, 0)
- deadlineButton := t
- deadlineSubmit := deadlineButton.Add(-24 * time.Hour)
- if now.After(deadlineSubmit) && now.Before(deadlineButton) {
- bitpoin, err := usecase.bitpoin.GetBitpoinHistory(ctx, userID, tutorial.ID, constant.LateSubmitWeeklyAssignment.String())
- if err != nil {
- if err.Error() != constant.BitPoinNotFound.Error() {
- logger.PrintErrorLog(ctx, err, logger.GetErrorFileLine(), map[string]interface{}{
- "user_id": userID,
- "tutorial_id": tutorialID,
- })
- return result, err
- }
- }
- if bitpoin.ID == 0 {
- bitpoin, err = usecase.bitpoin.InsertBitpoin(ctx, model.RequestBitpoinHistory{
- UserID: userID,
- TypePoinID: tutorial.ID,
- NoteTypePoinID: "tutorial_id",
- TypePoin: constant.LateSubmitWeeklyAssignment.String(),
- Poin: constant.LateSubmitWeeklyAssignmentPoin.Int64(),
- Reason: "Terlambat Submit Quiz Tutorial Ke " + strconv.FormatInt(int64(tutorial.InOrder), 10),
- })
- if err != nil {
- logger.PrintErrorLog(ctx, err, logger.GetErrorFileLine(), map[string]interface{}{
- "user_id": userID,
- "tutorial_id": tutorialID,
- })
- return result, err
- }
- err = usecase.bitpoin.DeleteBitpoinHistoryAllRedisCache(ctx, userID, tutorial.ID, constant.LateSubmitWeeklyAssignment.String())
- if err != nil {
- logger.PrintErrorLog(ctx, err, logger.GetErrorFileLine(), map[string]interface{}{
- "user_id": userID,
- "tutorial_id": tutorialID,
- })
- return result, err
- }
- }
- } else if now.After(deadlineButton) {
- err := constant.QuizTutorialExceededDeadline
- logger.PrintErrorLog(ctx, err, logger.GetErrorFileLine(), map[string]interface{}{
- "user_id": userID,
- "tutorial_id": tutorialID,
- })
- return result, err
- }
- }
- }
- score := 0
- totalBenar := 0
- totalSalah := 0
- getMinScore, err := usecase.quiz.GetQuizTutorialMinScoreByTutorialID(ctx, tutorial.ID)
- if err != nil {
- logger.PrintErrorLog(ctx, err, logger.GetErrorFileLine(), map[string]interface{}{
- "user_id": userID,
- "tutorial_id": tutorialID,
- })
- return result, err
- }
- checkUserScore, err := usecase.quiz.GetQuizTutorialScoreByUserIDAndTutorialID(ctx, userID, tutorial.ID)
- if err != nil {
- if err.Error() != constant.QuizTutorialScoreNotFound.Error() {
- logger.PrintErrorLog(ctx, err, logger.GetErrorFileLine(), map[string]interface{}{
- "user_id": userID,
- "tutorial_id": tutorialID,
- })
- return result, err
- }
- }
- var countQuizTutorial int
- if track.Tag != nil && *track.Tag == constant.TrackTagKampusMerdeka.String() {
- if packages != "" {
- countQuizTutorial, err = usecase.quiz.CountQuizTutorialByTutorialIDAndPackage(ctx, tutorial.ID, packages)
- if err != nil {
- logger.PrintErrorLog(ctx, err, logger.GetErrorFileLine(), map[string]interface{}{
- "user_id": userID,
- "tutorial_id": tutorialID,
- })
- return result, err
- }
- }
- } else {
- if checkUserScore.ID != 0 && checkUserScore.Package != nil {
- countQuizTutorial, err = usecase.quiz.CountQuizTutorialByTutorialIDAndPackage(ctx, tutorial.ID, *checkUserScore.Package)
- if err != nil {
- logger.PrintErrorLog(ctx, err, logger.GetErrorFileLine(), map[string]interface{}{
- "user_id": userID,
- "tutorial_id": tutorialID,
- })
- return result, err
- }
- }
- }
- scoreOneQuestion := 0
- if countQuizTutorial > 0 {
- scoreOneQuestion = 100 / countQuizTutorial
- }
- minScore := 0
- if getMinScore.ID != 0 && getMinScore.MinScore != 0 {
- minScore = getMinScore.MinScore
- }
- // disini ditambahkan validasi ketika jawaban yang lebih dari 1 itu mengandung salah satu jawaban salah, maka question tersebut di anggap salah
- var correctArr []bool
- var objectAnswers []model.ObjectAnswer = []model.ObjectAnswer{}
- if len(answer) > 0 {
- for _, an := range answer {
- var theAnswers []bool
- var answer model.Answer = model.Answer{}
- var objectAnswer = model.ObjectAnswer{}
- var userAnswerResponse []model.Answer = []model.Answer{}
- var realAnswerResponse []model.Answer = []model.Answer{}
- for _, a := range an.Answers {
- userAnswer, err := usecase.quiz.GetQuizTutorialOptionByID(ctx, a)
- if err != nil {
- logger.PrintErrorLog(ctx, err, logger.GetErrorFileLine(), map[string]interface{}{
- "user_id": userID,
- "tutorial_id": tutorialID,
- })
- return result, err
- }
- answer.OptionID = userAnswer.ID
- answer.OptionDescription = userAnswer.Option
- userAnswerResponse = append(userAnswerResponse, answer)
- checkAnswer, err := usecase.quiz.GetQuizTutorialOptionByIDAndQuizTutorialIDAndStatus(ctx, a, an.QuestionID, 1)
- if err != nil {
- if err.Error() != constant.QuizTutorialOptionNotFound.Error() {
- logger.PrintErrorLog(ctx, err, logger.GetErrorFileLine(), map[string]interface{}{
- "user_id": userID,
- "tutorial_id": tutorialID,
- })
- return result, err
- }
- }
- if checkAnswer.ID != 0 {
- theAnswers = append(theAnswers, true)
- } else {
- theAnswers = append(theAnswers, false)
- }
- }
- var realAnswer bool
- if len(theAnswers) > 0 {
- if util.ContainsBool(theAnswers, false) {
- realAnswer = false
- } else {
- realAnswer = true
- }
- }
- correctArr = append(correctArr, realAnswer)
- realAnswers, err := usecase.quiz.GetListQuizTutorialOptionByQuizTutorialIDAndStatus(ctx, an.QuestionID, 1)
- if err != nil {
- logger.PrintErrorLog(ctx, err, logger.GetErrorFileLine(), map[string]interface{}{
- "user_id": userID,
- "tutorial_id": tutorialID,
- })
- return result, err
- }
- if len(realAnswers) > 0 {
- var real model.Answer = model.Answer{}
- for _, val := range realAnswers {
- real.OptionID = val.ID
- real.OptionDescription = val.Option
- realAnswerResponse = append(realAnswerResponse, real)
- }
- }
- objectAnswer.UserAnswers = userAnswerResponse
- objectAnswer.RealAnswers = realAnswerResponse
- objectAnswers = append(objectAnswers, objectAnswer)
- }
- }
- arrDataAnswers, err := json.Marshal(objectAnswers)
- if err != nil {
- logger.PrintErrorLog(ctx, err, logger.GetErrorFileLine(), map[string]interface{}{
- "user_id": userID,
- "tutorial_id": tutorialID,
- })
- return result, err
- }
- for _, correct := range correctArr {
- if correct {
- score = score + scoreOneQuestion
- totalBenar++
- } else {
- totalSalah++
- }
- }
- condition := "failed"
- status := quiz.StatusQuizGagal
- if score >= minScore {
- condition = "success"
- status = quiz.StatusQuizLulus
- }
- result = model.AnswerResponse{
- Score: score,
- MinScore: minScore,
- TotalBenar: totalBenar,
- TotalSalah: totalSalah,
- Condition: condition,
- }
- if score >= 80 {
- if track.Tag != nil && *track.Tag == constant.TrackTagKampusMerdeka.String() {
- bitpoin, err := usecase.bitpoin.GetBitpoinHistory(ctx, userID, tutorial.ID, constant.WeeklyAssignment.String())
- if err != nil {
- if err.Error() != constant.BitPoinNotFound.Error() {
- logger.PrintErrorLog(ctx, err, logger.GetErrorFileLine(), map[string]interface{}{
- "user_id": userID,
- "tutorial_id": tutorialID,
- })
- return result, err
- }
- }
- if bitpoin.ID == 0 {
- bitpoin, err = usecase.bitpoin.InsertBitpoin(ctx, model.RequestBitpoinHistory{
- UserID: userID,
- TypePoinID: tutorial.ID,
- NoteTypePoinID: "tutorial_id",
- TypePoin: constant.WeeklyAssignment.String(),
- Poin: constant.WeeklyAssignmentPoin.Int64(),
- Reason: "Mendapatkan Nilai Lebih Dari 80 Pada Quiz Tutorial Ke " + strconv.FormatInt(int64(tutorial.InOrder), 10),
- })
- if err != nil {
- logger.PrintErrorLog(ctx, err, logger.GetErrorFileLine(), map[string]interface{}{
- "user_id": userID,
- "tutorial_id": tutorialID,
- })
- return result, err
- }
- err = usecase.bitpoin.DeleteBitpoinHistoryAllRedisCache(ctx, userID, tutorial.ID, constant.WeeklyAssignment.String())
- if err != nil {
- logger.PrintErrorLog(ctx, err, logger.GetErrorFileLine(), map[string]interface{}{
- "user_id": userID,
- "answer": answer,
- })
- return result, err
- }
- }
- }
- }
- if track.Tag != nil && *track.Tag == constant.TrackTagKampusMerdeka.String() {
- checkUserScore, err = usecase.quiz.GetQuizTutorialScoreByUserIDAndTutorialIDAndPackage(ctx, userID, tutorial.ID, packages)
- if err != nil {
- if err.Error() != constant.QuizTutorialScoreNotFound.Error() {
- logger.PrintErrorLog(ctx, err, logger.GetErrorFileLine(), map[string]interface{}{
- "user_id": userID,
- "tutorial_id": tutorialID,
- })
- return result, err
- }
- }
- if checkUserScore.ID != 0 {
- userScoreUpdate := model.UserScore{
- UserID: userID,
- TutorialID: tutorial.ID,
- Score: score,
- Status: status,
- Package: packages,
- }
- if checkUserScore.ID != 0 {
- err := usecase.quiz.UpdateQuizTutorialScoreByTutorialIDAndUserIDAndPackage(ctx, userScoreUpdate)
- if err != nil {
- logger.PrintErrorLog(ctx, err, logger.GetErrorFileLine(), map[string]interface{}{
- "user_id": userID,
- "tutorial_id": tutorialID,
- })
- return result, err
- }
- }
- } else {
- userScoreInsert := model.UserScore{
- UserID: userID,
- TutorialID: tutorial.ID,
- Score: score,
- Status: status,
- Package: packages,
- TrackID: track.ID,
- }
- checkUserScore, err = usecase.quiz.InsertQuizTutorialScore(ctx, userScoreInsert)
- if err != nil {
- logger.PrintErrorLog(ctx, err, logger.GetErrorFileLine(), map[string]interface{}{
- "user_id": userID,
- "tutorial_id": tutorialID,
- })
- return result, err
- }
- }
- } else {
- userScoreUpdate := model.UserScore{
- UserID: userID,
- TutorialID: tutorial.ID,
- Score: score,
- Status: status,
- }
- if checkUserScore.ID != 0 {
- if status != quiz.StatusQuizBelumDikerjakan && score > checkUserScore.Score {
- err := usecase.quiz.UpdateQuizTutorialScoreByTutorialIDAndUserID(ctx, userScoreUpdate)
- if err != nil {
- logger.PrintErrorLog(ctx, err, logger.GetErrorFileLine(), map[string]interface{}{
- "user_id": userID,
- "tutorial_id": tutorialID,
- })
- return result, err
- }
- }
- }
- }
- _, err = usecase.quiz.InsertHistoryQuizTutorialAnswers(ctx, model.HistoryQuizTutorialAnswer{
- UserID: userID,
- TutorialID: tutorialID,
- QuizTutorialScoreID: checkUserScore.ID,
- Answers: arrDataAnswers,
- })
- if err != nil {
- logger.PrintErrorLog(ctx, err, logger.GetErrorFileLine(), map[string]interface{}{
- "user_id": userID,
- "tutorial_id": tutorialID,
- })
- return result, err
- }
- err = usecase.quiz.DeleteQuizTutorialScoreAllRedisCache(ctx, userID, tutorialID, tutorial.TrackID, status)
- if err != nil {
- logger.PrintErrorLog(ctx, err, logger.GetErrorFileLine(), map[string]interface{}{
- "user_id": userID,
- "tutorial_id": tutorialID,
- })
- return result, err
- }
- return result, nil
- }
Advertisement
Add Comment
Please, Sign In to add comment