From 219b33de69fff7ddb9865f60139878c42d677725 Mon Sep 17 00:00:00 2001
From: bayusamudra5502 <bayusamudra.55.02.com@gmail.com>
Date: Fri, 28 Apr 2023 20:38:11 +0700
Subject: [PATCH] fix: logic error on solution

---
 handler/quiz/take.go    |  2 +-
 repository/quiz/impl.go |  4 ++++
 service/quiz/impl.go    | 14 ++++++++++----
 service/quiz/type.go    |  3 ++-
 4 files changed, 17 insertions(+), 6 deletions(-)

diff --git a/handler/quiz/take.go b/handler/quiz/take.go
index 06499ed..553c6ab 100644
--- a/handler/quiz/take.go
+++ b/handler/quiz/take.go
@@ -104,7 +104,7 @@ func (m QuizHandlerImpl) GetQuizSolution(w http.ResponseWriter, r *http.Request)
 		return
 	}
 
-	detail, err := m.GetSolutionQuiz(r.Context(), quizId, user.Email)
+	detail, err := m.GetSolutionQuiz(r.Context(), quizId, user)
 
 	if err != nil {
 		respErr, ok := err.(web.ResponseError)
diff --git a/repository/quiz/impl.go b/repository/quiz/impl.go
index 72ff380..3a6e013 100644
--- a/repository/quiz/impl.go
+++ b/repository/quiz/impl.go
@@ -95,5 +95,9 @@ func (q *QuizRepositoryImpl) GetLastTake(quizId uuid.UUID, userEmail string) (*q
 		Where("quiz_id = ? AND email = ?", quizId, userEmail).
 		Last(result).Error
 
+	if errors.Is(err, gorm.ErrRecordNotFound) {
+		return nil, nil
+	}
+
 	return result, err
 }
diff --git a/service/quiz/impl.go b/service/quiz/impl.go
index 3898cd4..1980c82 100644
--- a/service/quiz/impl.go
+++ b/service/quiz/impl.go
@@ -7,7 +7,9 @@ import (
 
 	"github.com/google/uuid"
 	"gitlab.informatika.org/ocw/ocw-backend/model/domain/quiz"
+	userDomain "gitlab.informatika.org/ocw/ocw-backend/model/domain/user"
 	"gitlab.informatika.org/ocw/ocw-backend/model/web"
+	"gitlab.informatika.org/ocw/ocw-backend/model/web/auth/token"
 	"gitlab.informatika.org/ocw/ocw-backend/provider/storage"
 	quizRepo "gitlab.informatika.org/ocw/ocw-backend/repository/quiz"
 )
@@ -76,26 +78,30 @@ func (q QuizServiceImpl) DoTakeQuiz(ctx context.Context, quizId uuid.UUID, email
 	return result, nil
 }
 
-func (q QuizServiceImpl) GetSolutionQuiz(ctx context.Context, quizId uuid.UUID, email string) (*quiz.QuizDetail, error) {
+func (q QuizServiceImpl) GetSolutionQuiz(ctx context.Context, quizId uuid.UUID, user token.UserClaim) (*quiz.QuizDetail, error) {
 	result, err := q.getQuizDetail(ctx, quizId)
 
 	if err != nil {
 		return nil, err
 	}
 
-	_, err = q.GetLastTake(quizId, email)
+	last, err := q.GetLastTake(quizId, user.Email)
 
 	if err != nil {
 		return nil, err
 	}
 
-	taken, err := q.IsActiveTake(quizId, email)
+	if last == nil && user.Role == userDomain.Student {
+		return nil, web.NewResponseError("user is not allow to access this data", "ERR_NOT_ALLOWED")
+	}
+
+	taken, err := q.IsActiveTake(quizId, user.Email)
 
 	if err != nil {
 		return nil, err
 	}
 
-	if taken {
+	if taken && user.Role == userDomain.Student {
 		return nil, web.NewResponseError("user is not allow to access this data", "ERR_NOT_ALLOWED")
 	}
 
diff --git a/service/quiz/type.go b/service/quiz/type.go
index 7c97e49..04b299c 100644
--- a/service/quiz/type.go
+++ b/service/quiz/type.go
@@ -5,6 +5,7 @@ import (
 
 	"github.com/google/uuid"
 	"gitlab.informatika.org/ocw/ocw-backend/model/domain/quiz"
+	"gitlab.informatika.org/ocw/ocw-backend/model/web/auth/token"
 )
 
 type QuizService interface {
@@ -13,5 +14,5 @@ type QuizService interface {
 
 	DoTakeQuiz(ctx context.Context, quizId uuid.UUID, email string) (*quiz.QuizDetail, error)
 	DoFinishQuiz(ctx context.Context, quizId uuid.UUID, email string, studentAnswer []quiz.Response) (*quiz.QuizTake, error)
-	GetSolutionQuiz(ctx context.Context, quizId uuid.UUID, email string) (*quiz.QuizDetail, error)
+	GetSolutionQuiz(ctx context.Context, quizId uuid.UUID, user token.UserClaim) (*quiz.QuizDetail, error)
 }
-- 
GitLab