From a905a4a5ffb2e75d151dae03d26aecda608ca19a Mon Sep 17 00:00:00 2001
From: nart4hire <13520129@std.stei.itb.ac.id>
Date: Thu, 4 May 2023 20:57:12 +0700
Subject: [PATCH] fix(quiz): fixed quiz implementation

---
 handler/quiz/get.go     |  2 +-
 repository/quiz/impl.go | 11 ++---------
 repository/quiz/type.go |  2 +-
 service/quiz/impl.go    | 29 ++++++++++++++++++++++-------
 service/quiz/type.go    |  2 +-
 5 files changed, 27 insertions(+), 19 deletions(-)

diff --git a/handler/quiz/get.go b/handler/quiz/get.go
index b88bde2..acf7d55 100644
--- a/handler/quiz/get.go
+++ b/handler/quiz/get.go
@@ -113,7 +113,7 @@ func (m QuizHandlerImpl) GetQuizLink(w http.ResponseWriter, r *http.Request) {
 
 	payload.UpdateQuizToken = token[1]
 	payload.ID = id
-	response, err := m.QuizService.GetQuiz(payload)
+	response, err := m.QuizService.UpdateQuiz(payload)
 
 	if err != nil {
 		respErr, ok := err.(web.ResponseError)
diff --git a/repository/quiz/impl.go b/repository/quiz/impl.go
index 2b7bc2e..8f593bc 100644
--- a/repository/quiz/impl.go
+++ b/repository/quiz/impl.go
@@ -80,15 +80,8 @@ func(q *QuizRepositoryImpl) NewQuiz(quiz quiz.Quiz) error {
 	return q.db.Create(&quiz).Error
 }
 
-func(q *QuizRepositoryImpl) GetQuizPath(quizId uuid.UUID) (string, error) {
-	result := quiz.Quiz{}
-	err := q.db.Where("id = ?", quizId).Find(&result).Error
-
-	if err != nil {
-		return "", err
-	}
-
-	return result.QuizPath, nil
+func(q *QuizRepositoryImpl) UpdateQuiz(quiz quiz.Quiz) error {
+	return q.db.Save(quiz).Error
 }
 
 func(q *QuizRepositoryImpl) Delete(quizId uuid.UUID) error {
diff --git a/repository/quiz/type.go b/repository/quiz/type.go
index c558fc0..72d7e0f 100644
--- a/repository/quiz/type.go
+++ b/repository/quiz/type.go
@@ -12,7 +12,7 @@ type QuizRepository interface {
 	NewTake(quizId uuid.UUID, userEmail string) (uuid.UUID, error)
 	IsUserContributor(id string, email string) (bool, error)
 	NewQuiz(quiz quiz.Quiz) error
-	GetQuizPath(quizId uuid.UUID) (string, error)
+	UpdateQuiz(quiz quiz.Quiz) error
 	Delete(quizId uuid.UUID) error 
 	IsActiveTake(quizId uuid.UUID, userEmail string) (bool, error)
 	GetAllTake(quizId uuid.UUID, userEmail string) ([]quiz.QuizTake, error)
diff --git a/service/quiz/impl.go b/service/quiz/impl.go
index fb53a79..52befa2 100644
--- a/service/quiz/impl.go
+++ b/service/quiz/impl.go
@@ -231,12 +231,12 @@ func (q QuizServiceImpl) NewQuiz(payload model.AddQuizRequestPayload) (*model.Li
 		return &model.LinkResponse{}, err
 	}
 
-	q.QuizRepository.NewQuiz(quiz.Quiz{
+	err = q.QuizRepository.NewQuiz(quiz.Quiz{
 		Id:           uuid.New(),
 		Name:         payload.Name,
 		CourseId:     payload.CourseID,
 		CreatorEmail: claim.Email,
-		QuizPath:     uploadLink,
+		QuizPath:     path,
 	})
 
 	if err != nil {
@@ -248,7 +248,7 @@ func (q QuizServiceImpl) NewQuiz(payload model.AddQuizRequestPayload) (*model.Li
 	return &model.LinkResponse{UploadLink: uploadLink}, nil
 }
 
-func (q QuizServiceImpl) GetQuiz(payload model.UpdateQuizRequestPayload) (*model.LinkResponse, error) {
+func (q QuizServiceImpl) UpdateQuiz(payload model.UpdateQuizRequestPayload) (*model.LinkResponse, error) {
 	// Validate Role
 	claim, err := q.TokenUtil.Validate(payload.UpdateQuizToken, token.Access)
 
@@ -263,21 +263,36 @@ func (q QuizServiceImpl) GetQuiz(payload model.UpdateQuizRequestPayload) (*model
 	}
 
 	// Get Quiz Detail
-	quiz, err := q.QuizRepository.GetQuizDetail(payload.ID)
+	prev, err := q.QuizRepository.GetQuizDetail(payload.ID)
 
 	if err != nil {
 		return &model.LinkResponse{}, err
 	}
 
 	// Validate Ownership
-	if err := q.isQuizContributor(quiz.CourseId, claim.Email); err != nil {
+	if err := q.isQuizContributor(prev.CourseId, claim.Email); err != nil {
+		return &model.LinkResponse{}, err
+	}
+
+	path := fmt.Sprintf("%s/%s.json", q.BucketQuizBasePath, strings.ReplaceAll(uuid.New().String(), "-", ""))
+	uploadLink, err := q.Storage.CreatePutSignedLink(context.Background(), path)
+
+	if err != nil {
+		q.Logger.Error("Some error happened when generate link")
+		q.Logger.Error(err.Error())
 		return &model.LinkResponse{}, err
 	}
 
-	uploadLink, err := q.QuizRepository.GetQuizPath(payload.ID)
+	err = q.QuizRepository.UpdateQuiz(quiz.Quiz{
+		Id:           prev.Id,
+		Name:         prev.Name,
+		CourseId:     prev.CourseId,
+		CreatorEmail: prev.CreatorEmail,
+		QuizPath:     path,
+	})
 
 	if err != nil {
-		q.Logger.Error("Some error happened when retrieving link")
+		q.Logger.Error("Some error happened when inserting new link")
 		q.Logger.Error(err.Error())
 		return &model.LinkResponse{}, err
 	}
diff --git a/service/quiz/type.go b/service/quiz/type.go
index 3f7d2a7..229d724 100644
--- a/service/quiz/type.go
+++ b/service/quiz/type.go
@@ -18,6 +18,6 @@ type QuizService interface {
 	GetSolutionQuiz(ctx context.Context, quizId uuid.UUID, user token.UserClaim) (*quiz.QuizDetail, error)
 	isQuizContributor(courseId string, email string) error
 	NewQuiz(payload model.AddQuizRequestPayload) (*model.LinkResponse, error)
-	GetQuiz(payload model.UpdateQuizRequestPayload) (*model.LinkResponse, error)
+	UpdateQuiz(payload model.UpdateQuizRequestPayload) (*model.LinkResponse, error)
 	DeleteQuiz(payload model.DeleteRequestPayload) error
 }
-- 
GitLab